영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/image_processing_with_matlab.pdf ·...

102
*영상처리란 무엇인가? 영상처리는 그림을 다루는 학문이다. 이것은 많은 어플리케이션에서 사용되는 넓은 역의 기술들에 대한 총칭이다. 에에 포함되는 기술들은 영상을 더욱 높은 질의 영상으로 들거나 일그러뜨리고, 영상의 두드러진 특징들을 더욱 두드러지게하고, 다른 영상의 일부분 으로부터 새로운 영상을 만들어 내고, 영상을 회득하는 동안이나 획득한 후에 변질된 영상 복원시키는 등의 기술들이다. 영상처리를 흔히 컴퓨터 그래픽스와 혼동한다. 컴퓨터 그래픽스와 영상처리는 거의 유사 기술이다. 영상처리와 컴퓨터 그래픽스가 서로 공통된 개념들을 사용하지만 그들은 서로 다른 연구 분야로 일컬어진다. 컴퓨터 그래픽스는 합성 영상을 생성하는 것이다. 영상처리는 이미 획득하였거나 만들어진 영상을 조작하는 것이다. 컴퓨터 그래픽스는 2 차원과 3 차원 물체를 가지고 작업을 한다. 영상처리에서 전형적으로 다루어지는 것은 흔히 2 차원 데이터 제한된다. 의학 진단 산업 분야에서의 어플리케이션들은 3 차원 데이터에 대한 영상처리 수행한다. 볼륨 가시화(Volume visualization)모핑(morphing)같은 몇몇 기술의 출현으 컴퓨터 그래픽스와 영상처리를 구분하는 선이 더욱 불분명해졌다. 영상처리 알고리즘들을 분류하는 기본적인 분류방법은 가지가 있는데, 포인트 처리, 역처리, 기하학적 처리, 그리고 프레임 처리이다. 포인트 처리는 화소의 원래 값이나 위치에 기반한 화소값을 변경한다. 영역처리는 화소의 원래 값과 이웃하는 화소의 값을 기반으로 하여 화소값을 변경한다. 기하학적 처리는 화소들의 위치나 배열을 변화시킨다. 프레임 처리 이상의 영상들에 대한 연산을 기반으로하여 화소값들을 생성한다. 컴퓨터 가격은 점차적으로 감소하고 CPU 그래픽 성능은 증가하면서 영상처리에 대한 접근 가능성이 증가하였다. 결과 예술가에서부터 내과 의사에 이르기까지 다양한 분야의 전문가들이 영상처리 기술에 대해 알지는 못해도 기술들을 사용하고자 시도하고 있다. *영상처리 응용분야 과학과 우주 초기의 영상처리는 과학자들만 사용하였다. 과학자들은 주로 우주 연구 단체나 국방 성의 요원이었다. 우주 개발 프로그램들은 많은 영상처리 기술들을 낳게 하였다. 이러한 술들은 태양계를 성공적으로 탐험하게 하는 매우 중요한 요인이되었다. 여러 가지 우주개발 프로그램에 의해, 우주 밖에서 촬영한 영상이 지구로 연소된 데이터 스트림으로 전송할 있음을 증명해 주었다. 데이터 전송은 흔히 정전기와 태양의 섬광에 의해 차단되며, 영상의 질이 떨어지게 된다. 재구성과 필터링 기술들은 잡음을 제거하고

Upload: others

Post on 16-Nov-2019

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

*영상처리란 무엇인가?

영상처리는 그림을 다루는 학문이다. 이것은 수 많은 어플리케이션에서 사용되는 넓은 영

역의 기술들에 대한 총칭이다. 에에 포함되는 기술들은 영상을 더욱 높은 질의 영상으로 만

들거나 일그러뜨리고, 영상의 두드러진 특징들을 더욱 두드러지게하고, 다른 영상의 일부분

으로부터 새로운 영상을 만들어 내고, 영상을 회득하는 동안이나 획득한 후에 변질된 영상

을 복원시키는 등의 기술들이다.

영상처리를 흔히 컴퓨터 그래픽스와 혼동한다. 컴퓨터 그래픽스와 영상처리는 거의 유사

한 기술이다. 영상처리와 컴퓨터 그래픽스가 서로 공통된 개념들을 사용하지만 그들은 서로

다른 연구 분야로 일컬어진다. 컴퓨터 그래픽스는 합성 영상을 생성하는 것이다. 영상처리는

이미 획득하였거나 만들어진 영상을 조작하는 것이다. 컴퓨터 그래픽스는 2 차원과 3 차원

물체를 가지고 작업을 한다. 영상처리에서 전형적으로 다루어지는 것은 흔히 2 차원 데이터

로 제한된다. 의학 진단 산업 분야에서의 어플리케이션들은 3 차원 데이터에 대한 영상처리

를 수행한다. 볼륨 가시화(Volume visualization)와 모핑(morphing)과 같은 몇몇 기술의 출현으

로 컴퓨터 그래픽스와 영상처리를 구분하는 선이 더욱 불분명해졌다.

영상처리 알고리즘들을 분류하는 기본적인 분류방법은 제 가지가 있는데, 포인트 처리, 영

역처리, 기하학적 처리, 그리고 프레임 처리이다. 포인트 처리는 화소의 원래 값이나 위치에

기반한 화소값을 변경한다. 영역처리는 화소의 원래 값과 이웃하는 화소의 값을 기반으로

하여 화소값을 변경한다. 기하학적 처리는 화소들의 위치나 배열을 변화시킨다. 프레임 처리

는 두 개 이상의 영상들에 대한 연산을 기반으로하여 화소값들을 생성한다.

컴퓨터 가격은 점차적으로 감소하고 CPU 와 그래픽 성능은 증가하면서 영상처리에 대한

접근 가능성이 증가하였다. 그 결과 예술가에서부터 내과 의사에 이르기까지 다양한 분야의

전문가들이 영상처리 기술에 대해 알지는 못해도 이 기술들을 사용하고자 시도하고 있다.

*영상처리 응용분야

과학과 우주

초기의 영상처리는 과학자들만 사용하였다. 이 과학자들은 주로 우주 연구 단체나 국방

성의 요원이었다. 우주 개발 프로그램들은 많은 영상처리 기술들을 낳게 하였다. 이러한 기

술들은 태양계를 성공적으로 탐험하게 하는 매우 중요한 요인이되었다.

여러 가지 우주개발 프로그램에 의해, 우주 밖에서 촬영한 영상이 지구로 연소된 데이터

스트림으로 전송할 수 있음을 증명해 주었다. 데이터 전송은 흔히 정전기와 태양의 섬광에

의해 차단되며, 영상의 질이 떨어지게 된다. 재구성과 필터링 기술들은 잡음을 제거하고 영

Page 2: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중 몇 가지는 그 이전에도 사용

되었으며 전자 현미경 검사, 지진 관측, 의료진단과 같은 많은 분야에서 지금도 사용하고 있

다.

영 화

헐리우드가 특수 효과를 내고 프레임을 수정하기 위해 컴퓨터를 사용한 실험을 하고 있

기는 하지만, 필름을 만드는 데 컴퓨터를 사용하는 일은 최근 몇 년 동안에 급속도로 증가

하고 있다. 컴퓨터들은 어떤 종류의 영상을 다른 영상으로 바꾸고, 프레임에서 원하지 않는

물체가 있으면 제거하고, 다른 프레임의 부분, 부분들을 합성하여 새로운 프레임을 생성한다.

영화 "The Babe"에서, 컴퓨터 효과로 오른손 잡이인 John Goodman을 왼손잡이로 만들었고,

영상 합성으로 Babe Ruth 가 경기하고 있는 경기장의 관람석에 한 층을 더 올렸다. 비록 그

영화의 필름에는 단층의 스타디움에 1,000 명의 관객만이 있지만, 영상처리를 통하여 더욱

많은 관객이 있는 것으로 보이게 한 것이다.

영상합성 영상 합성은 영화 "Forrest Gump"에서도 사용되었다. 주인공이 많은 미국의 대통령

들이 등장하는 다양한 역사 필름 조각들에 추가되었다. 영상 합성은 또한 이 영화에서 소규

모 단위의 관중들을 계속해서 복사하는 방법으로 많은 관중을 만드는 데 사용하였다.

영화들은 흔히 보는 각도에 따라 달라 보이며 나중에 디지털 기술에 의해 도욱 보기 좋게

정리된다. 보기 흉한 전선줄이나, 얼굴의 잔주름 또는 원하지 않는 구경꾼들을 프레임에서

제거할 수 있다. 영화 "Terminator 2"에서 오토바이가 안전하게 떨어지도록 하기위해 줄을 매

달았다가, 나중에 컴퓨터로 그 줄을 제거 하였다.

모핑(Morphing) 헐리우드에서 새롭게 사용된 영상처리 기법중의 하나가 모핑이다. 모핑은 변

형(metamorphosis)이라는 단어에서 유래된 것인데, 하나의 영상을 다른 영상으로 변화시키는

것이다. 모핑은 "Terminator 2"에서 합금체 로봇인 T-1000 의 외형 변화에서 사용되었고, 마이

클 잭슨의 뮤직비디오 "Black or White"에서 댄서와 마이클 잭슨의 얼굴을 변화시키는데 사용

되었다.

영상 워핑 영상 워핑은 기괴한 변형에 항상 사용되는 것은 아니다. 이것은 배우를 더욱 키

가 크게 하거나, 작게 하거나 아니면 홀쭉하게 하거나, 뚱뚱하게 만들어서 실생활을 변경시

키는 데 사용할 수 있다. 이것은 코의 크기를 줄이거나 다른 물리적인 특징들을 변겨시킬

수 있다.

영상 워핑은 인공위성이나 다른 우주계획의 일원으로부터 보내져 온 일그러진 영상을 올

바르게 만드는 데 처음 사용하였다. 일그러짐 현상은 렌즈의 변형이나 평평한 판에 의해서

보다는 구체 모양으로 된 다른 부품들 때문에 발생한다. 기하학적 변형에 의한 영상 워핑은

Page 3: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

이러한 일그러짐을 복구시키는 데 사용되며, 척도와 우주공간의 관계를 좀더 정확히 판단하

도록 해준다.

영상 워핑은 행방불명된 아이를 찾는데도 사용된다. 미아와 유괴된 아동들을 위한 기구인

The National Center for Missing and Exploited Children은 아이들이 사라진 이후에 아이들의 연령

에 맞는 사진을 만들어 주는 소프트웨어를 사용한다. 그 사진은 그 아이의 사진에 그 아이

보다 나이가 많은 형제나 친척의 사진을 합병시키고, 그 나이에 맞는 머리카락과 옷을 입혀

합성된다. 이러한 기술은 유괴된 후 몇 년이 지나도 그 아이의 현재 모습을 닮은 사진을 센

터가 제공할 수 있게 해준다.

종이없는 사무실

요즘의 경향은 종이없는 사무실을 추구하고 있다. 모든 문서들이 디지털화되어 저장되

어있고 CRT 나 다른 출력 장치로 복원하여 볼 수 있게 되는 것이 가장 이상적이다. 이것은

Document Image Processing(DIP;문서 영상처리)에 의해 이루어 진다. DIP 시스템들은 문서들을

ASCII 텍스트로 보관할 수 있다. 이것은 문서들의 텍스트에 가지고 있는 특별한 내용을 찾

을 수 있게 해준다. 이렇게 하기 위해서는 하얀 문서에 검은색으로 칠해져 있는 것을 텍스

트로 변환하여야 한다. 이러한 일은 광학 문자 인식(OCR;Optical Character Recognition)으로 이

루어 질 수 있다. OCR은 영상처리로 분류되지는 않지만 영상 분석이라는 유사한 분야의 과

학이다.

수천개의 문서들을 보관해야만 하는 많은 회사들은 DIP 를 사용하고 있다. 은행들은 처리

된 영수증, 대부 관계 업무 그리고 구좌의 대차표를 기록하기 위해 DIP 를 사용하고 있다.

그리고 행정 기관과 병원에서도 수많은 증명서와 양식들 그리고 의료 영상들을 보관하기 위

해 DIP를 사용한다.

의료 사업

의료 산업은 영상처리를 오래전부터 사용해왔다. 여기서 다루는 영상으로 X-ray 와 초음

파 영상등이 포함된다. Computed Tomography 또는 Computer-Aided Tomography(CT 또는 CAT)

는 1980연대 까지는 널리 사용되지 않았었다. 의사들은 척추, 머리,그리고 골반과 같은 뼈의

상태를 진단하기 위해 CT 스캐너를 사용하였다. 자기 공명 영상기술(MRI;Magnetic Resource

Imaging)은 척추와 심장과 같은 얇은 조직을 볼 수 있게 해주었다. Positron Emission

Tomography(PET)는 신체의 화학적,물리적 처리 과정을 측정하게 해준다. Magnetic Source

Imaging(MSI)은 생각하고 운동하는 동안 두뇌에서 발생하는 극소의 전기적 신호를 감시하는

것이다.

이 모든 영상들이 컴퓨터에 저장되어 있으면 의사들은 흥미가 있는 부분을 집중하여 볼

수 있도록 확장과 조작을 할 수 있다. 많은 의료 영상은 삼차원으로 만들어 질 수 있다. 이

로써 의사들은 스크린에 나타나는 영상의 특정 부분들을 연구를 위해 회전 시키고 변형시킬

수 있게 된다. 이러한 의료 자료의 애니메이션 기술을 가미한 재구성 기술은 내과 의사들과

Page 4: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

외과 의사들에게 크게 가치가 있는 것이다.

의료 영상을 디지털화하는 또 다른 장점은 의사들이 환자를 오랫동안 지속적으로 진단할

수 있게 해준다는 것이다. 영상 데이터는 원거리에 있어도 수초 안에 의사에게 전송될 수

있다. 환자들은 그들이 살고 있던 지역 병원이 아니더라도 진단을 받을 수 있다.

다른 영상처리 응용분야들

사진사, 광고 대리업을 하는 사람 그리고 출판가와 같은 사람들은 영상을 만들어내고,

질을 향상 시키고, 색깔을 조작하는 등의 일을 하기 위해 영상 처리 분야에 눈을 돌리고

있다. 영상 합성으로 기존의 갖가지 영상들을 융합하여 새로운 영상을 만들어 낼 수 있다.

광고 사업 분야에서 사진 수정 기술은 사진 작가들에게 옛 사진에 긁힌 자국을 넣고 페이

딩(fading) 효과를 내는 등의 일을 할 수 있게한다. 지도 제작자들또한 그들의 업무에 영상처

리 기술을 사용하고 있다. 초기 영상 지도 데이터는 인공위성으로부터 얻어진다. 디지털 영

상 워핑 기술은 방사선에 의한 일그러 짐이나 지구의 구면 특성에 의한 일그러짐을 보정하

여 지도 좌표 시스템에 맞추는 데 사용된다. 또한 디지털화하여 영상의 질을 향상 시킨다.

원격 감지 기술(인공위성으로부터 영상 획득)과 영상처리 기술의 결합은 모든 분야에서 사

용되고 있다. 생태학자들은 이기술을 석유 누출에 의해 미치는 위험을 연구하며, 해양 연구

가들은 연안 오염이 어류에 미치는 영향을 감시하는 데 사용한다.

머신 비젼(Machine Vision)

머신 비젼은 영상 처리와 영상 분석을 함께 사용하는, 현재 급부상하고 있는 기술이다.

머신 비젼은 획득된 영상 데이터가 제조 공정을 제어할 수 있도록 처리하는 산업 기술이다.

이 기술의 초기의 용도는 검사와 조립 라인들 특히 자동차 조립 라인들을 자동화하는 것이

다. 산업 자동화 환경에서 영상 처리 기술을 도입한 최초의 가장 성공한 어플리케이션은

PCB(인쇄 회로 기판)의 결함 검사 기계였다. 머신 비젼은 오늘날에 들어서 철저한 검사를

요하는 처리 공정이 필요한 반도체 제조에까지 확장 되었다. 머신 비젼 기술들은 제조 공정

에서 발생하는 결함들을 검사하고, 칩을 정돈하고, 철저하게 형판 검사를 하는데 사용되고

있다.

머신 비젼은 많은 조립 라인들을 컴퓨터에 의해 조정하는 기능만을 지닌 검사에만 한정

되지 않는다. 포드 자동차 회사는 54 개의 가능한 문짝을 식별하고 표시를 다는 데, 조립 라

인의 인부들을 머신 비젼 시스템으로 교체하였다. 문짝들은 모양과 색깔에 의해 구분되었다.

수작업으로 검사를 하면, 오류율은 15-30%였다. 새로운 머신 비젼 시스템을 도입한 이후 오

류율은 0.03%로 떨어졌다.

법(Law) 분야

FBI는 John F. Kennedy 암살 사건시 찍은 수천장의 필름 프레임들에서 관련된 특징들을

강화 시키고 연구하는 데 영상처리 기술들을 사용하였다. 경찰에서서는 저화질의 지문 영상

Page 5: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

을 복구하는데 컴퓨터를 사용하고 있으며, 지문들은 영상 분석 시스템에 입력되어져 기존의

지문 데이터 베이스와 비교하는 데 사용될 수 있다. 지문 분석은 또한 제한 구역이나 컴퓨

터 시스템에 접근할 권한이 없는 사람에 대한 출입을 방지하기 위한 보안 시스템으로 사용

될 수 있다. 경찰에서는 또한 영상 편집 소프트웨어를 사용하여 범인들의 머리카락의 색을

바꾸거나 머리의 길이를 바꾸고, 수염을 첨가하여 얼굴 영상을 변화시킬 수 있다.

*컬러공간, RGB, HSV, YIQ, UVW, YUV 변환

' RGB

RGB 라 하면 Red, Green, Blue의 약자를 합친 공간임

이제 한번 RGB 공간을 MATLAB을 이용하여 한번 분석해보자.

%------------------[jpeg 영상서 RGB 각 채널 분리]-------------------

clear all;

filename = 'fruit.jpg';

color_image = imread(filename); % jpeg 파일 포맷을 로딩

[R,C,X] = size(color_image); % 영상의 크기를 알아낸다.

row = 1:R; % 백터형태를 행렬형태의 크기로 바꾼다.

col = 1:C;

red_channel= color_image(row,col,1); % 첫 번째 배열

green_channel= color_image(row,col,2); % 두 번째 배열

blue_channel= color_image(row,col,3); % 세 번째 배열

figure(1); % 각 채널의 영상을 보여준다.

subplot(1,3,1); imshow(red_channel);

subplot(1,3,2); imshow(green_channel);

subplot(1,3,3); imshow(blue_channel);

%-------------------------------------------------------------

여기서 Red channel, Green channel, Blue channel은 왜 1,2,3자가 붙어 있는지 여러분들도 아

실런지? 처음 영상을 접하게 되면 배우게 되는 것이 RGB 공간인데, 어떻게 이루어졌나는

것이 참 궁금하신 분도 많으실 것이다.

Page 6: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

한번 아래의 공식을 같이 고민해본다면 이렇게 결론을 내릴 수 있다.

색깔 = red_channel^2 + green_channel^4 + blue_channel^8

그러면 2가 2의 1승이고, 4는 2의 2승, 8은 2의 3승이 된다면 위의 소스를 잘 이해할수

있겠죠. 또 각 채널은 명암도를 가진 영상 즉 그레이 영상으로 되어있다. 한번 실행해 보

라.

그렇게 된다면 컬러 히스토그램(color histogram)이 무엇인지 감이 잡히게 될 것이다.

CMY

CMY 컬러공간을 쉽게 말한다면 보색관계 공간이라고 할까나. 서로 보색 관계에 있기때문

에 RGB 공간과 변환은 쉽다. 이 공간은 컬러 프린트나 인쇄시스템에서 사용되는것임을 알

아두자. (CMYK 공간은 CMY에 K(검정색)을 더한 공간이다)

변환 공식은 다음 아래와 같다.

C = 1.0 - R

M = 1.0 - G

Y = 1.0 - B

CMY공간에서 RGB공간으로 바꾸는 공식은 위의 것을 반대로 하면 된다.

%------------------[RGB공간 → CMY 공간 변환]-------------------

clear all;

filename = 'fruit.jpg';

color_image = imread(filename); % jpeg 파일 포맷을 로딩

[R,C,X] = size(color_image); % 영상의 크기 및 차원 수를 알아낸다.

row = 1:R; % 백터형태를 행렬형태의 크기로 바꾼다.

col = 1:C;

red_channel= color_image(row,col,1); % 첫 번째 배열

green_channel= color_image(row,col,2); % 두 번째 배열

blue_channel= color_image(row,col,3); % 세 번째 배열

% CMY는 RGB와 보색관계이므로 255 - R, 255 -G, 255-B로 한다.

