관리 메뉴

공부 기록장 💻

[OpenCV/C++] 에지 검출 3 - 캐니 에지 검출기 (Canny Edge Detector) 본문

# Tech Studies/Computer Vision • OpenCV

[OpenCV/C++] 에지 검출 3 - 캐니 에지 검출기 (Canny Edge Detector)

dream_for 2022. 12. 3. 21:38

OpenCV 4로 배우는 영상 처리와 컴퓨터 비전 CH9. 에지 검출과 응용 정리

캐니 에지 검출기

소벨 마스크를 이용한 에지 검출 방법은구현이 간단하고 빠르게 동작하여 현재 컴퓨터 비전 시스템에서 사용되고 있지만, 그래디언트 크기만을 기준으로 에지 픽셀을 검출하기 때문에 임계값에 민감하고 에지 픽셀이 두껍게 표현되는 문제점이 있다.
1986년 캐니(J. Canny)는 에지 검출을 최적화 문제 관점으로 접근함으로써 소벨 에지 검출 방법의 단점을 해결할 수 있는 방법을 제시하였다. 캐니는 다음 세가지 항목을 좋은 에지 검출기의 조건으로 제시하였다.

1. 정확한 검출 (Good Detection) : 에지를 검출하지 못하거나, 또는 에지가 아닌데 에지로 검출하는 확률 최소화 필요
2. 정확한 위치 (Good Localization) : 실제 에지의 중심을 찾아야 함
3. 단일 에지 (Single Edge) : 하나의 에지는 하나의 점으로 표현되어야 함


캐니는 위의 조건을 만족하는 새로운 형태의 에지 검출 방법, 캐니 에지 검출기(Canny Edge Detector) 을 제시하였다.
캐니 에지 검출기는 그래디언트의 크기에 더해 방향까지 모두 고려하여 좀 더 정확한 에지를 찾는 방법이다. 에지는 서로 연결되어 있는 가능서이 높다는 점을 고려하여 그래디언트 크기가 다소 약하게 나타나는 에지도 놓치지 않고 찾을 수 있다.




캐니 에지 검출기는 아래의 4개 연산 과정을 포함한다. 각 연산의 의미와 수행 방법을 살펴보도록 하자.


1. 가우시안 필터링


