Edge Detection의 방법 소개
안녕하세요 여러분
이번 포스팅에서는 OpenCV를 활용한 Edge Detection, 즉
윤곽선 검출 방법들에 대해 이론적인 설명을 해보려고 합니다!
먼저 윤곽선을 검출하기 위해서는 회선의 개념을 이해해야 합니다
회선의 정의를 살펴보겠습니다.
회선이란, 화소값 각각에 대해 여러가지 연산을 수행하는 화소 기반 처리가 아닌 마스크라 불리는 규정된 영역을 기반으로 연산을 수행하는 것을 공간영역 기반 처리 또는 마스크 기반 처리라고도 한다. 마스크 기반 처리는 마스크 내의 원소값과 공간 영역에 있는 입력 영상의 화소값들을 대응되게 곱하여 출력화소값을 계산한다. 이러한 처리를 모든 입력 화소값에 대해 이동하면서 수행하는 것을 회선이라고 한다. 이 때 입력 영상에 곱해지는 이 마스크를 커널, 윈도우, 필터 등이라고 부른다.
우리는 이러한 회선을 주로 사진을 뽀샤시하게 변경한다거나,
선명하게 변경하는 등의 작업을 위해 사용하게 됩니다!
오늘 포스팅의 주제인 윤곽선 검출은 회선을 이용해 어떻게 수행되는가에 대해
자세히 설명해보도록 하겠습니다.
윤곽선 검출은 크게 다음과 같이 세가지로 구분할 수 있습니다.
① 1차 미분 마스크 방식
② 2차 미분 마스크 방식
③ 캐니 엣지 디텍션
① 1차 미분 마스크 방식
먼저 1차 미분 마스크 방식은 화소의 변화율을 구하는 미분 연산을 이용해
윤곽선을 검출하는 방식입니다.
미분 연산이라함은 기울기를 계산하는 것이기 때문에
1차 미분 마스크 방식은 현재 화소에서의 밝기의 기울기를 계산하는 것입니다.
하지만 디지털 영상은 연속이 아닌 이산된 데이터의 나열이기 때문에 정확한
미분 연산을 수행할 수 없어 근사값으로 계산하게 됩니다.
또한 영상은 2차원이기 때문에 가로 방향, 세로 방향 각각 미분을 구해야합니다.
그리고 최종적으로 영상에 나타낼 때는 각각의 제곱을 더한 것에 제곱근을 취합니다.
이러한 1차 미분 공식을 영상에 구현하는 쉬운 방법이 1차 미분 마스크로 회선을 적용하는 것입니다.
①-① 로버츠 마스크(Roberts Mask)
로버츠 마스크는 3*3의 마스크에 대각선 방향에 -1과 1을 배치해 X성분과 Y성분의
윤곽선을 검출하는 방식입니다.
마스크의 형태는 아래 그림과 같습니다.
좌측 마스크가 X성분의 미분을 위한 마스크,
우측 마스크가 Y성분의 미분을 위한 마스크입니다.
로버츠마스크는 대각성 원소를 제외한 나머지 원소의 값이 모두 0이어서 다른 1차 미분 마스크에 비해서 수행속도가 빠른 장점이 있습니다.
그러나 한번만 차분을 계산하기 때문에 차분의 크기가 작고 이로 인해서
경계가 확실한 윤곽선만을 추출하지만 잡음에 매우 민감하고
윤곽선의 강도가 약한 단점이 있습니다.
①-② 프레윗 마스크(Prewitt Mask)
프레윗 마스크는 로버츠 마스크와 달리 세 번의 차분을 합하기 때문에
윤곽선의 강도가 강하며, 수직과 수평 에지를 동등하게 찾는 데 효과적입니다.
수직과 수평 차분을 이용하기 때문에 전반적으로 대각선 방향의 차분보다는
수직, 수평 방향의 윤곽선을 잘 검출합니다.
①-③ 소벨 마스크(Sobel Mask)
소벨 마스크는 프레윗 마스크의 중심화소의 차분을 2배 증폭시킨 방식입니다.
중심화소의 차분을 증폭시킨 마스크이기 때문에, X성분, Y성분 뿐 아니라,
대각성 성분의 윤곽선도 잘 검출하는 특징이 있습니다.
1차 미분 마스크는 밝기가 급격하게 변화하는 영역뿐 아니라 점진적으로 변화하는
부분까지 민감하게 윤곽선을 검출하여 너무 많은 윤곽선이 나타날 수 있습니다.
2차 미분 마스크 방식은 이를 보완하는 방법으로, 변화하는 영역의 중심에
있는 윤곽선만을 검출하며, 밝기가 점진적으로 변화되는 영역은 반응하지 않습니다.
대표적인 방식으로는 라플라시안 윤곽선 검출 방식이 있습니다.
라플라시안 마스크는 중심화소를 4배 증폭시키고, 상하좌우 화소는 중심화소의
반대부호를 가지도록 설정합니다.
마스크의 형태는 다음과 같은 구성되며 이를 통해 윤곽선을 검출합니다.
각각 4방향과 8방향 방법이라고 구분하며,
마스크의 모든 합이 0이 되도록 구성하면 됩니다.
마지막 캐니 엣지 디텍션은 위에 설명한 방식들보다 우월한 성능을 가진
윤곽선 검출 방법입니다.
특히 윤곽을 가장 잘 찾으면서도, 노이즈가 포함된 잘못된 엣지를 제거할 수 있는
아주 특별한 방식이라고 설명할 수 있습니다!
캐니 엣지 디텍션은 opencv에서 함수로도 제공하지만, 다음과 같은 알고리즘 순서로
동작합니다.
1. Smoothing
노이즈 제거를 위한 블러링 작업이라고도 설명하는 스무딩 작업을 수행합니다.
미분을 하게되면 아래 그림처럼 잡음에 의한 노이즈가 많이 발생하는 것을 확인할 수 있는데요, 이러한 노이즈를 제거해야 윤곽선을 확실하게 추출할 수 있습니다.
주로 가우시안 블러를 이용해 노이즈를 제거한 이미지를 사용합니다.
2. 소벨 마스크(미분값을 통한 윤곽선의 강도와 방향 검출)
두번째 작업은 소벨 마스크를 이용해 회선을 수행하는 것입니다.
이미지의 강도가 급격하게 변하는 부분이 윤곽선이기때문에, X축 Y축의 미분값을
추측해 모든 에지를 검출합니다.
극 값에 따라 윤곽선이 아님에도 윤곽선으로 검출되는 영역이 있을 수 있는데,
비 최대치 억제라고 적은 non-maximum suppression은 이러한 영역들을
제거하는 방법입니다.
현재 선택된 픽셀의 윤곽선 강도가 가장 크다면, 그 값을 보존하고
아닌 경우에는 삭제를 수행합니다. 그러면 Maximum 윤곽선만 보존되고
나머지는 다 윤곽선에서 삭제되게 됩니다.
가장 강한 윤곽선만을 3번에서 살려두었는데요, 이 중에서도 임계값을 통해
최종적으로 윤곽선을 판별하는 작업을 수행합니다.
low threshold와 high threshold를 정의하고, low 이하의 세기를 가지는
윤곽선은 모두 삭제합니다.
low와 high 사이의 영역에 존재하는 윤곽선은 약한 윤곽선,
high 이상의 영역에 존재하는 윤곽선은 강한 윤곽선으로 설정합니다.
약한 윤곽선의 경우 강한 윤곽선들과 연결된 경우에만 최종 윤곽선으로 판별됩니다.
오늘 포스팅에서는 회선과 윤곽선 검출에 대해 알아봤는데요
다음 포스팅에서는 해당 내용들의 코드와 결과값을 알아보도록 하겠습니다.
감사합니다.
2018/04/10 - [OpenCV] - Canny Edge Detection