% 보색관계를 만드는 과정.

Page 7: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

cyan_image(R,C) = zeros;

magenta_image(R,C) = zeros;

yellow_image(R,C) = zeros;

for i=1:R

for j=1:C

cyan_image(i,j) = 255.0 - double(red_channel(i,j)) ;

magenta_image(i,j) = 255.0 - double(green_channel(i,j));

yellow_image(i,j) = 255.0 - double(blue_channel(i,j));

end;

end;

% 얻어진 매트릭스를 그레이영상으로 보여주는 mat2gray 함수를 사용한다.

figure(1);

subplot(1,3,1); imshow(mat2gray(cyan_image));

subplot(1,3,2); imshow(mat2gray(magenta_image));

subplot(1,3,3); imshow(mat2gray(yellow_image));

%-------------------------------------------------------------

위의 소스는 완벽하지 않다는 점을 미리 밝힌다. MATLAB 에서는 RGB 공간을 CMY 공간

으로 변환해주는 함수가 존재하지 않기 때문이다.

HSI

인간의 시각 시스템과 유사한 컬러 공간은 HSI 라고 앞에서 밝혀두었다. 보통 대부분 학계

에서는 HSV 라고 하는데, I 는 Intensity, V 는 Value 의 차이밖에 없다. 이것을 가리켜 명도라

고 한다. 명도라는 것은 밝기의 정도를 말하는데, H 라면 색상, S 라면 색의 탁하고 맑음을

가리키는 채도이다. 다시 한번 정리해보자.

H : Hue, 색상

S : Saturation, 채도 (색상의 탁하고 맑음의 정도)

V 또는 I : Value or Intensity, 명도 (밝기의 정도)

히스토그램 연산, 명도 변환, 회선과 같은 영상 처리의 경우는 오직 영상의 명도만 연산하

기 때문에 과거에선 그레이 영상 중심으로 다루었지만, 현재의 추세로는 컬러의 영상을 HSI

Page 8: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

로 분해하여 I만 가지고 다루는 시스템이 많다.

RGB 공간에서 물론 HSI 공간으로 바꿀 수 있음을 당연하다.

MATLAB 에선 이것을 쉽게 해주는 함수는 rgb2hsv 이다. 이 함수를 이용해 아래와 같은

소스를 작성해보았다.

%------------------[RGB공간 → HSI 공간 변환]-------------------

clear all;

filename = 'fruit.jpg';

color_image = imread(filename); % jpeg 파일 포맷을 로딩

% HSI 보이기

[H,S,V] = rgb2hsv(sample_image);

figure(3);

subplot(1,3,1); imshow(H);

subplot(1,3,2); imshow(S);

subplot(1,3,3); imshow(V);

%-------------------------------------------------------------

간단하지 않은가? ^^; 하지만 필자는 RGB 공간을 Red channel, Green channel, Blue channel

을 분리하는 방법을 구현한다고 1주일정도 웹사이트를 찾아 삼만리 한 기억이 나서, 이것을

공개한다는 것 자체가 너무 아깝다. 하지만 이렇게 공개하는 것은 내가 눈물 젖은 빵을 너

무 먼저 많이 먹었기 때문에 여러분들도 나와 같은 아픔을 겪지 않게 하려는 것이다.

이제 마지막으로 위에 언급된 컬러 공간이외에 다른 소스를 공개한다.

YIQ - 텔레비젼에 사용되는 컬러 공간이다.

%------------------[RGB공간 → YIQ 공간 변환]-------------------

% RGB -> YIQ 모델 공간 변환 소스

% orginal source URL : http://www.icaen.uiowa.edu/~nawagner/AIP/splityiq.m

% modifed by 이문호

Page 9: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

clear all;

filename = 'fruit.jpg';

color_image = imread(filename);

[R,C,X] = size(color_image);

row=1:R;

col=1:C;

red_channel(row,col) = color_image(row,col,1);

green_channel(row,col) = color_image(row,col,2);

blue_channel(row,col) = color_image(row,col,3);

Y(row,col) = 0.177*double(red_channel(row,col)) + 0.813*double(green_channel(row,col))

+0.011*double(blue_channel(row,col));

I(row,col) = 0.54*double(red_channel(row,col)) - 0.263*double(green_channel(row,col)) -

0.174*double(blue_channel(row,col));

Q(row,col) = 0.246*double(red_channel(row,col)) - 0.675*double(green_channel(row,col))

+0.404*double(blue_channel(row,col));

Ymin=min(min(Y));

Imin=min(min(I));

Qmin=min(min(Q));

Ymax=max(max(Y));

Imax=max(max(I));

Qmax=max(max(Q));

if(Ymin<0 | Ymax>255)

Y(row,col)=(Y(row,col)-Ymin)*255/(Ymax-Ymin);

end

if (Imin<0 | Imax>255)

I(row,col)=(I(row,col)-Imin)*255/(Imax-Imin);

Page 10: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

end

if (Qmin<0 | Qmax>255)

Q(row,col)=(Q(row,col)-Qmin)*255/(Qmax-Qmin);

end

Y=uint8(Y);

I=uint8(I);

Q=uint8(Q);

imwrite(Y,'Y.jpg');

imwrite(I,'I.jpg');

imwrite(Q,'Q.jpg');

figure(1);

subplot(2,2,1); imshow(filename);

subplot(2,2,2); imshow('Y.jpg');

subplot(2,2,3); imshow('I.jpg');

subplot(2,2,4); imshow('Q.jpg');

%------------------------------------------------------------

UVW

%------------------[RGB공간 → UVW 공간 변환]-------------------

% RGB -> UVW 모델 공간 변환 소스

% orginal source URL : http://www.icaen.uiowa.edu/~nawagner/AIP/splityiq.m

% modifed by 이문호

clear all;

filename = 'fruit.jpg';

color_image = imread(filename);

[R,C,X] = size(color_image);

Page 11: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

row=1:R;

col=1:C;

red_channel(row,col) = color_image(row,col,1);

green_channel(row,col) = color_image(row,col,2);

blue_channel(row,col) = color_image(row,col,3);

U(row,col) = 0.327*double(red_channel(row,col)) + 0.207*double(green_channel(row,col))

+0.133*double(blue_channel(row,col));

V(row,col) = 0.177*double(red_channel(row,col)) + 0.813*double(green_channel(row,col)) +

0.011*double(blue_channel(row,col));

W(row,col) = 0.02*double(red_channel(row,col)) + 1.071*double(green_channel(row,col))

+0.408*double(blue_channel(row,col));

Umin=min(min(U))

Vmin=min(min(V))

Wmin=min(min(W))

Umax=max(max(U))

Vmax=max(max(V))

Wmax=max(max(W))

if(Umin<0 | Umax>255)

U(row,col)=(U(row,col)-Umin)*255/(Umax-Umin);

end

if (Vmin<0 | Vmax>255)

V(row,col)=(V(row,col)-Vmin)*255/(Vmax-Vmin);

end

if (Wmin<0 | Wmax>255)

W(row,col)=(W(row,col)-Wmin)*255/(Wmax-Wmin);

end

U=uint8(U);

Page 12: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

V=uint8(V);

W=uint8(W);

colormap=gray(256);

imwrite(U,colormap,'U.jpg');

imwrite(V,colormap,'V.jpg');

imwrite(W,colormap,'W.jpg');

%------------------------------------------------------------

YUV

%------------------[RGB공간 → YUV 공간 변환]-------------------

% RGB -> YUV 모델 공간 변환 소스

% coding by 이문호

clear all;

filename = 'fruit.jpg';

color_image = imread(filename);

[R,C,X] = size(color_image);

row=1:R;

col=1:C;

red_channel(row,col) = color_image(row,col,1);

green_channel(row,col) = color_image(row,col,2);

blue_channel(row,col) = color_image(row,col,3);

Y(row,col) = 0.299*double(red_channel(row,col)) + 0.587*double(green_channel(row,col))

+0.114*double(blue_channel(row,col));

U(row,col) = -0.147*double(red_channel(row,col)) - 0.289*double(green_channel(row,col)) +

0.436*double(blue_channel(row,col));

V(row,col) = 0.615*double(red_channel(row,col)) - 0.515*double(green_channel(row,col)) -

0.100*double(blue_channel(row,col));

Page 13: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

Ymin=min(min(Y));

Umin=min(min(U));

Vmin=min(min(V));

Ymax=max(max(Y));

Umax=max(max(U));

Vmax=max(max(V));

% clamping...

if(Ymin<0 | Ymax>255)

Y(row,col)=(Y(row,col)-Ymin)*255/(Ymax-Ymin);

end

if (Umin<0 | Umax>255)

U(row,col)=(U(row,col)-Umin)*255/(Umax-Umin);

end

if (Vmin<0 | Vmax>255)

V(row,col)=(V(row,col)-Vmin)*255/(Vmax-Vmin);

end

Y=uint8(Y);

U=uint8(U);

V=uint8(V);

imwrite(Y,'Y.jpg');

imwrite(U,'U.jpg');

imwrite(V,'V.jpg');

figure(1);

subplot(2,2,1); imshow(filename);

subplot(2,2,2); imshow('Y.jpg');

subplot(2,2,3); imshow('U.jpg');

subplot(2,2,4); imshow('V.jpg');

%------------------------------------------------------------\%

Page 14: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

* 명암값 조절 및 대비, 히스토그램 편

'포인트 처리'라는 용어에 대해 생소하신 분이 꽤 되실거라고 생각하는데... Point processing

이라는 용어를 보아 알 수 있듯이 화소(pixel)에 놓여 있는 값을 기반으로 화소를 처리하는

영상처리 기법의 일종이다.

1. 영상의 밝기값 조절 및 영상의 대비

'영상의 밝기값을 조절하려면 어떻게 하면 되는 것일까' 라는 질문을 놓고 곰곰히 생각

해본 시절이 필자에겐 있었다면 믿을 수 있을까요?

일단 우리 한번 생각해보자. 그레이 영상의 경우는 화소값이 0 부터 255 까지의 레벨로 분

류되어 있다는 점을 숙지해두길 바랍니다.

256이면 2의 몇승? 그야 8이지? 그리구 칼라영상은 뭐시더라 24bit로 구성되어 있다고 앞

장에서 말씀 드리셨죠? Red Channel, Blue Channel, Green Channel 각 채널이 8bit로 구성되어

그레이 영상으로 되는 것입니다. 이 점을 한번 생각해보세요. 대부분 그레이 영상은 256 레

벨로 되어 있다는 거 감안하세요. ^^; 흠... 칼라 영상을 어떻게 그레이 영상으로 바꾸나고

요? 고참.. 이거 MATLAB 에서 보면 rgb2gray 라는 함수가 있습니다. 하지만 제가 직접 보여

드리죠. 어떻게 하는지...

공식은 gray_image = sqrt ( red^2 + green^2 + blue^2) / sqrt(3) 입니다.

이에 대한 MATLAB 소스는 다음과 같습니다

%----RGB 영상을 gray 영상으로 바꿔보는 소스--------%

% coding by 이문호 ([email protected])

clear all;

color_image = imread('t.jpg');

[R,C,X] = size(color_image);

row=1:R;

col=1:C;

red(row,col)=color_image(row,col,1);

green(row,col)=color_image(row,col,2);

blue(row,col)=color_image(row,col,3);

red = double(red);

Page 15: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

green = double(green);

blue = double(blue);

gray_image(R,C) = zeros;

for i=1:R

for j=1:C

gray_image(i,j) = sqrt(red(i,j)^2 + green(i,j)^2 + blue(i,j)^2) / sqrt(3.0);

end;

end;

gray_image = mat2gray(gray_image);

imwrite(gray_image,'grayimage.jpg');

imshow('grayimage.jpg');

%----------------------------------------------------------------------------------------

자. 영상의 밝기값 조절에 대해 강의합니다 여기서 말하는 영상은 분명히 그레이 영상

임을 잊지 마시구요. 영상을 밝게 하려면 흰색인 255 에 가깝게 하면 되고, 어둡게 하려면 0

에 가깝게 하면 되겠죠? (참고로 0은 검은색이며 255는 흰색, 숫자가 증가할수록 밝은 색깔

을 지닌다.) 그렇다면 호호... 어떨까요? 그러면 영상의 화소값에 40 을 추가해보면요. 보

통 이것을 가리켜 더하기 연산이죠? 그러면 뺄셈 연산은요? 바로 어둡게 하는 것이랍니다..

덧셈 + 뺄셈 = 산술연산! 맞죠? 히히... 이해하셨나요?

---------------[ 2.1 산술 연산 : 입력영상에 밝기 변화 준다 ]----------------

% Coding by 이문호([email protected])

% 입력영상에 밝기 변화 줌

clear all; % 모든 변수 초기화

filename = 'monkey.jpg';

jpeg_image = imread(filename);

gray_image = rgb2gray(jpeg_image);

% 변환된 gray image의 크기를 얻는다.

[R,C] = size(gray_image);

Page 16: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

% 원영상의 화소값에 40 이 추가된 값을 담을 변수 선언 및 초기화

gray_image_plus_40(R,C) = zeros;

% 원영상의 화소값에 40 을 뺀 값을 담을 변수 선언 및 초기화

gray_image_minus_40(R,C) = zeros;

% MATLAB에서는 unit8 단위를 사용하기 때문에

% 화소의 값에 대한 산술연산시 반드시 double 형을 사용하여야 한다.

for i = 1:R

for j=1:C

% 40 더함

gray_image_plus_40(i,j) = double(gray_image(i,j)) + 40.0;

% 클램핑(clamping)

if gray_image_plus_40(i,j) > 255.0

gray_image_plus_40(i,j) = 255.0;

end;

% 40 뺌

gray_image_minus_40(i,j) = double(gray_image(i,j)) -40.0;

% 클램핑(clamping)

if gray_image_minus_40(i,j) < 0.0

gray_image_minus_40(i,j) = 0.0;

end;

end;

end;

% 구해진 gray_image_plus_40, gray_image_minus_40 을

% gray image로 변환하기 위해 mat2gray 함수를 사용한다.

figure(1);

Page 17: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

subplot(1,3,1); imshow(gray_image);

subplot(1,3,2); imshow(gray_image_plus_40);

subplot(1,3,3); imshow(gray_image_minus_40);

------------------------------------------------------------

% ---------------[ 산술연산 : 2.1의 실험 결과 ]----------------------

여기서 클램핑이라는 단어가 눈에 너무 낯설죠? 영어로는 clamping 이라고 한다는데, 모

시더라? 아.. 이것이군요. 그레이 영상의 경우 256 레벨을 지니게 되는데, 이것을 초과하거나

음수의 값을 가지게 되면 컴퓨터가 인식 못하거든요. 그래서 강제적으로 지정해주는 겁니다.

즉 255를 초과하면 무조건 255로, 0이하의 값은 0으로 설정하는 거죠. 그러면? 명암대비

라는 것이 무엇일까요??? 홍홍~ 홍홍~ 그래픽 소프트웨어 툴을 보면 Contrast 메뉴와 비

슷한 느낌을 가질꺼예요. 글치만 다르죠.

명암대비라는 뜻은 밝거나 어두운 화소의 분포를 말하는 거예요.

%---------------[ 2.2 산술 연산 : 영상의 명암 대비]-----------------------

% coding by 이문호([email protected])

% 명암대비 - 산술연산 (*,/)

% 입력영상의 명암 대비 조절

clear all; % 모든 변수 초기화

filename = 'monkey.jpg';

jpeg_image = imread(filename);

gray_image = rgb2gray(jpeg_image);

% 변환된 gray image의 크기를 얻는다.

[R,C] = size(gray_image);

% 원영상의 화소값에 1.2를 곱한 값을 담을 변수 선언 및 초기화

gray_image_product_12(R,C) = zeros;

% 원영상의 화소값에 1.2를 나눈 값을 담을 변수 선언 및 초기화

Page 18: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

gray_image_divide_12(R,C) = zeros;

% MATLAB에서는 unit8 단위를 사용하기 때문에

% 화소의 값에 대한 산술연산시 반드시 double 형을 사용하여야 한다.

for i = 1:R

for j=1:C

% 1.2를 곱함

gray_image_product_12(i,j) = double(gray_image(i,j)) * 1.2;

% 클램핑(clamping) ; 1.2를 곱한 값이 255를 넘을 수 있으므로

% 아래와 같은 조건을 제시.

if gray_image_product_12(i,j) > 255.0

gray_image_product_12(i,j) = 255.0;

end;

% 1.2를 나눔

gray_image_divide_12(i,j) = double(gray_image(i,j))/(1.2);

end;

end;

% 구해진 gray_image_product_12, gray_image_divide_12 을

% gray image로 변환하기 위해 mat2gray 함수를 사용한다.

figure(1);

subplot(1,3,1); imshow(gray_image);

subplot(1,3,2); imshow(mat2gray(gray_image_product_12));

subplot(1,3,3); imshow(mat2gray(gray_image_divide_12));

------------------------------------------------------------

Page 19: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

---------------[ 산술연산 : 2.2 의 실험 결과 ]----------------------

위의 실험결과를 보면 눈을 닦고 해봐도 별 차이가 없는 것 같으시죠? 흠.. 여러분들도 한

번 실험해보세요. 1.2 대신에 2.0 으로 하시든지... 자. 영상의 밝기값 조절과 명암대비의 차

이점을 들려주지 않는 대신, 영상의 밝기를 조절해도 명암대비에는 효과가 없다는 것을 알

려드립니당. 이거 숙제로 남기죠.. ^^;

2. 히스토그램 (Histogram)

히스토그램은요 영상처리를 공부하시는 분에겐 가장 쉽고도 까다로운 존재랍니다.저도

그렇게 했으니까요. 아. 학창시절 통계를 공부하셨던 분에겐 히스토그램이라는 말이 무척 친

숙하죠? 실은 영상처리에서의 히스토그램의 개념과 비슷하거든요. 히히... 히스토그램은 영

상의 가장 중요한 정보를 담은 자료이며, 영상의 명암값 프로필을 보여주기 위해 사용되는

매우 귀중한 도구죠. 이것을 응용한 사례로는 히스토그램 유사도를사용한 영상 비교를 들

수 있습니다. MATLAB에서 입력영상의 히스토그램을 보여주려면요.. imhist 함수를 사용하시

면 되옵니다. 즉 파일이 muno.jpg로 주어지면 매트랩 커멘드라인 상에서...

>> color_image = imread('muno.jpg'); imhist(rgb2gray(color_image))

이라고 치면 바로 머엇찐~ 창이 나올껍니다

멋찐 창에서요 0 부터 255까지 인덱스로 하구 영상의 화소값 0에 해당하는 갯수가 살

짝 보이죠? 그러니까 각 화소값의 분포를 그린 것이죠. 그러면 히스토그램이 무엇인지

자알 이해가시죠? 호호~~~

이번에는 히스토그램 평활화에 대해 공부합니다. 히스토그램이란 단어를 들어도 머리가

아프시죠? 훗... 이건 약과죠. 히스토그램 평활화를 아시면 더 안아픈데.... 히스토그램 평

활화라는 건 명암값 분포를 새로 깔아주는 거죠. 일명 업그레이드라고할까나. 그러면 히스토

그램 평활화 과정을 함 살펴볼까요?

1) 히스토그램을 생성한다.

2) 히스토그램의 정규화 된 합을 계산한다.

3) 입력 영상을 변형하여 결과 영상을 생성한다.

이거~ 나도 옛날에 낑낑대며 배운 것 같았는데.... 음~ 낑낑댈 필요없이 MATLAB 에서

제공해주는 histeq 를 사용하시면 됩니다. 이거 풀어쓰면요 histogram equalization 쯤? 음.

원리를 쓴 MATLAB 소스를 보여드려야 하는데 이건 시간이 없어서 넘어가는 대신 histeq 함

수를 사용한 소스를 보여드리죠. ^^;

Page 20: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

%---------------[ 2.3 히스토그램의 평활화]-----------------------

% coding by 이문호([email protected])

% 컬러 영상의 Red Channel을 입력영상으로 한다.

% 입력영상의 히스토그램과 평활화된 영상의 히스토그램 보이기

clear all; % 모든 변수 초기화

filename = 'fruit.jpg';

sample_image = imread(filename);

[R,C,X] = size(sample_image); % row, col, dimesion 반환

row = 1:R;

col = 1:C;

% Red Channel extraction.

% 평활화 하기 위한 함수는 histeq 이다. 이 함수의 기능은

% Contrast enhancement by histogram equalizaation or modification 이다.

%equal_image(R,C)=zeros;

red_image = sample_image(row,col,1);

equal_image=histeq(red_image,256);

figure(1);

subplot(2,2,1); imshow(red_image);