가우시안 필터링은 앞선 포스팅에서 설명한 바가 있다.(https://dream-and-develop.tistory.com/308)
가우시안 필터링은 가우시안 분포 함수를 근사하여 생성한 필터 마스크를 사용하는 블러링 기법으로,우선 영상에 포함된 잡음을 제거하는 단계가 필요하다. 다만 가우시안 필터링에 의해 영상이 부드러워지면서, 에지의 세기도 함께 감소할 수 있기 때문에 적절한 표준 편차를 선택하여 수행하는 것이 필요하며, 잡음이 심하지 않은 영상이라면 이 단계는 생략 가능하다.

2. 그래디언트 계산


다음으로는 영상의 그래디언트를 구하는 단계이다. 캐니 에지 검출기에서 보통 3x3 소벨 마스크를 사용하여 그래디언트 계산을 한다. 정확한 에지를 찾기 위해 가로, 세로 방향으로 각각 소벨 마스크 필터링을 수행한 후, 그래디언트 크기와 방향을 모두 계산하여야 한다.


3. 비최대 억제


에지가 두껍게 표현되는 현상을 방지하기 위해 캐니 에지 검출기에서는 비최대 억제(non-maxmimum suppression) 과정을 사용한다. 단순히 그래디언트 크기가 특정 임계값보다 큰 픽셀을 선택하는 경우, 에지 근방의 여러 픽셀이 한꺼번에 에지로 선택될 수 있기 때문이다. 비최대 억제는 그래디언트 크기가 국지적 최대(local maximum)인 픽셀만을 에지 픽셀로 설정하는 기법이다.
일반적으로 2차원 영상에서 local maximum을 찾기 위해선 특정 픽셀을 둘러싼 모든 픽셀 값을 검사하여 판별해야 하지만, 캐니 에지 검출기의 경우 그래디언트 벡터의 방향과 같은 방향에 있는 인접 픽셀에 대해서만 검사를 수행한다.
결과적으로, 비최대 억제를 수행하여 가장 변화율이 큰 위치의 픽셀만 에지로 탐색된다.


4. 이중 임계값을 이용한 히스테리시스 에지 트래킹


소벨 에지 검출 방법은 특정 임계값 수치를 이용해 에지 픽셀을 판단하였다. 이 경우 조명이 조금 바뀌거나 임계값을 조금만 다르게 조절해도 에지 픽셀 판단 결과가 크게 달라질 수 있다. 이는 하나의 임계값을 사용하여 이분법으로 에지 판별 결과가 판단되기 때문에 환경 변화에 민감해질 수 있다는 문제를 지닌다.

이러한 문제를 보완하기 위해 캐니 에지 검출기에서는 2개의 임계값을 사용한다.
두 임계값 중 높은 임계값을 T(High), 낮은 임계값을 T(Low) 라 할 때, 그래디언트 크기가 T(High) 보다 크면 해당 픽셀은 최종적인 에지로 판단하고, T(Low) 보다 작으면 에지 픽셀이 아니라고 판단한다.
T(Low)T(High) 사이의 픽셀은 에지일 수도, 에지가 아닐 수도 있다고 판단하여 이런 픽셀에 대해서는 추가적인 검사를 수행하게 된다.

아래와 같이 총 세 영역에 분포할 수 있는 에지에 대해 차례대로 연속적인 픽셀 값들에 대하여 강한에지, 약한에지, 에지 아님으로 구분해보자.

에지 검출기의 마지막 단계에서는 히스테리시스 에지 트래킹(Hystersis Edge Tracking) 을 사용하여 약한 에지 중, 최종 적으로 에지로 판별할 픽셀을 선택한다. 이 방법을 이용해 약한 에지 중, 강한 에지 픽셀과 상호적으로 연결되어 있는 약한 에지만을 최종적인 에지로 판단한다.
따라서 위 그림에서 약한 (a)와 (c)의 약한 에지는, 강한 에지와 연결되어 있으므로 최종적인 이제로 판단이 되지만,
(b)의 약한 에지는 강한 에지와 연결되어 있는 에지가 아니므로 에지가 아닌 픽셀들로 판단된다..

Canny() 함수

OpenCV에서 캐니 검출 알고리즘은 Canny() 함수에 구현되어 있다. 두 가지 형태로 정의되어 있고, 원형은 다음과 같다.

캐니 검출 알고리즘 Canny() 함수

첫번째 Canny() 함수는 일반 영상을 입력으로 전달하여 에지를 검출할 때 사용하고, 두번째 함수는 이미 x,y방향의 미분 영상을 가지고 있을 때 사용한다.
캐니 에지 검출기의 히스테리시스 에지 트래킹 단계에서 사용되는 두 임계값 threshold1, threshold2을 적절하게 지정하는 것이 중요한데, 차례대로 낮은 임계값, 큰 임계값을 지정하면 된다. 두 임계값은 보통 1:2, 1:3의 비율로 지정한다.


마지막으로 예제를 살펴보자.

// 캐니 에지 검출기
void canny_edge() {
	Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	Mat dst1, dst2,dst3;
	Canny(src, dst1, 50, 100); // 낮은 임계값 50, 높은 임계값 100으로 설정
	Canny(src, dst2, 50, 150); // 낮은 임계값 50, 높은 임계값 150으로 설정
	Canny(src, dst3, 50, 200); // 낮은 임계값 50, 높은 임계값 200으로 설정

	imshow("src", src);
	imshow("dst1", dst1);
	imshow("dst2", dst2);
	imshow("dst3", dst3);

	waitKey();
	destroyAllWindows();
}


낮은 임계값과 높은 임계값의 비율을 1:2, dst2는 비율을 1:3로 설정하여 캐니 에지 검출기를 이용한 두 결과 영상을 생성하였다. 임계값을 높일 수록 검출되는 에지 픽셀이 적어지는 것을 확인할 수 있다.

캐니 검출기 이용

50과 100으로 두 임계값을 설정한 dst1의 경우 모자와 얼굴에서, 사소한 음영 변화가 일어나는 부분에서도 에지가 과도히 많이 검출되는 것을 확인할 수 있다.
반면 50과 200으로 설정한 마지막 결과 영상의 경우, 얼굴과 모자, 머리 부분에서 에지가 어느정도 정리되었다.


위의 결과를 소벨 마스크를 이용한 에지 검출과 비교하면 확연히 다름을 확인할 수 있는데, 특히 얼굴의 코, 입에 대한 에지 검출이 캐니 검출에 비교하여, 선명하게 에지를 검출해내지 못했다.

소벨 필터 마스크를 이용한 에지 검출


728x90
반응형
Comments