파이썬을 이용한 Canny_Edge_Detector 구현입니다.
<사전 단계> Smoothing filters를 적용하여 노이즈를 감소시키는 1단계를 진행하기 전, 이미지를 RGB 채널로 변경하고 grayscale로 변환
<1단계> 영상에 노이즈가 있으면 edges 검출에 어려울 수 있기 때문에, 노이즈를 감소시키기 위해 필터 적용.
<2단계> 2단계에서는 1단계에서 필터를 적용하여 노이즈가 감소된 영상에 sobel 커널을 수평방향, 수직 방향으로 적용. 수평방향의 gradient는 GX로 수직 방향의 gradient는 GY로 구한 다음, 아래 수식으로 gradient와 방향(Angle) 값을 계산한다.
다음, low_threshold_value보다 낮은 값을 갖는 픽셀들을 탈락 즉, candidate pixels 남게된다. 3단계의 Non-maximum suppression진행을 위해 각도를 4등분.
-2단계에서는 각 픽셀의 Edge_Gradient 와 angle을 구하고 low_threshold_value 값 보다 낮 은 픽셀들을 탈락시켰다. Gradient 크기와 임계값을 비교해서 나온 결과이므로 stage2_Gradient의 edges가 두껍게 검출된 것을 볼 수 있다. stage2_Gradient에서 색은 각 픽셀이 얼마나 높은 Gradient를 가지고 있는지를 나타낸다. (아래 색을 참조 -검정색=엣지 아님, 빨간색 = 강한 엣지)
stage2_Angle또한 육안을 확인하기 위해 컬러맵 표시(아래 색을 참조)
<3단계> 2단계 결과를 보면 edges가 두껍게 검출된 것을 볼 수 있다. 3단계에서는 두껍게 검출된 edges을 non-maximum suppression 방식으로 얇게 만든다. non-maximum suppression은 픽셀이 가지는 방향으로 연결된 엣지 픽셀들을 비교하여 Gradient 값이 최대인 픽셀만 남기는 과정을 의미한다. (색은 2단계 색상표와 동일)
<4단계> 4단계에서는 3단계까지 거치고 남은 엣지중에 진짜 엣지를 선별하는 Hysteresis Thresholding을 진행한다. 픽셀의 gradient값이 high_threshold_value보다 높으면 확실한 엣지로 결정한다. Gradient 값이 low_threshold_value~high_threshold_value 사이에 있는 픽 셀은 해당 픽셀이 확실한 엣지와 연결되어 있으면 엣지로 선정하고 그렇지 않다면 엣지에서 탈락한다.
해당 결과에서 빨간색은 gradient가 high_threshold_value보다 확실히 높은 엣지이고, 파란 색은 gradient가 high_threshold_value와 low_threshold_value 사이에 있지만 확실한 엣지 들과 연결되어 엣지로 검출된 엣지이다. 노란색은 gradient가 high_threshold_value와 low_threshold_value 사이에 있지만 확실한 엣지와 연결돼있지 않아 최종 엣지에 검출되지 못하는 엣지이다. 최종 엣지 검출은 해당 결과에서 노란색을 제외한 부분이며 다음과 같다.
실제 검출된 엣지를 원본 이미지위에 그린 결과는 다음과 같다.
<전체 과정>
전체적으로 얇은 엣지를 잘 검출 한 것을 알 수 있다.
이미지에 따라 파라미터의 조절이 필요한점을 자동으로 처리할 방법이 필요