subplot(2,2,2); imhist(red_image);

subplot(2,2,3); imshow(equal_image);

subplot(2,2,4); imhist(equal_image);

%--------------------------------------------------------------------------

Page 21: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

*명암대비, 명암 변환 편

명암대비는 앞장에서 밝거나 어두운 화소의 분포를 말한다고 했었는데, 그러면 낮은 명암

대비를 가진 영상의 히스토그램을 잘보면 어느 한쪽에 치우져 있을꺼예요. 반대의 경우도

마찬가지죠. 그러면 명암대비 스트레칭이라는 건 확실하게는 영상의 밝기 분포를 최대한 활

용하도록 히스토그램을 쫘악 길게 당기는거죠. 그렇게 되면 낮은 명암 대비를 가지는 영상

의 질을 너무나 훌륭하게 향상 시키는 기회가 됩니다.

자아 명암대비 스트레칭의 알고리즘은 2가지가 있는데요..

1) 기본 명암대비 스트레칭

바로 특정 부분, 즉 중앙에 명암값이 치우치는 히스토그램을 가진 영상엔 환상적인 애인이

되어주는 착한 분입니다.

공식을 보자면.

new pixel = {(old pixel – low)/ (high – low)} * 255

자. MATLAB 소스를 한번 봅시다..

%----------------[ 2.4. 기본 명암대비 스트레칭 ]---------------------

clear all; % 모든 변수 초기화

filename = 'fruit5.jpg'; % 히스토그램을 중앙에 치우치게 만든 영상!

jpeg_image = imread(filename);

gray_image = rgb2gray(jpeg_image);

% gray image의 크기를 얻는다.

[R,C] = size(gray_image);

% 가장 높은 화소값과 가장 낮은 화소값을 찾아라.

low = 256;

high = 0;

for i=1:R

Page 22: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

for j=1:C

if (high <= gray_image(i,j)) high = gray_image(i,j);

end;

if (low > gray_image(i,j)) low = gray_image(i,j);

end;

end;

end;

% old pixel - low

% new pixel = -------------------- * 255

% high - low

new_gray_image(R,C) = zeros;

for i=1:R

for j=1:C

new_pixel = ( (double(gray_image(i,j)) - double(low)) / (double(high) - double(low)) ) * 255.0;

new_gray_image(i,j) = new_pixel;

end;

end;

figure(1);

subplot(1,2,1); imshow(gray_image);

subplot(1,2,2); imshow(mat2gray(new_gray_image));

---------------------------------------------------------------

2) 엔드인 탐색 (ends-in search)

이번에는 엔드인 탐색 방법입니다.

엔드인 탐색은요 중앙에 치우친 히스토그램을 스트레칭 하는 기본 명암대비 스트레칭과 달

리 모든 범위의 명암을 가지지만 히스토그램의 특정 부분에 화소들이 치우친 영상에는 가장

잘 적용되는 방법이죠.

공식은

- 0 for x <= low

output = | 255 * (x-low)/(high - low) for low <= x < high

- 255 for high <= x

Page 23: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

그러면 더 이해를 돕게 MATLAB 소스를 보여드릴께요.

----------------[ 2.5. 엔드인 탐색 ]---------------------

% Coding by 이문호 ([email protected])

clear all; % 모든 변수 초기화

filename = 'fruit3.jpg'; % 히스토그램을 극단화 시킨 영상임.

jpeg_image = imread(filename);

gray_image = rgb2gray(jpeg_image);

% figure(2); imhist(gray_image); %을 제거하고 히스토그램 확인해보세요.

% gray image의 크기를 얻는다.

[R,C] = size(gray_image);

% 가장 높은 화소값과 가장 낮은 화소값을 찾아라.

low = 256;

high = 0;

for i=1:R

for j=1:C

if (high <= gray_image(i,j)) high = gray_image(i,j);

end;

if (low > gray_image(i,j)) low = gray_image(i,j);

end;

end;

end;

% - 0 for x <= low

% output = | 255 * (x-low)/(high - low) for low <= x <= high

% - 255 for high <= x

Page 24: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

new_gray_image(R,C) = zeros;

for i=1:R

for j=1:C

if gray_image(i,j) <= low

new_gray_image(i,j) = 0;

end;

if (gray_image(i,j) >= low) & (gray_image(i,j) <= high)

new_gray_image(i,j) = ( (double(gray_image(i,j)) - double(low)) / (double(high) -

double(low)) ) * 255.0;

end;

if gray_image(i,j) >= high

new_gray_image(i,j) = 255;

end;

end;

end;

figure(1);

subplot(1,2,1); imshow(gray_image);

subplot(1,2,2); imshow(mat2gray(new_gray_image));

%---------------------------------------------------------------

3. 명암변환

명암변환은요 미리 지정된 함수를 바탕으로 이전 화소값을 새로운 화소값으로 바꿔치기

하는 녀석이거든요. 명암변환은요 만들기 넘 쉽답니다. 훗.. 함수를 만들면 되거든요. 한가지

만 알려드리고 나머지는 여러분께서 함 만들어보세요.

이번엔 널변환과 역변환을 공개할께요. ^^;

널변환이면 y = x 이구, 역변환이면 y = 255 - x가 되죠? ^^;

Page 25: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

%----------------[ 2.6 명암변환 - 널변환과 역변환 ]---------------------

% Coding by 이문호 ([email protected])

clear all; % 모든 변수 초기화

filename = 'fruit.jpg';

jpeg_image = imread(filename);

gray_image = rgb2gray(jpeg_image);

% gray image의 크기를 얻는다.

[R,C] = size(gray_image);

% 널 변환

% new pixel = old pixel

new_gray_image1(R,C) = zeros;

for i=1:R

for j=1:C

old_pixel = gray_image(i,j);

new_pixel = double(old_pixel);

new_gray_image1(i,j) = new_pixel;

end;

end;

% 역 변환

% new pixel = 255- old pixel

new_gray_image2(R,C) = zeros;

for i=1:R

Page 26: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

for j=1:C

old_pixel = gray_image(i,j);

new_pixel = 255.0 - double(old_pixel) ;

new_gray_image2(i,j) = new_pixel;

end;

end;

figure(1);

subplot(1,2,1); imshow(mat2gray(new_gray_image1));

subplot(1,2,2); imshow(mat2gray(new_gray_image2));

%---------------------------------------------------------------

다음에는 명암변환의 여러 가지 방법을 간단히 설명하되 그냥 소스는 링크시키겠습니다.

☞ 감마 상관관계 변환 : 영상을 밝게 하거나 흐리게 함 → MATLAB 소스

%----------- 감마 상관관계 변환

clear all; % 모든 변수 초기화

filename = 'fruit.jpg';

color_image = imread(filename);

% 감마값이 0.45로 정한후, 감마 변환통한 영상 보여준다.

% 이때, imadjust 함수를 사용한다.

gamma_045 = imadjust(color_image,[ ;],[ ; ], 0.45);

% 감마값이 2.2로 정한후, 감마 변환통한 영상 보여준다.

gamma_22 = imadjust(color_image,[ ;],[ ; ], 2.2);

figure(1);

subplot(1,2,1); imshow(gamma_045);

subplot(1,2,2); imshow(gamma_22);

Page 27: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

☞ 명암스트레칭 / 명암대비 압축 영상 : 밝은 값을 어둡게, 반대로는 밝게 → 소스

% 명암 스트레칭된 영상과 명암 대비가 압축된 영상

clear all; % 모든 변수 초기화

filename = 'fruit.jpg'; % 히스토그램을 극단화 시킨 영상임.

color_image = imread(filename);

gray_image = rgb2gray(color_image);

% gray image의 크기를 얻는다.

[R,C] = size(gray_image);

% 명암 스트레칭된 영상

%

% 그림 2.17 (a) 공식은 아래와 같이 임의로 정한다.

%

% y = 2*x - 50

%

%

new_gray_image1(R,C) = zeros;

for i=1:R

for j=1:C

x = gray_image(i,j);

new_gray_image1(i,j) = 2.0*double(x) - double(50);

if new_gray_image1(i,j) < 0.0;

new_gray_image1(i,j) = 0.0;

end;

if new_gray_image1(i,j) >=255.0

new_gray_image1(i,j) = 255.0;

end;

end;

end;

Page 28: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

%

% 명암 대비가 압축된 영상

%

% 그림 2.17 (a) 공식은 아래와 같이 임의로 정한다.

%

% y = (2/3)*x + 30

%

%

new_gray_image2(R,C) = zeros;

for i=1:R

for j=1:C

x = gray_image(i,j);

new_gray_image2(i,j) = double(x)*double(2/3) + 30;

if new_gray_image2(i,j) >=255.0

new_gray_image2(i,j) = 255.0;

end;

end;

end;

figure(1);

subplot(1,2,1); imshow(mat2gray(new_gray_image1));

subplot(1,2,2); imshow(mat2gray(new_gray_image2));

% --------------------------------------------------------------------------------

☞ 포스터라이징 : 화소가 가질 수 있는 값의 범위를 축소 → MATLAB 소스

% 8 레벨 포스터라이징 변환, 임계값을 이용한 변환, 범위가 주어지는 임계값 변환

clear all; % 모든 변수 초기화

filename = 'fruit.jpg';

Page 29: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

color_image = imread(filename);

gray_image = rgb2gray(color_image);

% gray image의 크기를 얻는다.

[R,C] = size(gray_image);

%

% 8 레벨 포트라이징 변환

%

new_gray_image1(R,C) = zeros;

for i=1:R

for j =1:C

x = gray_image(i,j);

if (gray_image(i,j) >= 0.0) & (gray_image(i,j) < 31.0)

new_gray_image1(i,j) = 31.0;

end;

if (gray_image(i,j) >= 31.0) & (gray_image(i,j) < 63.0)

new_gray_image1(i,j) = 63.0;

end;

if (gray_image(i,j) >= 64.0) & (gray_image(i,j) < 95.0)

new_gray_image1(i,j) = 95.0;

end;

if (gray_image(i,j) >= 95.0) & (gray_image(i,j) < 127.0)

new_gray_image1(i,j) = 127.0;

end;

if (gray_image(i,j) >= 128.0) & (gray_image(i,j) < 159.0)

new_gray_image1(i,j) = 159.0;

end;

if (gray_image(i,j) >= 160.0) & (gray_image(i,j) < 191.0)

new_gray_image1(i,j) = 191.0;

end;

if (gray_image(i,j) >= 192.0) & (gray_image(i,j) < 223.0)

new_gray_image1(i,j) = 223.0;

end;

Page 30: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

if (gray_image(i,j) >= 224.0) & (gray_image(i,j) <= 255.0)

new_gray_image1(i,j) = 255.0;

end;

end;

end;

%-------------------------------------------------

☞ 임계값을 이용한 변환 : 임계값을 제한된 범위로 축소 및 다른건 널변환 → 소스

%

% 임계값을 이용한 변환

%

% 그림 2.18 (b) 공식은 아래와 같이 임의로 정한다.

%

% y = 0 for 0 <= x < 127

% 255 for x >= 128

%

new_gray_image2(R,C) = zeros;

for i=1:R

for j=1:C

if (gray_image(i,j) >= 0.0) & (gray_image(i,j) <= 127.0)

new_gray_image2(i,j) = 0.0;

end;

if gray_image(i,j) > 128.0

new_gray_image2(i,j) = 255.0;

end;

% new_gray_image = gray_image(i,j);

end;

end;

%

% 범위가 주어지는 임계값을 이용한 변환

%

Page 31: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

% 그림 2.18 (c) 공식은 아래와 같이 임의로 정한다.

%

% y = x for 0 <= x < 80, 160 <= x <= 255

% 80 for 80 =< x < 128

% 160 for 128<= x < 160

%

new_gray_image3(R,C) = zeros;

for i=1:R

for j=1:C

x = gray_image(i,j);

if (gray_image(i,j) >= 0.0) & (gray_image(i,j) < 80.0)

new_gray_image3(i,j) = x;

end;

if (gray_image(i,j) >= 80.0) & (gray_image(i,j) < 128.0)

new_gray_image3(i,j) = 80;

end;

if (gray_image(i,j) >= 0.0) & (gray_image(i,j) <= 80.0)

new_gray_image3(i,j) = 160;

end;

if (gray_image(i,j) >= 160) & (gray_image(i,j) <= 255.0);

new_gray_image3(i,j) = x;

end;

end;

end;

figure(1);

subplot(1,3,1); imshow(mat2gray(new_gray_image1));

subplot(1,3,2); imshow(mat2gray(new_gray_image2));

subplot(1,3,3); imshow(mat2gray(new_gray_image3));

Page 32: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

☞ 비트 클리핑 : 최상위 비트의 일정 부분을 0으로 설정화 → MATLAB 소스

% 2비트 클리핑 변환, 등명암 윤곽화 변환

clear all; % 모든 변수 초기화

filename = 'fruit.jpg';

color_image = imread(filename);

gray_image = rgb2gray(color_image);

% gray image의 크기를 얻는다.

[R,C] = size(gray_image);

%

% 2비트 클리핑 변환

%

new_gray_image1(R,C) = zeros;

for i=1:R

for j =1:C

x = gray_image(i,j);

if (gray_image(i,j) >= 0.0) & (gray_image(i,j) < 63.0)

new_gray_image1(i,j) = double(x);

end;

if (gray_image(i,j) >= 64.0) & (gray_image(i,j) < 127.0)

new_gray_image1(i,j) = double(x) - 63.0;

end;

if (gray_image(i,j) >= 128.0) & (gray_image(i,j) < 191.0)

new_gray_image1(i,j) = double(x) - 127.0;

end;

if (gray_image(i,j) >= 192.0) & (gray_image(i,j) < 255.0)

new_gray_image1(i,j) = double(x) - 191.0;

end;

end;

Page 33: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

end;

%

% 명암 대비가 스트레칭된 비트 클리핑 영상

%

% 가장 높은 화소값과 가장 낮은 화소값을 찾아라.

low = 256;

high = 0;

for i=1:R

for j=1:C

if (high <= new_gray_image1(i,j)) high = new_gray_image1(i,j);

end;

if (low > new_gray_image1(i,j)) low = new_gray_image1(i,j);

end;

end;

end;

% old pixel - low

% new pixel = ------------- * 255

% high - low

new_gray_image2(R,C) = zeros;

for i=1:R

for j=1:C

new_pixel = ( (double(new_gray_image1(i,j)) - double(low)) / (double(high) - double(low)) ) *

255.0;

new_gray_image2(i,j) = new_pixel;

end;

end;

Page 34: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

☞ 등명암 윤곽화 : 특정 입력 명암값을 흰색 또는 검은색 지정 → MATLAB 소스

%

% 등명암 윤곽화 변환

%

new_gray_image3(R,C) = zeros;

for i=1:R

for j=1:C

x = gray_image(i,j);

if (gray_image(i,j) >= 0.0) & (gray_image(i,j) <= 50.0)

new_gray_image3(i,j) = x;

end;

if (gray_image(i,j) >= 53.0) & (gray_image(i,j) <= 98.0)

new_gray_image3(i,j) = x;

end;

if (gray_image(i,j) >= 105.0) & (gray_image(i,j) <= 155.0)

new_gray_image3(i,j) = x;

end;

if (gray_image(i,j) >= 160.0) & (gray_image(i,j) <= 230.0)

new_gray_image3(i,j) = x;

end;

if (gray_image(i,j) >= 235.0) & (gray_image(i,j) <= 255.0)

new_gray_image3(i,j) = x;

end;

end;

end;

figure(1);

subplot(1,3,1); imshow(mat2gray(new_gray_image1));

subplot(1,3,2); imshow(mat2gray(new_gray_image2));

subplot(1,3,3); imshow(mat2gray(new_gray_image3));

Page 35: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

☞ 범위 강조 변환 : 다른 화소를 원상태 유지하되 일정범위의 화소 강조 → 소스

% 범위 - 강조 변환

clear all; % 모든 변수 초기화

filename = 'fruit.jpg';

color_image = imread(filename);

gray_image = rgb2gray(color_image);

% gray image의 크기를 얻는다.

[R,C] = size(gray_image);

%

% 범위 강조 변환

%

new_gray_image(R,C) = zeros;

for i=1:R

for j =1:C

x = gray_image(i,j);

if (gray_image(i,j) >= 0.0) & (gray_image(i,j) < 111.0)

new_gray_image(i,j) = double(x);

end;

if (gray_image(i,j) >= 111.0) & (gray_image(i,j) < 143.0)

new_gray_image(i,j) = 255.0;

end;

if (gray_image(i,j) >= 143.0) & (gray_image(i,j) < 255.0)

new_gray_image(i,j) = double(x) ;

end;

end;

end;

figure(1); imshow(mat2gray(new_gray_image));

Page 36: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

☞ 솔라라이징 변환 / 파라볼라 변환 : 디지털 예술가들이 많이 사용 → MATLAB 소스

% 솔라리징 변환

clear all; % 모든 변수 초기화

filename = 'fruit.jpg';

color_image = imread(filename);

gray_image = rgb2gray(color_image);

% gray image의 크기를 얻는다.

[R,C] = size(gray_image);

%

% 임계값 150을 사용한 솔라이징 변환

%

% 교재 82 페이지, for x < threshold를 for x > threshold로 바꾸기 바람!

%

new_gray_image1(R,C) = zeros;

threshold_value = 150; % 임계값 150

for i=1:R

for j =1:C

x = gray_image(i,j);

if gray_image(i,j) <= 150.0

new_gray_image1(i,j) = double(x);

end;

if gray_image(i,j) > 150

new_gray_image1(i,j) = 255.0 - double(x);

end;

end;

end;

Page 37: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

%

% 솔라리징 변환

%

new_gray_image2(R,C) = zeros;

for i=1:R

for j=1:C

x = gray_image(i,j);

new_pixel = 255.0 - 255.0 * (( double(x)/128.0 - 1.0)^2);

new_gray_image2(i,j) = new_pixel;

end;

end;

% 두번째 파라볼라 변환

%

new_gray_image3(R,C) = zeros;

for i=1:R

for j=1:C

x = gray_image(i,j);

new_pixel = 255.0 * (( double(x)/128.0 - 1.0)^2);

new_gray_image3(i,j) = new_pixel;

end;

end;

figure(1);

subplot(1,3,1); imshow(mat2gray(new_gray_image1));

subplot(1,3,2); imshow(mat2gray(new_gray_image2));

subplot(1,3,3); imshow(mat2gray(new_gray_image3));

%---------------------------------------------------------------

Page 38: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

Area processing

회선처리의 개념, 엠보싱 편

영역처리라는 건 출력 화소를 만들기 위해 입력 화소뿐만 아니라 입력 화소 주위에 있

는 화소들을 사용하는 기법을 가리키는 거랍니다. 영역처리 기법은 별시리... 별거 아님... 실

은 회선기법(Convolution technique) 을 이용하여 처리하는 거랄까요. 그래도 반드시 써야 합

니다. 아주 기초적이면서도 영상처리분야에서 필수적인 처리이죠..

회선기법을 사용한 예로는 다음과 같아요.

▶ Embossing - 양각효과 : 컬러 엠보싱 구현 소스

%------엠보싱 구현소스

clear all;

filename = 'fruit.jpg';

RGB_image=imread(filename);

[H,S,V] = rgb2hsv(RGB_image);

[R,C,X] = size(RGB_image);

row=1:R;

col=1:C;

% 밝기 데이터는 V 이다.

% 여기서 V를 회선시켜보자.

%

% p 90, 5 lines

% 회선 마스크

% -1 0 0

% 0 0 0

% 0 0 1

% 회선시킨후 밝기 채널의 모든 화소들에 평균값이 더하게 한다.

%

% 회선 함수를 구현시 두번째 해결방법인 윈도우가 영상과 중첩

% 되지 않는 첫 위치에서 회선이 시작되도록 한다.

%

V= double(V); % double형으로 변환

Page 39: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

% V의 값의 평균을 구한다.

temp=0.0;

for i=1:R-2

for j=1:C-2

temp= temp+V(i,j);

end;

end;

temp_ave = temp/(R-2)*(C-2);

V1(R,C)=zeros;

for i=1:R-2

for j = 1:C-2

V1(i+1,j+1) = V(i,j)*(-1.0) + V(i,j+1)*(0.0) + V(i,j+2)*(0.0) ...

+ V(i+1,j)*(0.0) + V(i+1,j+1)*(0.0) + V(i+1,j+2)*(0.0) ...

+ V(i+2,j)*(0.0) + V(i+2,j+1)*(0.0) + V(i+2,j+2)*(1.0);

end;

end;

for i=1:R

for j=1:C

V1(i,j) = V1(i,j) + temp_ave;

