[CV] Canny Edge Detection

zae·2023년 7월 18일
0

ComputerVision

목록 보기
3/3

함수 설명을 바로 보고 싶다면, 목록의 Canny 함수와 사용 (C++) 클릭! 🖱️

🌳 Canny Edge Detection이란

인기 있는 Edge 검출 알고리즘으로 일반 Edge Detection에서 나타는 불분명한 Edge들 중 실제 Edge를 찾아 분명하게 나타내는 알고리즘이다.

👀 Edge 검출 단계

Canny Edge Detection은 다단계 알고리즘으로 구성되어 있고, 그 과정은 다음과 같다.

💡 1. Gaussian Filter를 통한 Smoothing (노이즈 제거)

🔍 Image Gradient (이미지 그라디언트)

Gradient는 기울기 및 변화하는 정도를 의미하기 때문에, Image Gradient는 가장 크게 변화하는 픽셀인 Edge를 의미한다.
즉, 이미지의 Edge 검출에 사용되고 식은 다음과 같다.

Gradient를 할 때 신호를 미분하게 되는데, 이때 신호와 더불어 Noise도 함께 극대화 될 것이다.

그렇기 때문에 노이즈를 없애주는 작업을 해야하고, 이때 Gaussian Filter를 사용한다.

가우시안 필터가 궁금하다면 클릭 🌼

💡 2. Sobel Edge Detection

노이즈가 제거된 이미지에서 Sobel Edge Detection을 통해 수평 방향, 수직 방향의 Edge를 검출한다.

Sobel 필터가 궁금하다면 클릭 🌼

💡 3. Non-maximum Suppression (Thinning)

그 후 선을 보다 명확하고 얇게 나타내기 위해 방향으로 최댓값을 갖는 픽셀만 남겨두고 나머지 값은 0으로 바꾸는 과정을 거친다.

위와 같은 사진에서 q > p, r 이면 다음 단계로 넘어가고, 그렇지 않다면 q의 픽셀 값을 0으로 바꾼다는 것이다.

💡 4. Hysteresis Thresholding

Thresholding 값 τ를 기준으로 τ보다 높은 값을 갖는 t에 해당되는 부분Edge로 지정한다.

(가)high threshold보다 높기 때문에 분명한 Edge가 맞고,
(나)high threshold보단 낮지만 분명한 Edge인 (가)와 연결되어 있으므로 Edge가 맞다.
(다)는 high threshold보다 낮기 때문에 Edge가 아니다

🪄 Canny 함수와 사용 (C++)

void Canny(
	const CvArr* src, CvArr* dest, 
    double low_threshold, double high_threshold, 
    int aperture_size=3
    )
  • apreture_size는 kernel의 크기를 의미한다.

사용 코드

// Canny Edge Detection
	Mat example = imread("duck.jpg");
	resize(example, example, Size(500, 300));

	Mat canny[3];
	Canny(example, canny[0], 50, 130);
	Canny(example, canny[1], 150, 250);
	Canny(example, canny[2], 260, 310);
	for (int i = 0; i < 3; i++) {
		imshow("Edge Detection " + to_string(i), canny[i]);
		waitKey(0);
	}

canny[3]라는 배열에 각각 다른 threshold 값으로 원본 이미지를 canny edge detection 해주어 저장했다.

  • 임계값(low_th, high_th)(50, 130)처럼 너무 낮은 경우, 불필요한 (불분명한) Edge들이 너무 많이 생기는 것을 볼 수 있다.
  • (150, 250)처럼 적당한 경우, 오리의 잔털을 경계로 Edge를 비교적 정확하게 찾아낸 것을 볼 수 있다.
  • (260, 310)처럼 너무 높은 경우, 필요한 Edge의 정보까지 손실될 수 있다.
profile
코린이 성장 과정! 깊이 있게 파고들 공부를 탐색하고 있습니다 :)

3개의 댓글

comment-user-thumbnail
2023년 7월 18일

좋은 글 잘 읽었습니다, 감사합니다.

답글 달기
comment-user-thumbnail
2023년 7월 18일

너무 좋은 글이네요. 공유해주셔서 감사합니다.

1개의 답글