6-20 OpenCV에 의한 사진 이미지 Edge Detection Python Coding

codingart(66)
Published in
#kr
Words
643
Reading
3 min
Listen
Play
8y

다음 동영상은 Processing의 Convolution 예제로 들어 있는 컬러 이미지에 대한 Convolution 작업을 통한 Edge Detection 과정을 보여 준다.

1981년 노벨 의학상을 수상하게 된 후벨(Hubel)의 핵심 연구인 1959년의 고양이 시각피질의 반응 연구에서 그는 뇌의 edge detection 현상을 관찰하였다. 고양이 시각 피질은 눈에 비치는 이미지를 구성하는 크고 작은 시각 요소들의 위치, 방향, 움직임, 크기를 파악할 수 있는 다양한 기능을 가지고 있으며 그 중에서도 흑백명암으로 이루어진 기울어진 사선을 인식하는 즉 edge detection 기능에 주목해 보자.

noname01.png

시각요소로서 edge 라고 하는 것은 특히 안면 인식을 예로 든다면 얼굴 윤곽선이라든지 또는 눈 주위의 특징 적인 명암 상태를 보여주는 눈자위와 미간, 이마, 코, 입, 수염, 귀,머리카락을 포함하는 선적인 요소들이다. 스케치 작업에서도 그러하듯이 이미지 처리 과정에서의 edge detection 도 상당히 비슷한 면이 있다.

이러한 특징을 가지는 edge를 검출할 수 있는 방법으로서 Gaussian Blur를 포함한 다양한 이미지 필터링 기법이 있다. 그 방법은 전체 이미지의 각 픽셀들을 대상으로 예를 들면 3X3 매트릭스로 규정되는 작은 사각형 필터를 만들어 스캔하면서 로칼 이미지에 포함된 일종의 노이즈 이미지 성분들을 제거하는 것이다. 이런 방법을 컨볼루션(Convolution)기법이라고 하는데 그 원리를 PC에서 설치되어 있는 Processing 편집기의 Image Processing 예제를 통해서 커버 동영상에서처럼 해보기를 권한다.

Processing⤍File⤍Examples⤍Topics⤍Image Processing에 Edge Detection을 포함한 여러 이미지 처리 예제 코드들이 있다. Edge Detection 예제와 Convolution 예제를 열어서 실행해 보자. Edge Detection 예제에서 보면 형상을 표현하는 선적인 요소에 수직한 방향 전후로 명암 변화가 심하기 때문에 모조리 검출되나 많은 부분들 명암 변화가 적은 곳들은 확대해서보면 검은색 조각과 나머지 대부분은 흰색 처리 된다. 이러한 부분들 조차 Gaussian Blur 처리하면 더욱 흐려지고 결국은 모양을 나타내는 윤곽선 즉 명암 변화가 극심한 edge 들만이 남게 된다.

noname02.png

커버의 동영상에서 보았듯이 Convolution 은 여러 가지 필터링 효과를 주는 방법이지만 Edge Detection도 포함된다.

후벨에 의해서 알려진 고양이 시각 피질에서의 Edge Detection 현상은 인간에게도 적용가능하다. 일단 색상을 느끼는 시각세포들이 없는 동물들로부터 흑백 이미지를 대상으로 연구가 이루어졌기 때문에 소프트웨어들도 이러한 면을 많이 감안하고 있다.

Edge Detection 알고리듬

다음 그림에서 흑배 그레이 대신 빨간색 RGB 예제인데 RGB 값이 0∼255까지 선형적으로 변하는 Processing에서의 얻은 그래픽이다. x방향 Gradient 즉 x에 관한 미분 값이 상수인 경우다. Edge를 넘어서면 밝기가 일정하므로 미분 값이 0 이 된다. 이론적으로 Gradient 값이 일정하도록 했지만 실제로는 Edge 주변에서 관찰해 보면 바로 Edge를 따라서 Gradient 값이 local maximum이 된다.
Gradient 값이 최대 값인 동시에 그 주변에 최소 값인 0 을 가지는 점이 바로 A점이다. 바로 최대값에서 최소값으로 바뀌는 Gradient 방향은 항상 Edge 와 수직인 관계를 이루게 된다.

noname03.png

Hysterisis Thresholding

실제 이미지를 대상으로 하는 Edge 분석은 대단히 복잡한 작업이며 분간이 대단히 어려운 경우가 발생한다. 즉 비슷한 Gradient 값을 가지는 경우이다.

noname04.png

즉 maxVal 이상의 Gradient 값을 가지는 곳은 확실히 Edge 로 볼 수 있으며 minVal 이하는 완전히 Edge 가 아닌것으로 처리하면 되지만 그 중간 영역의 Gradient 값이 문제다. 이때 Edge냐 아니냐 판단 기준은 확실한 Edge 와 끓어짐이 없이 연결되었느냐 여부를 확인해야 한다. 즉 위에서 B 의 경우는 확실한 Edge 로부터의 연결 점이 없는 고립된 상태이므로 이는 Edge 가 아닌 것이다. 위의 달 탐사 사진에서도 보면 이미지 전체 면적의 상당한 부분을 채우고 있는데 이들은 Gaussian Blur 작업을 통해 쉽게 걸러 낼 수 있다. 아울러 분석하게 될 Xfile 이 여주인공의 머리카락 부분도 B에 해당하는 부분이 많아 제거되어 버리고 머리카락 윤곽만 남기게 된다.

Canny Edge Detection

Opencv에서 주어진 사진 이미지 파일을 사용하여 Edge를 검출해 보자. 이미지 처리를 해야 할 파일이 컬러라면 우선적으로 BGR2GRAY 변환을 해 흑백 이미지 파일을 준비해야 한다. maxVal 값과 minVal 값을 설정해야 하며 아울러 aperture 값도 설정해야 한다. aperture 값은 Sobel kernel을 사용하여 이미지 픽셀들로부터 Gradient를 계산하는데 필요한 파라메터로서 default 값이 3 이다.

noname05.png

PiCamera와 함께 이미 사용해 오던 코드에서 image 읽기 부분에서 jpg 사진 파일을 읽어 들여 cv2.Canny() 명령을 사용하여 Edge를 검출하고 cv2.imshow명령을 사용하여 다음과 같이 화면으로 출력하자. 필요에 따라서 maxVal 과 minVal 값을 조절해서 결과를 비교해 보자.

noname06.png

이 Canny의 Edge Detection 은 흑백 이미지를 대상으로 Edge를 찾아내는 알고리듬으로서 아직까지도 자율주행의 경우에 차량 앞에 펼쳐지는 도로 주행 전경을 카메라에 담아 차선(lane)을 분리해 내는 기본 기술로 활용되고 있다.

필자의 외부 블로그 주소에서 첨부된 사진과 코드를 다운로드 받아 실행시켜 보자. 직접 나가는 경로가 막혀있으면 별도로 인터넷을 열어서 주소를 찾아보기 바란다. 다운로드 후 indentation 이 무너진 부분이 있으면 제대로 복구해서 컴파일 업로딩하도록 한다.

http://blog.daum.net/ejleep1/39

6-20 OpenCV에 의한 사진 이미지 Edge Detection Python Coding | Ecency