end;

end;

hsv_image(R,C,X) = zeros;

hsv_image(row,col,1) = H(row,col);

hsv_image(row,col,2) = S(row,col);

% mat2gray 를 사용하지 않으면 엉뚱한 결과 나온다.

hsv_image(row,col,3) = mat2gray(V1(row,col));

temp_color_image = hsv2rgb(hsv_image);

imwrite(temp_color_image,'hsv_emboss.jpg');

figure(1);

subplot(1,3,1); imshow(filename);

subplot(1,3,2); imshow('hsv_emboss.jpg');

Page 40: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

% RGB 영상의 각 채널의 회선 수행

%

% p 90, 5 lines

% 회선 마스크

% -1 0 0

% 0 0 0

% 0 0 1

% 회선시킨후 모든 화소들에 각 채널값의 평균값이 더하게 한다.

%

% 회선 함수를 구현시 두번째 해결방법인 윈도우가 영상과 중첩

% 되지 않는 첫 위치에서 회선이 시작되도록 한다.

%

red(row,col) = RGB_image(row,col,1);

green(row,col) = RGB_image(row,col,2);

blue(row,col) = RGB_image(row,col,3);

red = double(red);

green = double(green);

blue = double(blue);

red1(R,C)=zeros;

green1(R,C)=zeros;

blue1(R,C)=zeros;

for i=1:R-2

for j = 1:C-2

red1(i+1,j+1) = red(i,j)*(-1.0) + red(i,j+1)*(0.0) + red(i,j+2)*(0.0) ...

+ red(i+1,j)*(0.0) + red(i+1,j+1)*(0.0) + red(i+1,j+2)*(0.0) ...

+ red(i+2,j)*(0.0) + red(i+2,j+1)*(0.0) + red(i+2,j+2)*(1.0);

green1(i+1,j+1) = green(i,j)*(-1.0) + green(i,j+1)*(0.0) + green(i,j+2)*(0.0) ...

+ green(i+1,j)*(0.0) + green(i+1,j+1)*(0.0) + green(i+1,j+2)*(0.0) ...

+ green(i+2,j)*(0.0) + green(i+2,j+1)*(0.0) + green(i+2,j+2)*(1.0);

Page 41: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

blue1(i+1,j+1) = blue(i,j)*(-1.0) + blue(i,j+1)*(0.0) + blue(i,j+2)*(0.0) ...

+ blue(i+1,j)*(0.0) + blue(i+1,j+1)*(0.0) + blue(i+1,j+2)*(0.0) ...

+ blue(i+2,j)*(0.0) + blue(i+2,j+1)*(0.0) + blue(i+2,j+2)*(-1.0);

end;

end;

red_temp=0.0;

green_temp=0.0;

blue_temp=0.0;

for i=1:R-2

for j=1:C-2

red_temp= red_temp+red(i,j);

green_temp= green_temp+red(i,j);

blue_temp= blue_temp+red(i,j);

end;

end;

red_ave = red_temp/(R-2)*(C-2);

green_ave = green_temp/(R-2)*(C-2);

blue_ave = blue_temp/(R-2)*(C-2);

for i=1:R

for j=1:C

red1(i,j) = red1(i,j) + red_ave;

green1(i,j) = green1(i,j) + green_ave;

blue1(i,j) = blue1(i,j) + blue_ave;

end;

end;

temp_color_image1(row,col,1) = mat2gray(red1(row,col));

temp_color_image1(row,col,2) = mat2gray(green1(row,col));

temp_color_image1(row,col,3) = mat2gray(blue(row,col));

Page 42: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

imwrite(temp_color_image1,'rgb_emboss.jpg');

subplot(1,3,3); imshow('rgb_emboss.jpg');

%--------------------------------------------------------------------------------

▶ Bluring - 영상을 부드럽게

▶ Sharping - 세세한 부분을 두드러지게 또는 강조

▶ Edge Detection - 방향성 검출

▶ Spatial Filtering (공간필터링)

1. 회선 기법

회선기법은 영상 스무딩, 크리스프닝, 에지 검출등의 효과를 거두기 위해 많이 사용되는

기법인데요.. 따라서 이에 의거하여 원시 화소에 대하여 이웃한 화소들 각각에 가중치를 곱

한 합을 출력화소로 생성하는 원리를 가진다고 할 수 있어요.

엠보싱 효과에 대해 알아볼까요. 엠보싱 효과를 거두게 하려면 회선 마스크에 어떤 값을

주는가 먼저 생각해봐야됨은 당연하죠?

2. 엠보싱 효과 (Embossing Effect)

엠보싱 효과라는 건 구리판을 양각한 결과를 생성하는 거죠. 이건 그래픽 툴에 반드시들

어가는 메뉴랍니다. 엠보싱 마스크의 계수는요 중앙값은 0 이구 합은 0 이죠. 엠보싱 효과를

가지기위한 회선 마스크는 아래와 같다고 해둡시다.

-1 0 0

0 0 0

0 0 1

일단 그레이 영상에 대해서 엠보싱 효과

----------------[ 3.1. 엠보싱 효과 - 그레이 영상]---------------------

% Coding by 이문호 ([email protected])

clear all;

filename = 'fruit.jpg';

RGB_image=imread(filename);

gray_image=rgb2gray(RGB_image); % 그레이 영상 변환

Page 43: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

V=double(gray_image); % 계산시 double형으로 변환.

[R,C] = size(gray_image);

V1(R,C)=zeros;

% 사용된 회선마스크

% 여러분들의 이해를 돕고자 MATLAB에서 제공되는 conv2를 쓰지 않았음.

%

% 잘 보면 3*3 블록 형태이죠? 원영상의 3*3 블록만큼 추출하여 사용된

% 가중치가 들어 있는 회선마스크를 곱한후 그 결과를 집어 넣는거예요.

% 그게 바로 회선기법!!!!!!!!!

for i=1:R-2

for j = 1:C-2

V1(i+1,j+1) = V(i,j)*(-1.0) + V(i,j+1)*(0.0) + V(i,j+2)*(0.0) ...

+ V(i+1,j)*(0.0) + V(i+1,j+1)*(0.0) + V(i+1,j+2)*(0.0) ...

+ V(i+2,j)*(0.0) + V(i+2,j+1)*(0.0) + V(i+2,j+2)*(1.0);

end;

end;

% 여기서 128을 더했다.. 다만 컬러인경우는 적용이 되지 않음을

% 참고해야 한다. - My 경험상...

for i=1:R

for j=1:C

V1(i,j) = V1(i,j) + 128.0;

end;

end;

imshow(mat2gray(V1));

---------------------------------------------------------------

컬러영상인 경우 아주 참 복잡해요. 두가지 방법이 있는데...

1) RGB 공간 → HSI 칼라 공간 변환 → 밝기채널 수행 → RGB 공간 다시 변환

2) RGB 공간 → 각 채널 분리 → 각 채널 회선 수행 → RGB 공간 재생성

글치.. 좀 어렵죠? 암튼.. 제가 2 가지 방법을 구현한 소스를 보여드리겠습니다. 참고로

Page 44: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

2)번 방법보다 1)번 방법이 제대로 잘 보입니다. 엠보싱 효과는 1)번의 경우 I 또는 V 부분

만 건드리기 때문에, HSI 칼라공간의 요소인 H 가 원 영상의 색상부분을 그대로 보존되니까

요.

%----------------[ 3.1. 엠보싱 효과 - 칼라 영상]---------------------

% 엠보싱효과

% 영상을 HSI 컬러공간으로 바꾸고, 밝기 데이터에 회선 시킨후,

% RGB 공간으로 바꾸게 한다.

% Coding by 이문호 ([email protected])

clear all;

filename = 'fruit.jpg';

RGB_image=imread(filename);

[H,S,V] = rgb2hsv(RGB_image);

[R,C,X] = size(RGB_image);

row=1:R;

col=1:C;

% 밝기 데이터는 V 이다.

% 여기서 V를 회선시켜보자.

%

% p 90, 5 lines

% 회선 마스크

% -1 0 0

% 0 0 0

% 0 0 1

% 회선시킨후 밝기 채널의 모든 화소들에 평균값이 더하게 한다.

%

% 회선 함수를 구현시 두번째 해결방법인 윈도우가 영상과 중첩

% 되지 않는 첫 위치에서 회선이 시작되도록 한다.

%

V= double(V); % double형으로 변환

% V의 값의 평균을 구한다.

Page 45: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

temp=0.0;

for i=1:R-2

for j=1:C-2

temp= temp+V(i,j);

end;

end;

temp_ave = temp/(R-2)*(C-2);

V1(R,C)=zeros;

for i=1:R-2

for j = 1:C-2

V1(i+1,j+1) = V(i,j)*(-1.0) + V(i,j+1)*(0.0) + V(i,j+2)*(0.0) ...

+ V(i+1,j)*(0.0) + V(i+1,j+1)*(0.0) + V(i+1,j+2)*(0.0) ...

+ V(i+2,j)*(0.0) + V(i+2,j+1)*(0.0) + V(i+2,j+2)*(1.0);

end;

end;

for i=1:R

for j=1:C

V1(i,j) = V1(i,j) + temp_ave;

end;

end;

hsv_image(R,C,X) = zeros;

hsv_image(row,col,1) = H(row,col);

hsv_image(row,col,2) = S(row,col);

% mat2gray 를 사용하지 않으면 엉뚱한 결과 나온다.

hsv_image(row,col,3) = mat2gray(V1(row,col));

temp_color_image = hsv2rgb(hsv_image);

imwrite(temp_color_image,'hsv_emboss.jpg');

figure(1);

subplot(1,3,1); imshow(filename);

subplot(1,3,2); imshow('hsv_emboss.jpg');

Page 46: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

% RGB 영상의 각 채널의 회선 수행

%

% p 90, 5 lines

% 회선 마스크

% -1 0 0

% 0 0 0

% 0 0 1

% 회선시킨후 모든 화소들에 각 채널값의 평균값이 더하게 한다.

%

% 회선 함수를 구현시 두번째 해결방법인 윈도우가 영상과 중첩

% 되지 않는 첫 위치에서 회선이 시작되도록 한다.

%

red(row,col) = RGB_image(row,col,1);

green(row,col) = RGB_image(row,col,2);

blue(row,col) = RGB_image(row,col,3);

red = double(red);

green = double(green);

blue = double(blue);

red1(R,C)=zeros;

green1(R,C)=zeros;

blue1(R,C)=zeros;

for i=1:R-2

for j = 1:C-2

red1(i+1,j+1) = red(i,j)*(-1.0) + red(i,j+1)*(0.0) + red(i,j+2)*(0.0) ...

+ red(i+1,j)*(0.0) + red(i+1,j+1)*(0.0) + red(i+1,j+2)*(0.0) ...

+ red(i+2,j)*(0.0) + red(i+2,j+1)*(0.0) + red(i+2,j+2)*(1.0);

green1(i+1,j+1) = green(i,j)*(-1.0) + green(i,j+1)*(0.0) + green(i,j+2)*(0.0) ...

+ green(i+1,j)*(0.0) + green(i+1,j+1)*(0.0) + green(i+1,j+2)*(0.0) ...

+ green(i+2,j)*(0.0) + green(i+2,j+1)*(0.0) + green(i+2,j+2)*(1.0);

blue1(i+1,j+1) = blue(i,j)*(-1.0) + blue(i,j+1)*(0.0) + blue(i,j+2)*(0.0) ...

Page 47: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

+ blue(i+1,j)*(0.0) + blue(i+1,j+1)*(0.0) + blue(i+1,j+2)*(0.0) ...

+ blue(i+2,j)*(0.0) + blue(i+2,j+1)*(0.0) + blue(i+2,j+2)*(-1.0);

end;

end;

red_temp=0.0;

green_temp=0.0;

blue_temp=0.0;

for i=1:R-2

for j=1:C-2

red_temp= red_temp+red(i,j);

green_temp= green_temp+red(i,j);

blue_temp= blue_temp+red(i,j);

end;

end;

red_ave = red_temp/(R-2)*(C-2);

green_ave = green_temp/(R-2)*(C-2);

blue_ave = blue_temp/(R-2)*(C-2);

for i=1:R

for j=1:C

red1(i,j) = red1(i,j) + red_ave;

green1(i,j) = green1(i,j) + green_ave;

blue1(i,j) = blue1(i,j) + blue_ave;

end;

end;

temp_color_image1(row,col,1) = mat2gray(red1(row,col));

temp_color_image1(row,col,2) = mat2gray(green1(row,col));

temp_color_image1(row,col,3) = mat2gray(blue(row,col));

imwrite(temp_color_image1,'rgb_emboss.jpg');

Page 48: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

subplot(1,3,3); imshow('rgb_emboss.jpg');

%---------------------------------------------------------------

*블러링 편 블러링이란 용어가 참 어색해보이죠?

일단 영상이 희미하다 또 조그만 점이 많이 생기면 이를 확실하게 보이거나 제거하려면 어

떻게 해야할까요? 여기서 우리가 배우는 것이 이것을 알아내야 하는 것이죠. 고로 블러링

은 영상의 세세한 부분을 제거하는데 쓰이는 기법으로서 물론 회선을 이용하여 수행된다는

것입니다.

| 1/9 1/9 1/9 |

| 1/9 1/9 1/9 |

| 1/9 1/9 1/9 | → 3*3 마스크의 경우, 모든 계수들의 합은 1

| 1/25 1/25 1/25 1/25 1/25 |

| 1/25 1/25 1/25 1/25 1/25 |

| 1/25 1/25 1/25 1/25 1/25 |

| 1/25 1/25 1/25 1/25 1/25 |

| 1/25 1/25 1/25 1/25 1/25 |

→ 5*5 마스크의 경우, 모든 계수들의 합은 1

∴ M×M 마스크의 경우 각 계수는 1/(M×M) 이다.

보통 블러링 mask 에 서의 모든 회수 계수들의 값은 똑같은데, 이 경우 이웃화소들과

평균화한 결과라는 특징을 엿 볼수 있죠. 따라서 극단적인 값을 제거할 수 있으나 영상의

대비를 약화시킨다는 악평만은 피할 수 없다.

% ----------------------[1. 블러링 (Bluring)]--------------------------

%

% Coding by 이문호 ([email protected])

%

% 평균마스크 N*N 블러링된 결과

%

Page 49: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

clear all;

filename='ants.jpg';

color_image = imread(filename);

gray_image = rgb2gray(color_image);

% 블러링이나 저주파 공간적 필터링 : 한 영상의 세세한 부분들을 제거

% 블러링은 이웃 화소들과 평균한 결과임.

[R,C] = size(gray_image);

bluring33_gray_image(R,C)=zeros;

bluring55_gray_image(R,C)=zeros;

bluring77_gray_image(R,C)=zeros;

bluring1515_gray_image(R,C)=zeros;

gray_image = double(gray_image); % double 형으로 변환

% 3*3 평균마스크로 블러링된 결과

for i=1:R-2

for j=1:C-2

bluring33_gray_image(i+1,j+1) = gray_image(i,j)*(1/9) + ...

gray_image(i,j+1)*(1/9) + gray_image(i,j+2)*(1/9)+ ...

gray_image(i+1,j)*(1/9) + gray_image(i+1,j+1)*(1/9) +...

gray_image(i+1,j+2)*(1/9) +...

gray_image(i+2,j)*(1/9) + gray_image(i+2,j+1)*(1/9) +...

gray_image(i+2,j+2)*(1/9);

end;

end;

% 윤종수님께서 아래의 내용이 잘못되었음을 알려주셨습니다.

% 원 내용은 5*5 마스크로 처리해야 하나 3*3 마스크로 처리된것입니다.

% 5월 6일자로 다시 수정한 결과를 게재합니다.

% 그리고 알려주신 윤종수(제주대학교 전자공학과 석사과정)님께 감사드립니다.

Page 50: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

% 5*5 평균마스크로 블러링된 결과 - 수정!

for i=1:R-4

for j=1:C-4

bluring55_gray_image(i+2,j+2) = gray_image(i,j)*(1/25) +...

gray_image(i,j+1)*(1/25) + gray_image(i,j+2)*(1/25)+ ...

gray_image(i,j+3)*(1/25) + gray_image(i,j+4)*(1/25)+ ...

gray_image(i+1,j)*(1/25) + gray_image(i+1,j+1)*(1/25) +...

gray_image(i+1,j+2)*(1/25) +...

gray_image(i+1,j+3)*(1/25) + gray_image(i+1,j+4)*(1/25)+...

gray_image(i+2,j)*(1/25) + gray_image(i+2,j+1)*(1/25) +...

gray_image(i+2,j+2)*(1/25)+...

gray_image(i+2,j+3)*(1/25) + gray_image(i+2,j+4)*(1/25)+ ...

gray_image(i+3,j)*(1/25) + gray_image(i+3,j+1)*(1/25) +...

gray_image(i+3,j+2)*(1/25)+...

gray_image(i+3,j+3)*(1/25) + gray_image(i+3,j+4)*(1/25)+ ...

gray_image(i+4,j)*(1/25) + gray_image(i+4,j+1)*(1/25) +...

gray_image(i+4,j+2)*(1/25)+...

gray_image(i+4,j+3)*(1/25) + gray_image(i+4,j+4)*(1/25);

end;

end;

% 다른종류의 회선마스크 - 가우시안 잡음 제거

gausain_gray_image(R,C)=zeros;

for i=1:R-2

for j=1:C-2

gausian_gray_image(i+1,j+1) = gray_image(i,j)*(1/16) + ...

gray_image(i,j+1)*(1/8) + gray_image(i,j+2)*(1/16) + ...

gray_image(i+1,j)*(1/8) + gray_image(i+1,j+1)*(1/4) +...

gray_image(i+1,j+2)*(1/8) + ...

gray_image(i+2,j)*(1/16) + gray_image(i+2,j+1)*(1/8) +...

gray_image(i+2,j+2)*(1/16);

end;

end;

Page 51: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

figure(1);

subplot(2,2,1); imshow(mat2gray(gray_image));

subplot(2,2,2); imshow(mat2gray(bluring33_gray_image));

subplot(2,2,3); imshow(mat2gray(bluring55_gray_image));

subplot(2,2,4); imshow(mat2gray(gausian_gray_image));

----------------------------------------------------------------

잡음이라는 건 noise 로서 우리가 알고 있는 시끄러운 소음이 아니라, 영상에서 화소값이

불규칙하게 있다거나 보기싫은 점이 보이는 것을 가리키는 겁니다. 그 잡음은 2 가지로나누

어 볼 수 있는데, 가우시안 잡음(Gaussian Noise)과 임펄스(Impulse Noise = SpikeNoise) 입니다.

전자의 경우는 블러링을 이용해 가우시안 잡음을 제거할 수 있으며, 후자의 경우는 0과 255

같은 극단적인 값으로 이루어진 잡음이기 때문에 평균처리를 하는 블러링 기법 특징상 제거

할 수 없습니다. 따라서 미디안필터(Median filter)를 이용해야합니다. (미디언 필터는요 나중에

설명하겠습니다.) 여기서 가우시안 잡음을 제거하기 위한 블러링의 기법이 있는데, 회선

은 조금 특수하죠. 아래 회선 마스크를 보세요.

| 1/16 1/ 8 1/16 |

| 1/ 8 1/ 4 1/ 8| → 모든 계수들의 합은 1

| 1/16 1/ 8 1/16 |

위에 보인 회선 마스크를 자알 보면, 평균 출력영상의 밝기에 영향을 끼치지 않게 하는

특징을 가지고 있습니다. 이해가 가시죠?

가우시안 필터가 있는데 이것도 보여드릴까요? ^^;

%---------------------[ 2. 가우시안 필터 ]----------------------------

% 출처는 인터넷 어디선가 있는데요.. 옛날에 만들어진것이라서

% 손을 좀 봤습니다. 탁탁~!!!

%

% Modifed by 이문호 ([email protected])

%

clear;

Page 52: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

% Parameters of the Gaussian filter:

n1=10;sigma1=3;n2=10;sigma2=3;theta1=0;

% The amplitude of the noise:

noise=0.1;

color_image=imread('p9.jpg'); % 수정

x = rgb2gray(color_image); % 수정

filter1=d2gauss(n1,sigma1,n2,sigma2,theta1); % theta -> theta1로 수정

x_rand=noise*randn(size(x)); % 잡음 넣는 코드입니다.

y=double(x)+double(x_rand);

f1=conv2(x,filter1,'same');

rf1=conv2(y,filter1,'same');

figure(1);

subplot(2,2,1);imagesc(x);title('lena');

subplot(2,2,2);imagesc(y);title('noisy lena');

subplot(2,2,3);imagesc(f1);title('smooth');

