IT/언어

[python/OpenCV] cv2.Canny():Canny방법을 이용하여 물체의 외곽선(엣지) 추출하기

개발자 두더지 2022. 1. 4. 15:29
728x90

 외곽선(엣지)란 물체간 혹은 배경과의 경계를 일컫는 것으로, 외곽선(엣지) 검출이란 일반적으로 이미지 안의 화소치의 변화, 휘도의 변화가 커다란 부분을 검출하여 엣지를 추출하는 이미지 처리를 의미한다.

 

 

cv2.Canny()이란


 OpenCV에 제공되어 있는 엣지 검출 함수로, 이미지의 엣지만을 되돌려준다. 다만, 적절히 사용하기 위해서는 1개의 파라미터를 조정해야할 필요가 있다. 기본적인 문법은 다음과 같다.

cv2.Canny(gray_img, threshold1, threshold2)

 간단히는 threshold1와 threshold2 어느쪽도 엣지 여부의 판단하는 임계값을 나타내고 있다. 클수록 엣지가 검출되기 어렵고, 작을 수록 엣지가 검출되기 쉽다(그 값이 크면, 보다 커다란 휘도 변화가 나타날 때가 엣지라고 판단되기 때문이다).

import cv2
gray_img = cv2.imread('sample.jpg', cv2.IMREAD_GRAYSCALE)

threshold1 = 0
threshold2 = 360
edge_img = cv2.Canny(gray_img, threshold1, threshold2)
cv2.imwrite('sample_edge.jpg', edge_img)

threshold2 : maxVal

 threshold2의 쪽이 더욱 직감적인 값으로, 엣지인지 아닌지를 판단하는 임계값 그 자체이다. 실제로 threshold2를 점점 작게하면 다음과 같이 된다 (이해하기 쉽도록 threshold1에는 threshold2와 동일한 값을 넣었다).

threshold1:minVal

 인수 설명의 전제로, Canny방법에서는 엣지를 하나의 긴 선으로 생각하므로, 엣지에 인접하고 있는 부분은 엣지가 되기 싶다.

 이러한 발상으로 두 번째 임계값(threshold1)를 도입하여, "다른 엣지와의 인접 부분(엣지가 되기 쉬운 부분)의 엣지 여부를 판단하는 임계값"을 설정한다.

 즉, threshold1를 작은 값으로 설정하여도, 원래 주변에 아무것도 검출되지 않았던 부분에 갑자기 엣지가 검출되지는 않는다. 작은 값으로 설정하면, 원래 threshold2에 의해 검출된 엣지의 인접 부분이 엣지로 검출되기 쉬워져, 즉 직감적으로 얘기하자면 원래 threshold2에 의해서 검출된 엣지의 선을 길게 늘릴 뿐이다.

 threshold1을 점점 작은 값으로 설정하면 다음과 같이 된다.

 

 

마무리


cv2.Canny(gray_img, threshold1, threshold2)

- threshold1 : 다른 엣지와의 인접 부분(엣지가 되기 쉬운 부분)에 있어 엣지인지 아닌지를 판단하는 임계값

- threshold2 : 엣지인지 아닌지를 판단하는 임계값

외곽선(엣지) 검출 파라미터 조정을 하는 방법

아래의 순서대로 조정하면서 엣지 검출해보는 것을 추천한다.

1. 먼저 threshold1와 threshold2를 같은 값으로 한다.

2. 검출되길 바라는 부분에 엣지가 표시되는지 확인하면서 threshold2 값을 조정한다.

3. 2번의 조정이 끝나면, threshold1를 사용하여 엣지를 연결시킨다. 


참고자료

https://qiita.com/Takarasawa_/items/1556bf8e0513dca34a19

728x90