[opencv-python] Canny 알고리즘으로 Edge 찾기

2019. 7. 8. 02:03Python-이론/python-opencv

Canny 알고리즘으로 Edge 찾기

canny 알고리즘은 여러 개의 단계를 거쳐서 Edge를 detection하는 방법입니다. 

 

1단계: 노이즈 제거

이미지에 노이즈가 많으면 에지를 찾는 것이 어려울 수 있습니다. 따라서 첫단계에 5x5 가우시안 필터를 이용해 이미지의 노이즈를 줄여줍니다. 

 

2단계: Gradient 값이 높은 부분을 찾기

Sobel 커널을 수평방향, 수직방향으로 적용하여 각 방향의 gradient를 획득합니다. 수평방향을 gradient를 Gx, 수직방향으의 gradient Gy edge를 인식할 수 있습니다. 

 

3단계: 최대 값이 아닌 픽셀 0으로 만들기 

이미지의 픽셀을 full Scan해서 edge가 아닌 pixel을 제거합니다. 

 

4단계: Hyteresis Thresholding

이 Edge가 진짜 edge인지 가짜 edge인지 판단할 수 있습니다. max val과 min val을 설정하여 max val이상이면 강한 edge, max val과 min val 사이이면 약한 edge입니다. 그후 약한 edge가 진짜 edge인지 판단하기 위해 강한 edge와 연결이 되어 있으면 edge이고 아니면 제거합니다. 

 

코드

import cv2
import matplotlib.pyplot as plt


img = cv2.imread("../resource/Images/nike.jpg", cv2.IMREAD_GRAYSCALE)

canny = cv2.Canny(img, 30, 70)
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
laplacian = cv2.Laplacian(img, cv2.CV_8U)

images = [canny, sobelx, sobely, laplacian]
titles = ['canny', 'sobelx', 'sobely', 'laplacian']

for i in range(4):
    plt.subplot(2, 2, i+1), plt.imshow(images[i]), plt.title(titles[i])
    plt.xticks([]), plt.yticks([])

plt.show()

결과