subplot(2,2,4);imagesc(rf1);title('noise cancel');

colormap(gray);

------------ 여기서 d2gauss 함수입니다. ---------

function h = d2gauss(n1,std1,n2,std2,theta1)

r=[cos(theta1) -sin(theta1);

sin(theta1) cos(theta1)];

for i = 1 : n2

for j = 1 : n1

u = r * [j-(n1+1)/2 i-(n2+1)/2]';

h(i,j) = gauss(u(1),std1)*gauss(u(2),std2);

end

end

h = h / sqrt(sum(sum(h.*h)));

Page 53: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

-------- 여기서 gauss.m 입니다. ----------

function y = gauss(x,std)

y = exp(-x^2/(2*std^2)) / (std*sqrt(2*pi));

----------------------------------------------------------------

저도 헷갈리니깐 한번 더 말하자면 가우시안 필터링은 블러링 기법의 한종류라고 할수 있으

며, 블러링은 영상의 세세한 부분을 제거하니깐 스무딩하게 만든다는 말이 되죠? 따라서

그냥 가우시안 필터링이다 하면 영상 스무딩한다고 간단히 기억해두시면 됩니다 영상에는

반드시 저주파와 고주파 성분이 들어 있어요. 먼저 주파수라는 말을 해볼까요. 간단히는 화

소값의 변화율을 의미합니다. 그러면 저주파는 화소값의 변화율이 작은 주파수이되, 고주파

는 화소값의 변화율이 큰 주파수라죠. 이때 영상안에서 저주파 성분을 제거하게 되면 화소

값의 변화율이 작은 것 제거하니까즉 영상의 세세한 부분이 제거 된다면 결국 희미하게 보

인다는 거죠. 따라서 블러링이나 저주파 통과 필터링은 영상의 대비를 약화시키게 된다는

것입니다. 사유를 알아보자면 블러링의 경우, 평균처리하기 때문에 즉 이웃화소들에 대하여

극단적인 값을 줄여주죠. 결국 영상의 대비를 약화 시키죠

* 샤프닝 편

블러링이면 영상의 세세한 부분 제거한다고 하니깐 거꾸로~ 세세한 부분을 두드러지게하는

것입니다. 두드러지게 한다는 것은 두드러기가 나는뜻이 아니라 강조한다는 거죠. 사용되

는 회선 마스크는요 마스크의 중심값만 양의 값을 가지되 나머지 계수들은 음의값을 가지게

되죠. 아래 회선마스크를 보세요.

| 0 -1 0 | | -1 -1 -1 |

| -1 5 -1 | | -1 9 -1 |

| 0 -1 0 | | -1 -1 -1 | → 3*3 마스크의 경우, 모든 계수들의 합은 +

고주파의 경우는 영상의 화소값 변화율이 높은 것이라고... 그러면 결국 샤프닝은

세세한 부분을 강조하므로 고주파 통과 필터링의 한종류라는 것!

고주파 통과 필터를 만들기 위해선 영상의 평균값과 같은 저주파 요소만 깡끄리 제거한후,

세세한 부분들만 보여주면 되겠죠. 그러면 이를 위한 일반적인 고주파 통과 필터회선 마스

크를 예로 보여드립니다.

Page 54: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

| -1/9 -1/9 -1/9 |

| -1/9 8/9 -1/9 |

| -1/9 -1/9 -1/9 | → 3*3 마스크의 경우, 모든 계수들의 합은 zero

--------------------[4.1 샤프닝] ---------------------------------

%

% Coding by 이문호 ([email protected])

%

% 샤프닝

% 크리스프닝이라고 하며, 영상에서 상세한 부분들을 더욱 강조한다.

% 샤프닝에 사용되는 회선 마스크는 마스크의 중심에서는

% 양의값을 가지며 바깥 경계는 음의 값을 갖게 된다.

clear all;

filename='ind.jpg'; % 독립기념관 영상임.

color_image = imread(filename);

gray_image = rgb2gray(color_image);

[R,C] = size(gray_image);

new_sharp_one(R,C) = zeros;

new_sharp_two(R,C) = zeros;

new_sharp_three(R,C) = zeros;

gray_image = double(gray_image);

% 샤프닝 마스크 1

% 0 -1 0

% -1 5 -1

% 0 -1 0

for i=1:R-2

for j=1:C-2

new_sharp_one(i+1,j+1) = gray_image(i,j)*(0.0) + gray_image(i,j+1)*(-1.0) +...

Page 55: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

gray_image(i,j+2)*(0.0) + ...

gray_image(i+1,j)*(-1.0) + gray_image(i+1,j+1)*(5.0) +...

gray_image(i+1,j+2)*(-1.0) + ...

gray_image(i+2,j)*(0.0) + gray_image(i+2,j+1)*(-1.0) +...

gray_image(i+2,j+2)*(0.0);

end;

end;

% 샤프닝 마스크 2

% -1 -1 -1

% -1 9 -1

% -1 -1 -1

for i=1:R-2

for j=1:C-2

new_sharp_two(i+1,j+1) = gray_image(i,j)*(-1.0) + gray_image(i,j+1)*(-1.0) +...

gray_image(i,j+2)*(-1.0) + ...

gray_image(i+1,j)*(-1.0) + gray_image(i+1,j+1)*(9.0) +...

gray_image(i+1,j+2)*(-1.0) + ...

gray_image(i+2,j)*(-1.0) + gray_image(i+2,j+1)*(-1.0) +...

gray_image(i+2,j+2)*(-1.0);

end;

end;

% 샤프닝 마스크 3

% 1 -2 1

% -2 5 -2

% 1 -2 1

for i=1:R-2

for j=1:C-2

new_sharp_three(i+1,j+1) = gray_image(i,j)*(1.0) + gray_image(i,j+1)*(-2.0) +...

gray_image(i,j+2)*(-1.0) + ...

gray_image(i+1,j)*(-2.0) + gray_image(i+1,j+1)*(5.0) +...

gray_image(i+1,j+2)*(-2.0) + ...

gray_image(i+2,j)*(1.0) + gray_image(i+2,j+1)*(-2.0) +...

Page 56: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

gray_image(i+2,j+2)*(1.0);

end;

end;

figure(1);

subplot(2,2,1); imshow(mat2gray(gray_image));

subplot(2,2,2); imshow(mat2gray(new_sharp_one));

subplot(2,2,3); imshow(mat2gray(new_sharp_two));

subplot(2,2,4); imshow(mat2gray(new_sharp_three));

%--------------------------------------------------------------------------------

그리고 샤프닝의 다른 기법인 고주파 지원(high-boost) 필터링이 있는데요. unsharp masking

을 좀 응용해서, 원 영상의 밝기를 증가시킨후 저주파 영상을 뺌으로서 감한 과정이 고주파

지원 필터링이라 합니다..

High-Boost = αOriginal - Lowpass

α가 1으로 주어진다면 고주파 통과 필터링 된 것과 같으되, α > 1 이면 원 영상에 고

주파 통과 필터링 된 결과가 더해지게 되죠. 후.. 사용되는 회선 마스크를 한번 살펴볼까요?

| -α/9 -α/9 -α/9 |

| -α/9 -w/9 -α/9 |

| -α/9 -α/9 -α/9 |→ w=9α -1 임에 주목하라!

if α=1 then 고주파 지원 통과 필터링

if α>1 then 고주파 통과 필터링이 더해짐.

그러면 다음 고주파 통과 필터링 / 고주파 지원 필터링 α=1.2 / 고주파 지원 필터링

α= 1.5 인 소스 및 결과 영상을 보여드리겠습니다.

%---[4.2 고주파 통과 필터링 / 고주파 지원 지원 필터링]-----------------------

%

% Coding by 이문호 ([email protected])

%

% 고주파 통과 필터링과 고주파 통과 지원 필터링 - 샤프닝의 일종

%

% w = 9*a - 1

Page 57: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

%

clear all;

filename='ind.jpg'; % 독립기념관 영상임.

color_image = imread(filename);

gray_image = rgb2gray(color_image);

[R,C] = size(gray_image);

new_high_boost_one(R,C) = zeros;

new_high_boost_two(R,C) = zeros;

new_high_boost_three(R,C) = zeros;

gray_image = double(gray_image);

% 고주파 통과 필터링,

%

% -1/9 -1/9 -1/9

% -1/9 8/9 -1/9

% -1/9 -1/9 -1/9

%

for i=1:R-2

for j=1:C-2

new_high_boost_one(i+1,j+1) = gray_image(i,j)*(-1/9) +...

gray_image(i,j+1)*(-1/9) + gray_image(i,j+2)*(-1/9) + ...

gray_image(i+1,j)*(-1/9) + gray_image(i+1,j+1)*(8/9) +...

gray_image(i+1,j+2)*(-1/9) + ...

gray_image(i+2,j)*(-1/9) + gray_image(i+2,j+1)*(-1/9) +...

gray_image(i+2,j+2)*(-1/9);

end;

end;

% 고주파 통과 지원 필터링, a = 1.2, w = 9*1.2 -1 = 9.8 인 경우

%

% -1.2/9 -1.2/9 -1.2/9

Page 58: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

% -1.2/9 9.8/9 -1.2/9

% -1.2/9 -1.2/9 -1.2/9

%

for i=1:R-2

for j=1:C-2

new_high_boost_two(i+1,j+1) = gray_image(i,j)*(-1.2/9) +...

gray_image(i,j+1)*(-1.2/9) + gray_image(i,j+2)*(-1.2/9) + ...

gray_image(i+1,j)*(-1.2/9) + gray_image(i+1,j+1)*(9.8/9) +...

gray_image(i+1,j+2)*(-1.2/9) + ...

gray_image(i+2,j)*(-1.2/9) + gray_image(i+2,j+1)*(-1.2/9) +...

gray_image(i+2,j+2)*(-1.2/9);

end;

end;

% 고주파 통과 지원 필터링, a = 1.5, w = 9*1.5 -1 = 13.5 인 경우

%

% -1.5/9 -1.5/9 -1.5/9

% -1.5/9 13.5/9 -1.5/9

% -1.5/9 -1.5/9 -1.5/9

%

for i=1:R-2

for j=1:C-2

new_high_boost_three(i+1,j+1) = gray_image(i,j)*(-1.5/9) +...

gray_image(i,j+1)*(-1.5/9) + gray_image(i,j+1)*(-1.5/9) + ...

gray_image(i+1,j)*(-1.5/9) + gray_image(i+1,j+1)*(13.5/9) +...

gray_image(i+1,j+1)*(-1.5/9) + ...

gray_image(i+2,j)*(-1.5/9) + gray_image(i+2,j+1)*(-1.5/9) +...

gray_image(i+2,j+1)*(-1.5/9);

end;

end;

figure(1);

subplot(2,2,1); imshow(mat2gray(gray_image));

subplot(2,2,2); imshow(mat2gray(new_high_boost_one));

Page 59: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

subplot(2,2,3); imshow(mat2gray(new_high_boost_two));

subplot(2,2,4); imshow(mat2gray(new_high_boost_three));

%--------------------------------------------------------------------------------

★ 샤프닝 기법 - 1) 보통 회선 마스크 사용

2) unsharp masking

3) high-boost filtering

4) Laplacian filter

라플라시안 필터는요 나중에 설명해드리자면 에지추출에 대한 방법중의 하나죠.

샤프닝 기법에 대한 단정은 영상의 세세한 부분을 강조시키게 된다면 영상 화소값의 변화율

이 너무 높아져서(?) 잡음(noise)이 많이 생기게 되는 것입니다.

[ 블러링과 샤프닝의 요약]

◎ Bluring - 영상의 세세한 부분 제거 / 가우시안 잡음 제거,

평균 처리 특징 / 회선 계수들의 합은 1

☞ 영상의 대비 약화!, 임펄스 잡음 제거 할 수 없다!

◎ Sharpning - 영상의 세세한 부분 강조 / 영상 대비 효과를 가짐

보통 회선 계수의 합은 양의 값을 가진다.

※ 고주파 통과 필터 : 회선 계수들의 합은 zero

※ unsharp masking : 원영상 - 저주파 통과 필터링된 영상

※ 고주파 지원 필터 : 원영상의 밝기 증대 - 저주파 통과 필터링된 영상

☞ 영상내의 잡음이 늘어나게 된다.

* 에지 추출 편

에지의 사전적인 의미를 보면 가장자리라는 뜻인데, 우리가 말하는 에지는 영상의 밝기가

낮은 값에서 높은 값으로, 이와 반대로 변하는 지점에 존재하는 부분을 가리킨다. 그러므로

영상안에 있는 객체의 경계(Boundary)를 가리키는 것으로서, 모양(Shape), 방향성(Direction)을

Page 60: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

탐지할 수 있는 등 여러 가지 중요한 정보가 들어 있는 것이 바로에지이다. 실제로 에지는

영상처리의 기본이며 가장 널리 쓰인다고 할 수 있죠. 에지 추출 기법중 가장 단순한 것

으로는 유사연산자 (homogenity operator), 차연산자(difference operator)이다. 이를 이용하여 에

지를 강화/약화를 시키는 경계값(threshold) 처리가 있으며. 이외 복잡한 에지 추출기가 있지

만 조금 있다가 소개할까 합니다.

아래 유사연산자 기법, 차연산자 기법, 경계값 처리 기법을 설명해드리겠습니다. 실은 에

지를 어떻게 이해하느냐에 따라 영상처리 공부를 계속하든지 아니면 때려치우든지 양자 택

일해야 될껍니다.

◎ 유사연산자 기법을 이용한 에지 검출

에지 추출(edge extraction)은 영상분할(image segmentation)의 첫단계로서, 가장 단순하고

빠른 에지 추출기는 유사연산자 에지 추출기이다. 이 추출기는 일련의 화소들을 감산한 값

에서 최대값 결정하는 방법을 가지고 있다. 그 원리는 3×3 블록 중심화소로부터 주변의 8

화소를 각각 감산한 후, 각 차이의 절대값 중 가장 큰 값을 그 화소로 고정시켜 버립니다.

즉 새로운 화소값으로 할당되는 것이죠.

그러면 유사연산자 기법을 담은 소스를 보여드리겠습니다. (여러분의 이해를 돕기 위

해 회선함수 conv2를 쓰지 않았음을 밝힙니다)

%---------------- [4.1 유사연산자 기법 ] ----------------

% Coding by 이문호([email protected])

clear all;

filename='dari.jpg'; % 돌산대교 영상 (여수시에 있음..)

color_image = imread(filename);

gray_image = rgb2gray(color_image);

[R,C] = size(gray_image);

new_similar_op(R,C) = zeros;

gray_image = double(gray_image);

%

Page 61: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

% 유사연산자 수행

%

for i=1:R-2

for j=1:C-2

% 일련의 화소들을 감산한 값을 구하라

temp1 = abs(gray_image(i+1,j+1) - gray_image(i,j));

temp2 = abs(gray_image(i+1,j+1) - gray_image(i,j+1));

temp3 = abs(gray_image(i+1,j+1) - gray_image(i,j+2));

temp4 = abs(gray_image(i+1,j+1) - gray_image(i+1,j));

temp5 = abs(gray_image(i+1,j+1) - gray_image(i+1,j+2));

temp6 = abs(gray_image(i+1,j+1) - gray_image(i+2,j));

temp7 = abs(gray_image(i+1,j+1) - gray_image(i+2,j+1));

temp8 = abs(gray_image(i+1,j+1) - gray_image(i+2,j+2));

% 위에서 구한 값의 최대값을 구하라.

max_value= max(temp1,max(temp2,max(temp3,max(temp4,max(temp5,max(temp6,max(temp7,...

temp8)))));

new_similar_op(i+1,j+1) = max_value;

end;

end;

%--------------------------------------------------------------------------------

◎ 차연산자 기법을 이용한 에지 추출

유사연산자의 경우 8 번 계산하므로 상당히 큰 영상의 경우 계산시간이 많이 소요된다.따

라서 계산시간을 단축할 수 있는 방법으로는 차연산자 에지 추출기가 있다. 이 경우 4 번만

계산하므로, 전자의 경우보다 약 절반정도를 단축할 수 있다는 장점을 가지게 되죠.

%---------------- [4.2 차연산자 기법 ] ----------------

% Coding by 이문호([email protected])

%

% 차연산자 수행

Page 62: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

%

new_minus_op(R,C) = zeros;

for i=1:R-2

for j=1:C-2

% 일련의 화소들을 감산한 값을 구하라

temp1 = abs(gray_image(i,j) - gray_image(i+2,j+2));

temp2 = abs(gray_image(i,j+1) - gray_image(i+2,j+1));

temp3 = abs(gray_image(i,j+2) - gray_image(i+2,j));

temp4 = abs(gray_image(i+1,j+2) - gray_image(i+1,j));

% 위에서 구한 값의 최대값을 구하라.

max_value= max(temp1,max(temp2,max(temp3,temp4)));

%

% 필자가 소개하는 테크닉 공개!

%

% value_array = [temp1, temp2, temp3, temp4];

% max_value = max(value_array);

%

new_minus_op(i+1,j+1) = max_value;

end;

end;

figure(1);

subplot(1,3,1); imshow(mat2gray(gray_image));

subplot(1,3,2); imshow(mat2gray(new_similar_op));

subplot(1,3,3); imshow(mat2gray(new_minus_op));

◎ 경계값을 이용한 에지 강조/약화

영상 경계값 처리의 경우는 보통 에지 추출기와 함께 사용된다. 이것은 강한 에지를 강

하게, 약한 에지를 약화시키는 역할을 한다. 경계값 처리에는 두가지 방법이 있는데, 단일

Page 63: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

경계값과 다중 경계값을 사용하여 처리 할 수 있습니다.

%--------------- [4.3 경계값을 이용한 처리 ] ------------------

% Coding by 이문호([email protected])

&

% 영상임계값을 사용

%

% 에지를 강조하기 위해 에지 검출기와 함께 사용

% 이것은 강한 에지를 강조하고 약한 에지를 약화시킴

%

clear all;

filename='dari.jpg'; % 돌산대교 영상 (여수시에 있음..)

color_image = imread(filename);

gray_image = rgb2gray(color_image);

[R,C] = size(gray_image);

new_similar_op(R,C) = zeros;

new_similar_op_single(R,C) = zeros;

new_similar_op_double(R,C) = zeros;

gray_image = double(gray_image);

% 유사연산자 수행

%

% 유사연산자 수행 방법은 위를 참고하시오.

%

for i=1:R-2

for j=1:C-2

% 일련의 화소들을 감산한 값을 구하라

temp1 = abs(gray_image(i+1,j+1) - gray_image(i,j));

temp2 = abs(gray_image(i+1,j+1) - gray_image(i,j+1));

temp3 = abs(gray_image(i+1,j+1) - gray_image(i,j+2));

Page 64: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

temp4 = abs(gray_image(i+1,j+1) - gray_image(i+1,j));

temp5 = abs(gray_image(i+1,j+1) - gray_image(i+1,j+2));

temp6 = abs(gray_image(i+1,j+1) - gray_image(i+2,j));

temp7 = abs(gray_image(i+1,j+1) - gray_image(i+2,j+1));

temp8 = abs(gray_image(i+1,j+1) - gray_image(i+2,j+2));

% 위에서 구한 값의 최대값을 구하라.

max_value=...

max(temp1,max(temp2,max(temp3,max(temp4,max(temp5,max(temp6,max(temp7,...

temp8)))));

new_similar_op(i+1,j+1) = max_value;

end;

end;

%

% 이제 단일임계값을 사용해보자.

% 임계값을 48로 한다. 48이하는 0으로 48이상은 최대값 255로 설정

%

for i=1:R-2

for j=1:C-2

if new_similar_op(i,j) <= 48

new_similar_op_single(i,j) = 0;

else

new_similar_op_single(i,j) = 255.0;

end;

end;

end;

%

% 다음은 두개의 임계값을 사용해보자.

% 임계값을 48과 192로 한다.

% 48이하는 0, 48과 192사이는 그대로, 192이상은 255로 설정

%

Page 65: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

for i=1:R-2

for j=1:C-2

if new_similar_op(i,j) <= 48

new_similar_op_double(i,j) = 0;

elseif new_similar_op(i,j) >= 192

new_similar_op_double(i,j) = 255.0;

else

new_similar_op_double(i,j) = new_similar_op(i,j);

end;

end;

end;

figure(1);

subplot(1,3,1); imshow(mat2gray(gray_image));

subplot(1,3,2); imshow(mat2gray(new_similar_op_single));

subplot(1,3,3); imshow(mat2gray(new_similar_op_double));

%--------------------------------------------------------------------------------

* 1차 미분 편

1차미분은 First-Order Differential operator라고 하죠. 이를 사용한 에지 추출기가 Gradient

Edge Dector 입니다. 이 용어는요 여러분이 실제로 영상처리의 에지부분을연구할 때 귀가

따갑게 접하게 되는 것이니 꼬옥~ 기억하세요. 5 장 에지추출 편에서 가장 단순한 에지추출

인 유사연산자, 차연산자를 이용한 결과를 보면 에지라는 정의을 확실하게 만족할 수 없을

껍니다. 보면 에지인거 맞는데 자세히 보면 변화되는 부분이 좀 이상하다는 느낌이 들 것입

니다. 에지는 화소값이 급격하게 변화하는 부분이기 때문에, 변화분을 탐지해내어 계산해

주는 미분 연산이 에지 추출에 사용될 수 있는 방법이 있습니다. 따라서 이번에는 '1 차

미분'의 '미분'에 보다시피 수평과 수직방향을 구해서, 이를합쳐 변화분 즉 기울기를 구합니

다. 왜 기울기가 필요하느냐면, 에지 모양은 root 모양,line 모양, setp 모양, ramp 모양등 다양

하죠. 여기서 방향정보를 얻는다는건 에지 모양을 분석하는 것이기 때문이죠. 고로 방향은

기울기라도 봐도 무방할꺼라고 봅니다.

1차미분의 공식은 다음과 같습니다.

1차미분결과 = abs(수평회선결과) + abs(수직회선결과)

Page 66: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

또는 1차미분 결과 = sqrt( 수평회선결과^2 + 수직회선결과^2)

수학적으로 옮겨드리자면요...

H(x,y) = abs(H_r(x,y)) + abs(H_c(x,y))

≒sqrt(H_r(x,y)^2 + H_c(x,y)^2)

(각 r, c는 row, col 즉 수평, 수직을 가리킵니다)

그럼.. 이번에는 먼저 Roverts, Prewitt 에지 추출에 대해 공부해봅시다.

6.1 Roberts, Prewitt

Roberts 라는 건요. 절대로 로봇이 아니구요, 로버츠라고 합니다. 이 로버츠 연산자는 다른

마스크의 크기보다 작아서, 시간처리면에서 효율적이라고 할 수 있습니다. 근데 돌출된 값을

평균화 못하는 바람에 잡음에 너무 민감한 약점을가지고 있습니다. Prewitt 는요 Roberts 와

달리 돌출된 값을 평균화합니다. 단점이 있긴합니다. 바로 수평, 수직에지에 넘넘~ 민감해요.

이해 안가시면 회선 마스크를 한번 살펴보세요.

아래 소스를 보세요.

그다음 Prewiit도 마찬가지입니다.

--------------------------------------------------------------------------------

% coding by 이문호 ([email protected])

%

% prewitt (프리윗) 연산, Robert(로버츠)연산

%

clear all;

filename='dari.jpg';

color_image = imread(filename);

gray_image = rgb2gray(color_image);

[R,C] = size(gray_image);

Page 67: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

new_prewitt_row(R,C) = zeros;

new_prewitt_col(R,C) = zeros;

new_prewitt_row_col(R,C) = zeros;

new_roberts_row(R,C) = zeros;

new_roberts_col(R,C) = zeros;

new_roberts_row_col(R,C) = zeros;

gray_image = double(gray_image);

for i=2:R-1

for j=2:C-1

%%%%%%%%%%%%% prewitt %%%%%%%%%%%%%

%

% 제가 좀 귀찮아서... 회선마스크중 0을 제외한 부분만 곱했습니다.

%

% 수평 연산

new_prewitt_row(i,j) = abs(gray_image(i-1,j-1) + ...

gray_image(i,j-1)+gray_image(i+1,j-1) - gray_image(i-1,j+1)...

- gray_image(i,j+1) - gray_image(i+1,j+1));

% 수직 연산

new_prewitt_col(i,j) = abs(gray_image(i+1,j-1) + ...

gray_image(i+1,j)+gray_image(i+1,j+1) - gray_image(i-1,j-1)...

- gray_image(i-1,j) - gray_image(i-1,j-1));

% 수평-수직 연산

new_prewitt_row_col(i,j) = abs(new_prewitt_row(i,j) + ...

new_prewitt_col(i,j));

%%%%%%%%%%%% roberts %%%%%%%%%%%%%%

Page 68: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

% 수평 연산

new_roberts_row(i,j) = abs(gray_image(i,j) - gray_image(i-1,j-1));

% 수직 연산

new_roberts_col(i,j) = abs(gray_image(i,j) - gray_image(i-1,j-1));

% 수평-수직 연산

new_roberts_row_col(i,j) = abs(new_roberts_row(i,j) + ...

new_roberts_col(i,j));

end;

end;

figure(1); % roberts

subplot(2,2,1); imshow(mat2gray(gray_image));

subplot(2,2,2); imshow(mat2gray(new_roberts_row)); % 수평방향 회선 결과

subplot(2,2,3); imshow(mat2gray(new_roberts_col)); % 수직방향 회선 결과

subplot(2,2,4); imshow(mat2gray(new_roberts_row_col));

figure(2); % prewitt

subplot(2,2,1); imshow(mat2gray(gray_image));

subplot(2,2,2); imshow(mat2gray(new_prewitt_row));% 수평방향 회선 결과

subplot(2,2,3); imshow(mat2gray(new_prewitt_col));% 수직방향 회선 결과

subplot(2,2,4); imshow(mat2gray(new_prewitt_row_col));

%--------------------------------------------------------------------------------

참고로 Roberts 를 구하는 에지처리함수는 MATLAB 에 있습니다.

imshow(edge(gray_image,'roberts'),2) 를 하시면 됩니다.. prewitt 도... 역시 'roberts' 대신 'prewitt'

로.. 바꾸시면 됩니다.

6.2 Sobel

--------------------------------------------------------------------------------

% coding by 이문호 ([email protected])

%

clear all;

Page 69: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

filename='dari.jpg';

color_image = imread(filename);

gray_image = rgb2gray(color_image);

[R,C] = size(gray_image);

new_sobel_row(R,C) = zeros;

new_sobel_col(R,C) = zeros;

new_sobel_row_col(R,C) = zeros;

gray_image = double(gray_image);

for i=2:R-1

for j=2:C-1

%%%%%%%%%%%%% sobel %%%%%%%%%%%%%

%

% 수평 연산

new_sobel_row(i,j) = abs(gray_image(i-1,j-1) + ...

2.0*gray_image(i,j-1)+gray_image(i+1,j-1) - gray_image(i-1,j+1)...

- 2.0*gray_image(i,j+1) - gray_image(i+1,j+1));

% 수직 연산

new_sobel_col(i,j) = abs(gray_image(i+1,j-1) + ...

2.0*gray_image(i+1,j)+gray_image(i+1,j+1) - gray_image(i-1,j-1)...

- 2.0*gray_image(i-1,j) - gray_image(i-1,j-1));

% 수평-수직 연산

new_sobel_row_col(i,j) = abs(new_sobel_row(i,j) + ...

new_sobel_col(i,j));

end;

end;

figure(1);

subplot(2,2,1); imshow(mat2gray(gray_image));

Page 70: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

subplot(2,2,2); imshow(mat2gray(new_sobel_row)); % 수평방향 회선 결과

subplot(2,2,3); imshow(mat2gray(new_sobel_col)); % 수직방향 회선 결과

subplot(2,2,4); imshow(mat2gray(new_sobel_row_col));

%--------------------------------------------------------------------------------

참.. Sobel 를 구하려면, imshow(edge(gray_image,'sobel'),2) 를 하시면 됩니다. Edge 함

수가 여러모로 유용하군요. 시간 절약면에서.. -.-; 여러분~! Image processing ToolBox에 들

어 있는 함수를 사용한다는 것과 직접 구현하는 것중 어느것을 선택할런지요?

제가 생각하기로는, 영상처리를 처음 배우는 분의 경우는 직접 구현하는 길만이 영상처

리의 기초를 닦아 준다고 보고 있습니다. 그후 어느정도가 되면 함수를 사용하는게 좋습니

다. 저도 그런 절차를 밟아가고 있는 중이죠...

이하~ 1차미분인 Roberts, Prewitt, Sobel 연산자들을 요약해보기로 하죠..

● Roberts

--- 장점 : 다른 마스크의 크기보다 작아 효과적으로 사용된다.

--- 단점 : 돌출된 값을 잘 평균할 수가 없다. 잡음에 민감하다.

● Prewitt

--- 장점 : 돌출된 값을 비교적 평균화 된다.

--- 단점 : 수평과 수직에 놓여진 에지에 민감하게 반응.

● Sobel

--- 장점 : 돌출된 값을 비교적 평균화 된다.

--- 단점 : 대각선 방향에 놓여진 에지에 민감하게 반응.

* 2차 미분 편

1차 미분의 경우는 연산자가 에지가 존재하는 영역을 지나면 민감하게 반응하게 됩니다. 그

래서 이를 완화시킬 목적으로 즉 둔감하게 하기 위해서 쓰여지는 방법인, 2차미분 연산자인

Laplacian, LoG(Laplacian of Gaussina), DoG(Difference of Gauss-ian)등 3가지로 분류될 수 있습니

다. 이 방법의 또 다른 장점은 추출된 에지 윤곽선이 폐곡선을 이루게 되는 것이죠. 여

기서 이해 못하실 분이 계실 것 같은 느낌이 드네요. 그러면.. 1차 미분에서 수평,수직, 대각

선 방향에 놓여진 에지에 너무 민감하게 반응하는 단점을 보완하기 위한 방법이 바로 2 차

미분입니다. 따라서 그 2 차 미분은 반응하는 부분을 둔화시킴과 동시에에지를 더욱 강조하

Page 71: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

게 되는 효과를 산출하게 된다는 것입니다.

7.1. Laplacian (라플라시안)

라플라시안 연산자(Laplacian operator)는 에지의 방향을 단일화 시켜, 모든 방향에대해 큰

값을 가지게 하는 역할을 하죠. 결국 다른 연산자보다 더욱 더 두드러진 에지를추출하게 되

는셈....

회선 마스크로는 3가지 종류가 있습니다.

1) | 0 -1 0 |

| -1 4 -1 |

| 0 -1 0 | ※ 4 방향 에지 추출시 사용

2) | -1 -1 -1 |

| -1 8 -1 |

| -1 -1 -1 | ※ 8 방향 에지 추출시 사용

3) | 1 -2 1 |

| -2 4 -2 |

| 1 -2 1 | ※ 3)의 경우 잘 안쓰이는 마스크입니다.

1),2),3) 의 회선 마스크의 합이 0입니다! 꼬옥 기억하세요!

여기서 주의해야 할 것은 '2 차 미분'이라고 1 차 미분 거친 결과영상을 라플라시안 연산을

적용하는게 아닙니다. 왜냐면 라플라시안 연산 자체에는 바로 2 번씩이나 미분하는 공식이

있기 때문이죠. 이점을 명심하세요. 실제로 어떤 책에는 1차 미분한 영상에 2차 미분 해

야 한다고 나온 반면, '영상처리이론과 실제' 책은 어떻게 구현되는지 언급되어 있지 않았습

니다. 결국 라플라시안 공식을 찾아서 이를 두고 고민한 끝에, 원영상을 라플라시안 연산자

를 적용키로 햇습니다. 참.. 공식을 직접 적어드리고 싶은데, 라플라시안 공식 자체가 무

척 까다로와서... 수학전공에 나오는 라플라시안이 있으니까 그 책을 참고 하세요. 그리고

에지 추출하게 되면 이 영상이 바로 이진 영상(Binary image)임을 또 가슴에 담아두세요.

%--------------------------------------------------------------------------------

%Coding by 이문호 ([email protected])

% laplacian operator

clear all;

Page 72: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

c_img = imread('dari.jpg');

g_img = rgb2gray(c_img);

g_img = double(g_img);

[R,C] = size(g_img);

new_la_img1 = zeros(R,C);

new_la_img2 = zeros(R,C);

new_la_img3 = zeros(R,C);

for i=2:R-1

for j=2:C-1

% 1)번의 회선마스크를 적용

new_la_img1(i,j) = g_img(i-1,j-1)*(0.0) + ...

g_img(i-1,j)*(-1.0) + g_img(i-1,j+1)*(0.0)+...

g_img(i,j-1)*(-1.0) + g_img(i,j)*(4.0)+...

g_img(i,j+1)*(-1.0) + g_img(i+1,j-1)*(0.0)+...

g_img(i+1,j)*(-1.0) + g_img(i+1,j+1)*(0.0);

% 2번의 회선 마스크를 적용

new_la_img2(i,j) = g_img(i-1,j-1)*(-1.0) + ...

g_img(i-1,j)*(-1.0) + g_img(i-1,j+1)*(-1.0)+...

g_img(i,j-1)*(-1.0) + g_img(i,j)*(8.0)+...

g_img(i,j+1)*(-1.0) + g_img(i+1,j-1)*(-1.0)+...

g_img(i+1,j)*(-1.0) + g_img(i+1,j+1)*(-1.0);

% 3번의 회선 마스크를 적용

new_la_img3(i,j) = g_img(i-1,j-1)*(1.0) + ...

g_img(i-1,j)*(

Page 73: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

-2.0) + g_img(i-1,j+1)*(1.0)+...

g_img(i,j-1)*(-2.0) + g_img(i,j)*(4.0)+...

g_img(i,j+1)*(-2.0) + g_img(i+1,j-1)*(1.0)+...

g_img(i+1,j)*(-2.0) + g_img(i+1,j+1)*(1.0);

end;

end;

figure(1);

subplot(2,2,1); imshow(mat2gray(g_img));

subplot(2,2,2); imshow(im2bw(new_la_img1));

subplot(2,2,3); imshow(im2bw(new_la_img2));

subplot(2,2,4); imshow(im2bw(new_la_img3));

%--------------------------------------------------------------------------------

함수를 이용한 방법

%--------------------------------------------------------------------------------

%Coding by 이문호 ([email protected])

clear all;

g_img = rgb2gray(imread('dari.jpg'));

h = fspecial('laplacian');

laplacian_image = conv2(g_img,h); % conv2 를 사용했음...

imshow(laplacian_image);

%--------------------------------------------------------------------------------

암튼 1 차 미분의 경우 에지의 모습이 연하지만, 라플라시안 회선마스크를 적용시킨 2 차

미분의 경우 에지가 진하게 되며 선명하게 보이나 굵게 됩니다. 그리고 이 라플라시안

회선 마스크를 적용하게 되면 에지 부분서 부호가 바뀌게 됩니다. 즉 잡음에 민감하게 반응

이 되는데, 이를 해결하기 위해선 영교차(zero -cros-sing) 기법을 써야 합니다. 제가 참고로

했던 '영상처리 이론과 실제'에서는 임계값을 이용한 영교차 기법이 있다고 하는데, 아닌 것

같다고 판단하고 있습니다.그러므로 에지가 존재하는 곳이 화소(픽셀)값이 + 에서 - 로, -에

Page 74: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

서 +로 바뀌는 부분이라는 점을 착안한 아이디어에서 나온 것이 영교차 기법이므로, 다른

책에서 나온 소스의 원리를 이용하여 소스를 작성하겠습니다.

이제 소스를 보여드리겠습니다. 윗 소스를 이용하는 대신, 강의량 및 시간을 줄이고자..

conv2, fspecial 사용합니다.

7.2 LoG (Laplacian of Gaussian)

Laplacian 즉 라플라시안을 쓸 경우 잡음에 민감하게 된다고 미리 말씀 드렸죠? 따라

서 우리가 잡음을 둔화시키려면 어떻게 할까 고민해봅시다. 잡음을 줄여서 민감하게 하지

않게 된다면 어떨까... 고로 잡음을 줄여주는 Gaussian Smoothing을 적용한후, 강조된(두드러

진) 에지를 추출하는 라플라시안 적용해보자. 그렇게 되면 단순히라플라시안을 적용한 것

보다 좀 더 나올까? 이것을 가리켜 Laplacian + Gaussian =Laplacian of Gaussian 이라는 용어가

탄생된다.

LoG 구현과 관련된 소스

%--------------------------------------------------------------------------------

% Modifed by 이문호 ([email protected])

clear all;

% Parameters of the Gaussian filter:

n1=10;sigma1=3;n2=10;sigma2=3;theta1=0;

% The amplitude of the noise:

noise=0.1;

color_image=imread('dari.jpg'); % 수정

x = rgb2gray(color_image); % 수정

filter1=d2gauss(n1,sigma1,n2,sigma2,theta1); % theta -> theta1로 수정

x_rand=noise*randn(size(x));

y=double(x)+double(x_rand);

f1=conv2(x,filter1,'same');

rf1=conv2(y,filter1,'same');

figure(1);

subplot(2,2,1);imagesc(x);title('orginal');

subplot(2,2,2);imagesc(y);title('noisy original');

subplot(2,2,3);imagesc(f1);title('smooth');

Page 75: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

subplot(2,2,4);imagesc(rf1);title('noise cancel');

colormap(gray);

% laplacian execute...

gray_image = f1;

[R,C] = size(gray_image);

laplacian_image=zeros(R,C);

for i=2:R-1

for j=2:C-2

% not use conv2 function!

laplacian_image(i,j) = gray_image(i-1,j-1)*(0.0) + ...

gray_image(i-1,j)*(-1.0)+ gray_image(i-1,j+1)*(0.0) +...

gray_image(i,j-1)*(-1.0) + gray_image(i,j)*(4.0)+...

gray_image(i,j+1)*(-1.0) + gray_image(i+1,j-1)*(0.0) +...

gray_image(i+1,j)*(-1.0) + gray_image(i+1,j+1)*(0.0);

end;

end;

figure(2);

subplot(1,2,1); imshow(mat2gray(gray_image)); title('gaussian smoothing');

subplot(1,2,2); imshow(im2bw(laplacian_image),0.4); % [0,1]시 경계값 0.4 줌..

title('LoG 거친 영상');

------------ 여기서 d2gauss 함수입니다. ---------

function h = d2gauss(n1,std1,n2,std2,theta1)

r=[cos(theta1) -sin(theta1);

sin(theta1) cos(theta1)];

for i = 1 : n2

for j = 1 : n1

u = r * [j-(n1+1)/2 i-(n2+1)/2]';

h(i,j) = gauss(u(1),std1)*gauss(u(2),std2);

end

Page 76: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

end

h = h / sqrt(sum(sum(h.*h)));

-------- 여기서 gauss.m 입니다. ----------

function y = gauss(x,std)

y = exp(-x^2/(2*std^2)) / (std*sqrt(2*pi));

%--------------------------------------------------------------------------------

%--------------------------------------------------------------------------------

%Coding by 이문호 ([email protected])

clear all;

g_img = rgb2gray(imread('dari.jpg'));

h = fspecial('log');

log_image = conv2(g_img,h); % conv2 를 사용했음...

imshow(log_image);

% 참고로 먼저 가우시안 필터 적용후 라플라시안 적용하는 방법을 생각해볼 수 있다.

%

% 예상되는 소스.. (온라인상으로 쓴 것임을 밝힘)

%

% h1 = fspecial('gaussian',3,1.6); % 1.6은 분산값, 제가 임의로 정했음.

% gau_image = conv2(g_img,h1);

% h2 = fsepcial('laplacian');

% la_img = conv2(gau_image,h2);

% imshow(la_img);

%

% --------------------------------------------------------------------------------

라플라시안 방법과 LoG 방법의 결과가 좀 틀리네요. -.-;왜냐면 fspecial 쓸 때의 분산과 위에

쓰여진 분산값이 서로 다르기 때문이죠. 암튼 어느 기법을 쓰던지 각 장단점이 있긴 마련이

므로, LoG 도 예외가 아닙니다. 공식에 보다시피 계산시간이 상당히 소요되죠. 그러므로 이

것을 해결하기 위한 방법으로는 DoG(Differential of Gaussian) 입니다. 이 DoG 는 아래에 설

Page 77: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

명해드리구요, 왜 LoG가 Maxican Filter라고 불리우는 까닭은 궁금하지 않죠?

7.3 DoG (Differential of Gaussian)

DoG 의 경우 각 가우시안 연산에 분산값을 서로 다르게 주구 차를 구하여 에지맵을 구하는

원리이므로, 여러분께서 소스를 한번 짜보세요. 참고로 가우시안 연산을 통해 구하는 법은

LoG의 Gaussian 부분에 있습니다.

DoG 부분도 역시.. conv2와 fspecial 두 개를 사용하여 보여드리겠습니다. 각 분산값

이 1.6 과 1.0으로 주어진다고 가정한후, 적용되는 소스입니다.

%--------------------------------------------------------------------------------

%Coding by 이문호 ([email protected])

clear all;

g_img = rgb2gray(imread('dari.jpg'));

h1 = fspecial('gaussian',3,1.6);

h2 = fspecial('gaussian',3,1.0);

gaussian_img1 = conv2(g_img,h1);

gaussian_img2 = conv2(g_img,h2);

DoG_img = gaussian_img1 - gaussian_img2;

imshow(DoG_img);

%--------------------------------------------------------------------------------

* Color Edge 편 컬러 에지 추출

저번에 에지 검출편에서 그레이 레벨 영상가지고 다루었다면, 컬러 영상에서의 에지를

추출하는 거죠. 그러면 컬러 에지 추출은 어떻게 되는 것일까요? 컬러 에지는 에지 추출,

1차 미분, 2차 미분에서 보다시피 에지 추출 방법이 다양하므로 어떻게 한다라고 말씀 드리

긴 뭐합니다. 따라서 기본적인 컬러 에지 추출만을설명하고 다음은 웹에서 소개되는 컬러

에지 추출 방법에 대해 알려드릴까 합니다.

7.1 기본 컬러 에지 추출

컬러 영상에서 에지를 추출한다는 것은 여러분들이 에지를 어떻게 정하느냐에 따른

것이죠. 예로 에지의 정의가 영상의 밝기의 불연속이라는 식입니다. 이렇게 정의을 내리게

Page 78: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

된다면 2가지 방법으로 나누어지는데,

1) HSV 공간에서, 컬러 영상의 밝기 채널인 V 의 에지 추출, 합성

2) RGB 공간에서 각 채널의 에지가 존재한다고 가정, 에지 추출, 합치는 방법

2 번의 경우도 여전히 컬러 영상으로 존재하게 됩니다.

따라서 그 결과를 그레이 에지 맵 생성하기 위해, 아래 공식 따릅니다.

G(x,y) = sqrt(edge_red(x,y)^2 + edge_green(x,y)^2 + edge_blue(x,y)^2)/sqrt(3)

그럼 소스를 보세요.

%--------------------------------------------------------------------------------

% Coding by 이문호([email protected])

% color edge extraction

clear all;

c_img = imread('lena.jpg');

[R,C,X] = size(c_img);

% RGB color space

r_ch = c_img(:,:,1);

g_ch = c_img(:,:,2);

b_ch = c_img(:,:,3);

r_ch_edge = double(edge(r_ch,'prewitt'));

g_ch_edge = double(edge(g_ch,'prewitt'));

b_ch_edge = double(edge(b_ch,'prewitt'));

new_color_edge_map = zeros(R,C,X);

new_color_edge_map(:,:,1) = mat2gray(r_ch_edge);

new_color_edge_map(:,:,2) = mat2gray(g_ch_edge);

new_color_edge_map(:,:,3) = mat2gray(b_ch_edge);

new_gray_edge_map=zeros(R,C);

Page 79: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

new_gray_edge_map = sqrt(r_ch_edge.^2.0 + g_ch_edge.^2.0 +... b_ch_edge.^2.0)/sqrt(3.0);

figure(1);

subplot(1,3,1); imshow(c_img); title('원 영상');

subplot(1,3,2); imshow(new_color_edge_map);title('칼라요소 합친것');

subplot(1,3,3); imshow(mat2gray(new_gray_edge_map));title('그레이 에지맵');

% HSV color space

[H,S,V] = rgb2hsv(c_img);

V_edge = edge(V,'prewitt');

figure(2);

imshow(V_edge); title('밝기 채널에 의해 수행된 결과');

%--------------------------------------------------------------------------------

7.2 Color Edge Detection

국내에선 컬러 에지를 다룬 논문도 별로 없고, 외국에도 그리 많지 않는 듯 합니다.왜냐

하면 에지 추출기법이 많지만 효율적인 것이 없는데다가, 영상에 포함되어 있는에지의 모양

이 너무나 다양해서 추출 한계가 있었습니다. 따라서 특정 분야에 사용되었다라 할까요.. 특

히 컬러영상의 경우라면 더 두말할 나위가 없습니다. 암튼 컬러 영상에서의 에지 추출기

법은 몇가지 종류가 있는데, 여러분들도 한번 찾아보세요. 참고로 제가 참고했던 color edge

추출에 대한 문서입니다.

1) http://graphics.stanford.edu/~jowens/223b/analysis.html : 구현과정 소개

2) http://netro.ajou.ac.kr/~imagelab/color_scale.htm : 칼라 스케일 형태를 이용한 Edge 검출

(아주대학교)

*Median Filter 편

미디안 필터는요, 저번 강의때 가우시안 잡음 제거의 경우는 블러링 또는 저주파 통과 필터

링에서 효과적인 면을 보였다고 했죠? 따라서 임펄스 잡음을 제거하는데는 미디언 필터가

사용됩니다. 그 필터는 저주파 통과 필터(low-pass filter),블러링(blurring) 에 비해 가진 장점

은 임펄스 잡음 제거뿐만 아니라 edge 를 잘 보존하는거죠. 왜냐구요? 임펄스 잡음의 경우

주변의 화소에 영향을 끼치지는 않지만 정작 자신에게는 CIH 바이러스 저리가라 하는데,

영향을 끼치지 않는다는 점을 착안해본다면 평균값 필터보다 중간값을 추출하여 중심화소에

집어넣는 방법이 괜찮겠져...? 그러니까 임펄스 잡음의 경우는 3*3 블록 잡고 블록안에 극단

Page 80: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

적인 값이 존재할 수 있겠죠. 여기서 중간값을 추출한다면.. 주변에 영향을 끼치지 않고 쎄

쎄쎄~ 노올자~ 어울리게 된다 말입니다. 평균값 필터와 다른 점이라면 이미 존재하는 화

소값을 집어넣는다는 것이죠. 그만큼융통성이 크다는 것입니다. 또한 주변의 화소값에 민감

하지 않을뿐더러 극단적인 값만눈물 흘리며 바이바이~ 하구.. 새로운 애인인 블록내의 중간

값만 짝짜궁하죠. 아직 이해 안가신 분에게는 죄송혀라... T_T

제가 구현한 소스와 함께 윤종수님께서 제공해주신 미디언 필터 소스를 보여드립니다. ---

%-----------------------------------------------------------------------------

% Coding by 이문호([email protected])

clear all;

g_img = rgb2gray(imread('lena.jpg'));

% impluse noise 생성

impulse_noise_img = imnoise(g_img,'salt & pepper',0.04);

[R,C] = size(impulse_noise_img);

median_img = zeros(R,C);

temp = zeros(9);

for i=2 : R-1

for j=2 : C-1

temp(1) = impulse_noise_img(i-1,j-1);

temp(2) = impulse_noise_img(i-1,j);

temp(3) = impulse_noise_img(i-1,j+1);

temp(4) = impulse_noise_img(i,j-1);

temp(5) = impulse_noise_img(i,j);

temp(6) = impulse_noise_img(i,j+1);

temp(7) = impulse_noise_img(i+1,j-1);

temp(8) = impulse_noise_img(i+1,j);

temp(9) = impulse_noise_img(i+1,j+1);

tt = sort(temp); % 소팅한다..

new_pixel = tt(5); % 중간값을 넣는다.

median_img(i,j) = new_pixel;

Page 81: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

end;

end;

figure(1);

subplot(1,2,1); imshow(impulse_noise_img); title('임펄스 잡음 영상');

subplot(1,2,2); imshow(mat2gray(median_img)); title('미디언 필터링 거친 결과');

%--------------------------------------------------------------------------------

이번에는 윤종수님께서 작성하신 미디언 필터 소스인데, 가우시안 잡음과 임펄스 잡음이

들어 있는 영상에 대해 미디언 필터를 수행하였습니다. 여기서 눈여겨보아야 할 것은, 노이

즈(잡음) 생성부분입니다.

%--------------------------------------------------------------------------------

% Coding by 윤종수 ([email protected])

function tsi

clear all, close all, clc

c_img = imread('lena.jpg');

g_img = rgb2gray(c_img);

% Gaussian noise (SNR : 20dB)

M=0; V=0.01; %mean, variance

x = double(g_img)/255 + sqrt(V) * randn(size(g_img)) + M;

img_noise1 = uint8(round(max(0, min(x,1))*255));

% Salt & pepper noise

img_noise2 = g_img;

d = 0.02; % noise density

x = rand(size(g_img));

img_noise2(find(x < d/2))= 0;

img_noise2(find(d/2 <= x & x < d)) = 255;

% Gaussian Smoothing and Median Filtering

[gauss_img1, median_img1] = filter_1(img_noise1);

Page 82: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

[gauss_img2, median_img2] = filter_1(img_noise2);

imshow(g_img)

figure(2)

subplot(3,2,1), imshow(img_noise1), title('SNR : 20dB')

subplot(3,2,2), imshow(img_noise2), title('Salt & pepper noise')

subplot(3,2,3), imshow(mat2gray(gauss_img1))

subplot(3,2,4), imshow(mat2gray(gauss_img2))

subplot(3,2,5), imshow(mat2gray(median_img1))

subplot(3,2,6), imshow(mat2gray(median_img2))

% === Gaussian Smoothing and Median Filtering ============

function [gauss_img, median_img] = filter_1(img)

[R,C] = size(img);

conv_img = double(img);

gaussian_mask = [1/16 1/8 1/16; 1/8 1/4 1/8; 1/16 1/8 1/16];

for i=2:R-1

for j=2:C-1

tmp = [conv_img(i-1,j-1) conv_img(i-1,j) conv_img(i-1,j+1);...

conv_img(i,j-1) conv_img(i,j) conv_img(i,j+1);...

conv_img(i+1,j-1) conv_img(i+1,j) conv_img(i+1,j+1)];

gauss_img(i,j) = sum(sum(tmp .* gaussian_mask));

%tmp2 = sort(tmp);

tmp2 = sort(reshape(tmp,1,prod(size(tmp))));

median_img(i,j) = tmp2(5);

end

end

% ======================================================

Page 83: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

* 최소값 / 최대값 필터링 편

최소값 / 최대값 필터링은 극단적인 임펄스 잡음을 제거하는데 훨씬 효율적입니다. 다만 이

경우는 드물죠. 어떤 영상에 임펄스 잡음만 있다고 할 수만 없기 때문이랍니다. 이것이 사용

되는 예는 의료영상에 속합니다. ^^; 다시 정리해보면, 최소값 필터링은 밝은 스파이크(=

임펄스)값을 제거하며, 최대값필터링은 어두운 스파이크값을 제거하게 됩니다. 따라서 높은

대조를 가진 영상에서 특징을 확대시키기 위해 사용되는 기법이라는 것입니다.

자! 아래 소스를 한번 보실까요? 미디언 필터링에서는 중간값을 넣어두는데에 반해, 최

소값 필터링의 경우는 블럭내의 최소값만 넣어주구, 최대값 필터링은 최대값만 넣어둔다는

차이점이 있습니다.

%--------------------------------------------------------------------------------

% 최소/최대값 필터링

% Coding by 이문호([email protected])

clear all;

filename ='im4t.jpg';

color_image = imread(filename);

[R,C,X] = size(color_image);

gray_image = rgb2gray(color_image);

gray_image = double(gray_image);

image_max(R,C) = zeros; % 최대값 필터링 넣을 영상

image_min(R,C) = zeros; % 최소값 필터링 넣을 영상

image_array(9) = zeros;

for i=1:R-2

for j=1:C-2

image_array(1) = gray_image(i,j);

image_array(2) = gray_image(i,j+1);

image_array(3) = gray_image(i,j+2);

Page 84: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

image_array(4) = gray_image(i+1,j);

image_array(5) = gray_image(i+1,j+1);

image_array(6) = gray_image(i+1,j+2);

image_array(7) = gray_image(i+2,j);

image_array(8) = gray_image(i+2,j+1);

image_array(9) = gray_image(i+2,j+2);

% 미디언 필터 구하자. 여기서 최소값에서 최대값으로 넣어본다.

% 내림차순으로 정렬..

% 참고 : 필자가 소트함수를 사용하지 않고 일부러 구현해본 것임!

min_a=0;

minindex=0;

for mm=1:8

minindex=mm;

min_a=image_array(mm);

for yy= mm+1:9

if min_a > image_array(yy)

min_a=image_array(yy);

minindex=yy;

end;

end;

image_array(minindex)=image_array(mm);

image_array(mm)=min_a;

end;

% 최대값 필터링

image_max(i+1,j+1) = image_array(9);

% 최소값 필터링

image_min(i+1,j+1) = image_array(1);

end;

end;

Page 85: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

figure(1);

subplot(1,3,1); imshow(filename); % 잡음 영상

subplot(1,3,2); imshow(mat2gray(image_min));

subplot(1,3,3); imshow(mat2gray(image_max));

%--------------------------------------------------------------------------------

%--------------------------------------------------------------------------------

% Coding by 윤종수 ([email protected])

c_img = imread('img2.jpg');

g_img = rgb2gray(c_img);

[R,C] = size(g_img);

min_img = zeros(R,C);

max_img = zeros(R,C);

for i = 2:R-1

for j=2:C-1

unit_img = g_img(i-1:i+1, j-1:j+1); % 3*3 Matrix

row_array = [unit_img(1,:) unit_img(2,:) unit_img(3,:)]; % 1*9 Vector

min_img(i, j) = min(row_array);

max_img(i, j) = max(row_array);

end

end

subplot(131), imshow(g_img)

subplot(132), imshow(mat2gray(min_img))

subplot(133), imshow(mat2gray(max_img))

%--------------------------------------------------------------------------------

Page 86: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

*Canny 에지 검출기 구현편

Canny 에지 검출기에서, 왜 Canny 가 붙여졌을까요? 에지 검출기이면 뭐시더라..?

유사연산자, 차연산자, 1차미분, 2차미분등 그거 에지 추출하는 기법을 가리키는 거맞죠? 그

리고 에지의 모양이 다른법... 에지를 정확히 추출할 수 없는게 우리의 서글픈 현실이랍니다.

따라서 John Canny 가 에지 검출기에 대한 아래와 같은 정의을 내놓았는데, 이에 맞추어, 구

현된 에지 검출기를 가리켜 Canny 에지 검출기라고 하는 것 같습니다.

1) 좋은 검출 (good detection)

2) 좋은 국부화 (good localization)

3) 하나의 에지에 대응한 결과 (response to a single edge)

John Canny 가 제시한 3 가지 기준을 만족하는 에지 검출기를 가리켜 Canny 에지 검출기라

고 부른답니다.

그럼... 방법을 한번 볼까요?

1. 가우시안 마스크로 영상을 회선한다.

2. 각각의 결과 화소들에서 기울기 요소를 계산한다.

3. 각 화소에서 기울기 방향을 계산한다.

4. 각 화소의 기울기 방향을 따라서 2차 미분을 계산한다.

5. 2차미분에서 0값의 위치를 찾는다.

6. 0의 값을 가진 점들을 에지 점으로 분류한다.

그럼, 아래 소스를 설명하기로 할까 합니다. 다만 아래의 소스를 보면, 기울기 요소 계산前

가우시안 마스크로 영상을 회선하는 과정이 보여지는데, 이것을 참고 참아서 한번 이해해

보도록 노력해보세요.

%--------------------------------------------------------------------------------

% canny edge detector 구현

% Modifiy by 이문호([email protected])

% canny.m으로 저장하세요. - 문호

Page 87: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

function canny

% The algorithm parameters:

% 1. Parameters of edge detecting filters:

% X-axis direction filter:

Nx1=10;Sigmax1=1;Nx2=10;Sigmax2=1;Theta1=pi/2;

% Y-axis direction filter:

Ny1=10;Sigmay1=1;Ny2=10;Sigmay2=1;Theta2=0;

% 2. The thresholding parameter alfa:

alfa=0.1;

% Get the initial image lena.jpg

%[x,map]=gifread('lena.gif');

%w=ind2gray(x,map);

%figure(1);colormap(gray);

% 여기서 제가 수정합니다.

% 왜냐하면 matlab 5.X에서는 gifread를 지원하지 않기 때문입니다!

% 따라서 imread로 대치하겠습니다...

c_img = imread('lena.jpg');

w= gray2ind(rgb2gray(c_img));

figure(1):colormap(gray);

subplot(3,2,1);

imagesc(w);

title('Image: lena.jpg');

% X-axis direction edge detection

subplot(3,2,2);

filterx=d2dgauss(Nx1,Sigmax1,Nx2,Sigmax2,Theta1);

Page 88: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

Ix= conv2(w,filterx,'same');

imagesc(Ix);

title('Ix');

% Y-axis direction edge detection

subplot(3,2,3)

filtery=d2dgauss(Ny1,Sigmay1,Ny2,Sigmay2,Theta2);

Iy=conv2(w,filtery,'same');

imagesc(Iy);

title('Iy');

% Norm of the gradient (Combining the X and Y directional derivatives)

subplot(3,2,4);

NVI=sqrt(Ix.*Ix+Iy.*Iy);

imagesc(NVI);

title('Norm of Gradient');

% Thresholding

I_max=max(max(NVI));

I_min=min(min(NVI));

level=alfa*(I_max-I_min)+I_min;

subplot(3,2,5);

Ibw=max(NVI,level.*ones(size(NVI)));

imagesc(Ibw);

title('After Thresholding');

% Thinning (Using interpolation to find the pixels where the norms of

% gradient are local maximum.)

subplot(3,2,6);

[n,m]=size(Ibw);

for i=2:n-1,

for j=2:m-1,

Page 89: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

if Ibw(i,j) > level,

X=[-1,0,+1;-1,0,+1;-1,0,+1];

Y=[-1,-1,-1;0,0,0;+1,+1,+1];

Z=[Ibw(i-1,j-1),Ibw(i-1,j),Ibw(i-1,j+1);

Ibw(i,j-1),Ibw(i,j),Ibw(i,j+1);

Ibw(i+1,j-1),Ibw(i+1,j),Ibw(i+1,j+1)];

XI=[Ix(i,j)/NVI(i,j), -Ix(i,j)/NVI(i,j)];

YI=[Iy(i,j)/NVI(i,j), -Iy(i,j)/NVI(i,j)];

ZI=interp2(X,Y,Z,XI,YI);

if Ibw(i,j) >= ZI(1) & Ibw(i,j) >= ZI(2)

I_temp(i,j)=I_max;

else

I_temp(i,j)=I_min;

end

else

I_temp(i,j)=I_min;

end

end

end

imagesc(I_temp);

title('After Thinning');

colormap(gray);

%------------------

% Function "d2dgauss.m":

% This function returns a 2D edge detector (first order derivative

% of 2D Gaussian function) with size n1*n2; theta is the angle that

% the detector rotated counter clockwise; and sigma1 and sigma2 are the

% standard deviation of the Gaussian functions.

function h = d2dgauss(n1,sigma1,n2,sigma2,theta)

r=[cos(theta) -sin(theta);

sin(theta) cos(theta)];

Page 90: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

for i = 1 : n2

for j = 1 : n1

u = r * [j-(n1+1)/2 i-(n2+1)/2]';

h(i,j) = gauss(u(1),sigma1)*dgauss(u(2),sigma2);

end

end

h = h / sqrt(sum(sum(abs(h).*abs(h))));

%--------------------------------

% Function "gauss.m":

function y = gauss(x,std)

y = exp(-x^2/(2*std^2)) / (std*sqrt(2*pi));

%-------------------------------

% Function "dgauss.m"

% (first order derivative of gauss function):

function y = dgauss(x,std)

y = -x * gauss(x,std) / std^2;

%--------------------------------------------------------------------------------

*α-trimmed mean filter 편

α-trimmed mean filter는요, 미디언 필터와 평균 필터의 장점을 딴 흥미로운 필터라는 것입니

다. 즉, α가 0.5 이면 미디언 필터처럼 수행하되, α가 0 이면 평균 필터처럼 수행하게 된다

는 거죠. 알다시피 trim 은 절삭이라죠? 그기서 추론해보면 α-trimmed mean filter 의 뜻을 이

해하시리라 믿습니다. 동작 원리를 보자면 영상내에서 3*3 블록을 잡으면 9 개의 방이 생성

됩니다. 여기서 함 오름차순으로 소팅합니다. 그러니까 재정렬된 9 개의 방이 되죠? 그러

면 α 가 0.5로 한다고 하면 α× 9 = 0.5 × 9 = 4.5 가 되죠? 여기서 반내림을 하면,4가 됩니

다. 그래서 양쪽부분 4 개의 방을 제거하면 결국 한 개 방이 남죠? 요거.. 한 개의 방이 오

름차순으로 소팅된 결과중의 가운데가 중간값이 들어 있는 방이라는 겁니다. 결국! α = 0.5

이면 미디언 필터의 기능과 같은 기능을 가진답니다.

Page 91: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

그럼, 아래 소스를 보시길 바랍니다.

α가 0.3인 경우의 필터링 구현 과정입니다.

%--------------------------------------------------------------------------------

% α-trimmed mean filter 구현

% Coding by 이문호([email protected])

clear all;

filename='lena.jpg';

sample_image = imread(filename);

[R,C,X] = size(sample_image); % row, col, redmesion 반환

row = 1:R;

col = 1:C;

% Red Channel, Green Channel, Blue Channel 분리

redd=zeros(R,C);

greend=zeros(R,C);

blued=zeros(R,C);

redd(row,col) = sample_image(row,col,1);

greend(row,col) = sample_image(row,col,2);

blued(row,col) = sample_image(row,col,3);

% begin...

red_array=zeros(9);

blue_array=zeros(9);

green_array=zeros(9);

after_color_image=zeros(R,C,X);

after_red=zeros(R,C);

after_green=zeros(R,C);

after_blue=zeros(R,C);

Page 92: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

alpha = 0.3;

for na=1:3

reddd = double(redd);

greendd = double(greend);

bluedd = double(blued);

for i=2:R-1

for j=2:C-1

ct=0;

for k=i-1:i+1

for l=j-1:j+1

ct=ct+1;

red_array(ct) = reddd(k,l);

green_array(ct) = greendd(k,l);

blue_array(ct) = bluedd(k,l);

end;

end;

[Y1,G1]=sort(red_array);

[Y2,G2]=sort(green_array);

[Y3,G3]=sort(blue_array);

% trimm....

red_temp_ave = 0.0;

green_temp_ave = 0.0;

blue_temp_ave = 0.0;

trim_temp = floor(alpha * 9.0);

for mm=trim_temp+1:9-trim_temp

red_temp_ave = red_temp_ave + Y1(mm);

green_temp_ave = green_temp_ave + Y2(mm);

blue_temp_ave = blue_temp_ave + Y3(mm);

end;

after_red(i+1,j+1) = red_temp_ave / (9.0 - 2.0*trim_temp);

after_green(i+1,j+1) = green_temp_ave / (9.0 - 2.0*trim_temp);

after_blue(i+1,j+1) = blue_temp_ave / (9.0 - 2.0*trim_temp);

Page 93: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

end;

end;

redd = double(after_red);

greend = double(after_green);

blued = double(after_blue);

end;

after_color_image(row,col,1) = mat2gray(after_red(row,col));

after_color_image(row,col,2) = mat2gray(after_green(row,col));

after_color_image(row,col,3) = mat2gray(after_blue(row,col));

imwrite(after_color_image,'test.jpg');

i

subplot(1,2,1); imshow('lena.jpg'); title('원영상');

subplot(1,2,2); imshow('test.jpg'); title('필터링결과');

%--------------------------------------------------------------------------------

그리고 α-trimmed mean filter 에 대한 또 다른 소스를 제주대 전자공학과 석사과정에계

시는 윤종수님([email protected])께서 보내오셨습니다. 제가 제안한 소스와 한번 비교

해보시길 바랍니다. (소스양이 짧아서 보기가 쉬울껍니다) 참.. 제가 조금 설명을 넣었습니다.

%-------------------------------------------------------------------------------

% α-trimmed mean filter 구현

% Coding by 윤종수님([email protected])

clear all, clc, close all

c_img = imread('img1.jpg');

[R,C,DIM] = size(c_img);

alpha = 0.3;

if (alpha>0.5) | (alpha<0),

fprintf('The alpha must be less than 0.5.\n'), end

n = floor(alpha * 9);

Page 94: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

trim_num = n+1:9-n;

% 이 부분에서 9개의 방이라는 거

% 즉 3*3 블록 잡는다는다는 생각으로 코딩한 듯 합니다.

% 아래부분 for문에 대해 3*3 블록 잡는다는 표현이 암시적으로 되어 있습니다.

% - 이문호

trim_mean = zeros(R,C,DIM);

mean_img = zeros(R,C,DIM);

median_img = zeros(R,C,DIM);

for i = 2:R-1

for j = 2:C-1

unit = c_img(i-1:i+1,j-1:j+1,:);

row = [unit(1,:,:) unit(2,:,:) unit(3,:,:)];

sort_row = sort(double(row));

trim_mean(i,j,:) = mean(sort_row(1,trim_num,:));

mean_img(i,j,:) = mean(sort_row);

median_img(i,j,:) = sort_row(1,5,:);

end

end

subplot(2,2,1),imshow(c_img),title('Input Image')

subplot(2,2,2),imshow(mat2gray(trim_mean)),title('Alpha-trimmed mean filter')

subplot(2,2,3),imshow(mat2gray(mean_img)),title('Mean filter')

subplot(2,2,4),imshow(mat2gray(median_img)),title('Meadian filter')

%--------------------------------------------------------------------------------

Page 95: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

Topologyical Processing

*사상, 보간법의 개념

가장 인접한 이웃화소 보간법 1. 전방향 대 역방향 사상 이번에 강의할 내용은 토프롤지 아니다.. Topological processing 에 대한 개념을 익히는 것이니와, 사상에 대해 이야기 해볼까 합니다. Topology 라는 단어를 많이 들어본적 계시지요? Topological processing 즉, 기하학적 처리라는 것은 단순히 임의의 기하학적 변환에 의하여 화소들의 배치를 변경하는 것일뿐입니다. 다시 말하면 영상안의 화소만 구냥~ 이리저리 옮기는 것이죠. 힝~ 기하학적 처리의 예를 들어달라고요? --+ 기하학적 처리면 간단하게는 스케일(scale : 크게 늘리는 것), 회전(Rotation), 이동(Tra-nslation), 축소(이거 영어로 뭐더라?? -.-;) 등을 들 수 있습니다. 그런데 기하학적 처리후 존재하지 않는 위치에 하나의 화소값을 넣으려면 어떻게 할까요...? 따라서 생겨난 것이 보간법이죠. 보간법은 기하학적 처리가 아니지만 많은 기하학적 변환에 의해 빈번하게 사용됩니다. 우선 기초적인 내용을 알아둘게 있습니다. 바로 사상이라는 것입니다. 사상이라는 것은 Transformation, Matching, Imaging 등으로 표현되는데, 예로 들자면 이동할 때는 원시 영상(Source image) 의 좌표를 목적 영상(Target image)의 좌표로 이동시켜 버려, 원시 영상의 화소값을 옮기는 거죠.. 이 과정을 어떤 개념을 들어 설명해야 할까요? 바로 사상입니다. 이전까지 강의해왔던 화소처리, 영역처리에서는 그냥 좌표의 위치만 같기 때문에 어떻게 목적 화소에 사상되는가 확인하는 것이 넘넘~ 쉬웠겠지만요.. 이번에는 다릅니다 어~ 사상이라는건 어떻게 옮기는가라는 것을 눈치채신 분이 계시죠? 맞습니다.. 그러면, 기하학적 변환(스케일, 회선, 이동, 축소) 경우 1-1 사상관계를 잃어 버리게 되죠. 이전까지는 1-1 대응 이겠지만... 결국 x, y 의 관계에 따라 압력 화소가 출력 화소로 이동 하는 것은 전방향 사상이라고 한답니다. 물론 역방향 사상도 있습니다. 관계라는 것은 야한거에 나오는거 아니라 우리가 중학교 시절 배웠던 것과 전산수학에서 나오는 용어이면 이해가셨으리라 믿습니다. 여기서 우리가 말하는 관계는 절대로 함수(Function)과 무관합니다! 관계라는 것은 사상에 대한 것인즉, 단순한 화소의 배치뿐이지 픽셀값을 변화시키는 이 아닙니다. 픽셀값을 변화시키는 것은 바로 함수이죠.. 전방향 사상에서의 문제점이 2 가지로 요약될 수 있습니다.

*오버랩 (overlap) - 2 개의 입력 화소가 같은 출력 화소에 사상되어짐. * 홀 (hole) - 입력화소가 지정하는 곳인, 목적 영상내의 출력 화소가 없을 경우

Page 96: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

이 두가지 문제를 어떻게 해결할까요? 그래서 대두된 것이 역방향 사상을 어떻게 쓰는 거라는 것입니다. 따라서 역방향 사상은 목적영상을 조사한 후에 몇가지 역변환에 의해 원시 영상안의 목적 화소를 생성 위해 사용될 수 있게 계산하는 거랍니다. 이만하면 기하학적 처리의 어려움을 절실히~ 가슴에 와닿도록 느끼시죠? 그럼~ 잠시만 기다려주세요.. 저도 보간법에 대해 좀 훝어봐야 될 것 같아서...

2. 보간법 (Interpolation)의 개념 사상이라고 해도 완벽하게 옮겨줄 수는 없어요. 예로 들면 목적영상(1,1)의 값이 원시영상(0,0)의 값이 되어야 하는데 그거 없으면? 그게 바로 문제점이죠. 즉 화소값 위치 즉 주소를 계산할 때 원시영상내의 주소가 존재치 않으면 까닥까닥~ 그러니까 보간법은 화소들 사이에 있는 주소값을 생성하는 역할을 합니다. 과정을 살짝 엿보자면 주변의 화소들을 분석함으로서 새로운 화소를 생성시키는 거죠. 하지만 적절한 보간함수를 선택하는 것이 반드시 트레이드 오프(Trade-Off)가 있긴 마련입니다. 대부분 영상처리의 경우도 마찬가지겠지만.. 매우 복잡한 알고리즘이 영상의 질을 향상시키나 복잡하면 복잡할수록 더 많은 처리 시간(Running Time)을 요구합니다. 이게 영상처리의 필요악이죠...

아주 간단한 예로 스케일링을 들겠습니다. 아래 공식의 경우 영상을 2배 확대하는 공식입니다. x source = ( x dest ) / 2 y source = ( y dest ) / 2

묵적영상(0,0)에 대한 화소값이 원시영상(0,0)에 해당하는 화소값에서 가져 올수는 있지만, 목적영상(1,1)에 대해서는 어떻게 하죠? 역변환 사상에 의하면 원시영상(0.5,0.5)에 있는 값을 찾아야 하는데 존재하지 않습니다. 그러니깐 어쩔 수 없죠. 따라서 보간법을 사용해야 하는 이유를 알만하겠죠...? 그러면 보간법은 4 가지로 나누어집니다. ① 가장 인접한 이웃 화소 보간법 (Nearest Neighbor interpolation) ② 양선형 보간법 (Bilinear interpolation) ③ 3차 회선 보간법 (Cubic Convolution interpolation) ④ B-스플라인 보간법 (B-Spline interpolation) 오늘 소스를 내놓지 않고는 안되니깐... 가장 인접한 이웃 화소 보간법에 대한 설명을하겠습니다. 3. 가장 인접한 이웃 화소 보간법 위 제목을 풀어쓰면 Nearest Neighbor interpolation이죠? 제목 그대로 출력 화소로 생성된 주소에 가장 가까운 원시 화소를 출력 화소로 할당하는 원리입니다. 그럴려면 가장 가까운 유효한 화소 주소로 만들어내야겠죠? 이 방법은 처리속도가 넘 빠르기는 한데, 가장 인접한 이웃화소를 추출한다는 자체가 영상을 바뀌게 하는 커다

Page 97: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

란 요소가 된다는 단점을 가지고 됩니다. 또한 새로운 화소값을 계산될수 없어서 그만큼 입력화소안에 찾아야 한다는 그 문제 때문에 오류가 존재하게 될 수 있습니다. 또한 하나의 입력 화소에 대응하는 출력 화소들의 수가 크면 클수록 출력이 나빠지게 됩니다. 쉽게 말하면 영상의 질을 저하시키게 되죠. 예로 몇배수의 영상 스케일링을 들 수 있겠습니다. 결국 좋은 영상을 얻기 원한다면 이 방법말고 다른 보간법을 선택하시는게 나을 것이라고 보고 있습니다. 그럼.. 가장 인접한 이웃화소보간법이 적용되는 스케일링을 들겠습니다. 물론 4배 확대하는 것입니다. x_source = ( x_dest ) / 4 y_source = ( y_dest ) / 4 floatx = x_mapping_function(x_dest); floaty = y_mapping_function(y_dest); x_source = (int) (floatx + 0.5); y_source = (int) (floaty + 0.5);

그럼, 소스를 아래와 같이 되어있으니 한번 보세요. %--------------------------------------------------------------------------------

% Coding by 이문호([email protected])

% 원래 영상, 4의 인수에 의해서 축소된 영상, % 가장 인접한 이웃화소 보간법에 의해서 재생성된 영상 % 전자와 후자의 영상 차이 clear all; filename='build.jpg'; color_image = imread(filename);

% 칼라영상을 그레이 레벨로 바꾼다.... gray_image = rgb2gray(color_image);

% 4의 인수로 축소... four_gray_image = imresize(gray_image,1/4);

Page 98: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

% 가장 인접한 이웃 화소 보간법 : nearest neighborhood. % 사실상 imresize문 에서 imsize(four_gray_image,1/4, 'nearest'); % default 가 nearest이고.. 여기서.. 얻어진 영상을 원영상 크기로 조정하면.. % 바로 가장 인접한 이웃 화소 보간법을 사용한 영상이 출력된다아... % 그러나... 책에 나온 알고리즘을 적용시킨다. % 진짜로 소스가 없군... --;

[R,C] = size(gray_image); % 원영상의 크기를 얻는다. near_gray_image=zeros(R,C); [R1,C1] = size(four_gray_image); four_gray_image=double(four_gray_image); for i=1:R for j=1:C % temp=search_near(i,j,four_gray_image); x_source = fix(double (i/4) + 0.5); y_source = fix(double (j/4) + 0.5); if x_source == 0 x_source = x_source +1; end if y_source == 0 y_source = y_source +1; end

% 축소된 영상의 범위를 넘어서면 어떻게 처리할 것인가? if (x_source > R1) & (y_source > C1) near_gray_image(i,j) = 255.0; elseif (x_source >R1) | (y_source > C1) near_gray_image(i,j) = 255.0; else near_gray_image(i,j) = four_gray_image(x_source,y_source);

Page 99: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

end; end; end;

% 원영상과 이웃화소보간법에 의해 얻어진 영상의 차를 구하자... gray_image=double(gray_image); near_gray_image=double(near_gray_image); four_gray_image=double(four_gray_image); diff_gray_image=zeros(R,C); for i=1:R for j=1:C diff_gray_image(i,j) = abs(gray_image(i,j) - near_gray_image(i,j)); end; end; figure(1); imshow(mat2gray(gray_image)); figure(2); imshow(mat2gray(four_gray_image)); figure(3);

subplot(3,1,1); imshow(mat2gray(gray_image)); title('원영상'); subplot(3,1,2); imshow(mat2gray(near_gray_image)); title('4배로 축소후 다시 확대 영상'); subplot(3,1,3); imshow(mat2gray(diff_gray_image));title('원영상과 재생성된 영상 차'); %--------------------------------------------------------------------------------

*양선형 보간법

이번에 강의할 내용은 영상에 대한 기하학적 처리방법으로 보편적으로 사용되는 양선형보간법에 관한 것입니다. 암튼 가장 인접한 이웃 화소 보간법은 눈치챘다시피 1 차원적으로 결정되는데 반해, 양선형 보간법은 글자 그대로 2 차원입니다. Bilinear interpolation 을 보면 알지 않습니까? 근데 저도 2 차원이라는 말 잘 이해가

Page 100: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

지 않거든요. 일단 양선형 보간법에 대한 개념을 한번 잡아보도록 합시다.양선형 보간법에서는 새롭게 생성된 화소의 값이 네 개의 가장 가까운 화소들에 가중치를 곱한 값이 되죠. 따라서 가중치는 선형적으로 결정되어지며, 각각 가중치는 각각의 존재하는 화소로부터의 거리에 정비례하게 된다 이겁니다. 그러니까 가장 가까운 화소에 가중치를 넣어 새로운 화소값을 지정해주는 것이죠. 알고보면 양선형 보간법은 별거 아닙니다. 그러면 공식을 적어드리죠. EWweight = floatx - floor(x); NSWeight = floaty - floor(y); EWtop = NW + EWweight*(NE-NW); /* 1st interpolation */ EWbottom = SW + EWweight*(SE-SW); /* 2nd interpolation */ dest_pixel = (char) EWtop + NSweight*(EWBottom - EWtop); /* 3rd interpolation */

(floatx 와 floaty 를 구하는 방법은 가장 인접한 이웃 화소 보간법에 설명되어 있습니다.) 여기서 보면 가중치들이 선형적으로 결정되어진다는 것을 이해하셨구요, 이 경우 가장 인접한 이웃화소 보간법보다 더 매끄러운 영상이 생성됩니다. 그러나 3 개에 이르는 화소보간법이라는 계산시간 때문에 가장 이웃 화소보간법 보다는 상당히 많은 계산이 요구되죠. 무슨말이냐 하면, 가장 인접한 이웃 화소 보간법은 입력영상의 딱 한 개 화소만을 요구하지만, 양선형 보간법은 새로운 화소를 생성하기 위해 네 개의 가장 가까운 화소들을 요구한다는 겁니다. 요약하자면, 양선형 보간법은 4개의 가장 가까운 화소들을 사용하기 때문에 3 번 걸쳐 보간을 하게 됩니다. 이로서 가장 이웃한 화소 보간법보다 계산 시간이 늘어나게 된다는 단점을 가지게 됩니다. 자~ 아래 소스를 보기로 할까요. 참고로 양선형 보간법 구현하는데만 시간이 상당히 소요되었습니다. 또 계산시간이 엄청외로 넘 걸리더군요. 제 컴퓨터의 램이 96 메가라서 1 분내로 해결 가능했지만, 소스를 짤 당시 32 메가로서, 한 5 분내로 버버벅~ 거려서 저의 인내심을 테스트해보곤 했습니다. 그리고 MATLAB에서는 양선형 보간법 함수가 제공되긴 하는데, 여러분께서 지금까지 강의을 읽으셨다면 어떻게 하셨는지 이미 알고 있으리라 믿습니다. 참... 아래 소스는 완벽치 않으며, 잘못된 내용일 수 있습니다. 여러분께서 한번 소스를 훝어보시고, 무엇이 잘못된 것인지 저에게 메일로 보내주시면 감사하겟습니다~! %--------------------------------------------------------------------------------

% 그림 4.9 원래 영상, 4의 인수에 의해서 축소된 영상, % 양선형 보간법에 의해서 재생성된 영상

Page 101: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

% 전자와 후자의 영상 차이 clear all; filename='build.jpg'; color_image = imread(filename);

% 칼라영상을 그레이 레벨로 바꾼다.... gray_image = rgb2gray(color_image); four_gray_image = imresize(gray_image,1/4);

%양선형 보간법...

[R,C] = size(gray_image); % 원영상의 크기를 얻는다. bilinear_gray_image=zeros(R,C); gray_image = double(gray_image); for i=2:R-1 for j=2:C-1 floatx = double(i/4); floaty = double(j/4); tempx = fix(floatx); tempy = fix(floaty); if tempx == 0 tempx = 1; end; if tempy == 0 tempy=1; end; EWweight = floatx - double(tempx); NSweight = floaty - double(tempy); NW = gray_image(i-1,j-1);

Page 102: 영상처리란 무엇인가pds5.egloos.com/pds/200708/28/01/Image_Processing_with_Matlab.pdf · 상의 잃어버린 부분을 복원시키는 기술이다. 이러한 방법들중

NE = gray_image(i-1,j+1); SW = gray_image(i+1,j-1); SE = gray_image(i+1,j+1);

% 윤종수([email protected])님께서 오류 내용 알려주셧습니다. % 감사드립니다.. 오타를.. NE -> NW로 수정합니다.. % 결과가 다를껍니다.. 한번 해보세요~!

EWtop = NW + EWweight*(NE-NW); % NE-> NW로 수정합니다...99.8.25 EWbottom = SW + EWweight*(SE-SW); dest_pixel = floor(EWtop+NSweight*(EWbottom-EWtop)); bilinear_gray_image(i,j) = double(dest_pixel); end; end;

% 원영상과 양선형보간법에 의해 얻어진 영상의 차를 구하자... bilinear_gray_image=double(bilinear_gray_image); four_gray_image=double(four_gray_image); diff_gray_image=zeros(R,C); for i=1:R for j=1:C diff_gray_image(i,j) = abs(gray_image(i,j) - bilinear_gray_image(i,j)); end; end; figure(1); subplot(1,2,1); imshow(mat2gray(bilinear_gray_image)); subplot(1,2,2); imshow(mat2gray(diff_gray_image)); %-----------------------------------------------------------------------------