[opencv-python] Edge 찾기

2019. 7. 8. 00:15Python-이론/python-opencv

Edge 찾기

이번에는 openCv를 통해서 이미지의 Edge를 찾아보겠습니다. gradient(이미지의 변화율)을 이용하여 에지를 찾는 법에 대해 알아보겠습니다. 

 

OpenCv는 Sobel, Scharr, Laplacian 세가지 타입의 Gradient 필터를 제공합니다. 

 

에지랑 아래의 사진과 같이 변화폭이 큰 것을 의미합니다. 미분을 해보면 밑의 두번째 사진입니다. 두번째 사진과 같이 미분값이 큰 부분을 엣지로 선택하게됩니다. 

미분 전
미분 후

 

sobel에서는 전용 커널을 이용하여 컨볼루션하여 에지를 검출합니다. Gx는 가로방향을 Gy는 세로방향을 이용합니다. 

 

Sobel코드

import cv2
import numpy as np


img = cv2.imread("../resource/Images/nike.jpg", cv2.IMREAD_GRAYSCALE)
img_sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
img_sobel_x = cv2.convertScaleAbs(img_sobel_x)

img_sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
img_sobel_y = cv2.convertScaleAbs(img_sobel_y)

img_sobel = cv2.addWeighted(img_sobel_x, 1, img_sobel_y, 1, 0)


cv2.imshow("sobel_x", img_sobel_x)
cv2.imshow("sobel_y", img_sobel_y)
cv2.imshow("sobel", img_sobel)

cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.Sobel(src, ddept, dx, dy , ksize)

src: 이미지 데이터 

ddept: 출력 이미지 타입

dx, dy: 각방향 미분 차수이다. 1, 0이면 x방향으로 미분한다는 뜻이다. 

ksize: 커널의 크기를 의미한다. 3이면 3*3을 뜻합니다. 

cv2.convertScaleAbs

미분한 결과에 절대값을 적용하고 값 범위를 8bit unsigned int형으로 바꾸어준다. 

cv2.addWeighted
두개의 결과를 합쳐준다. 

 

결과

soblex를 보면 가로의 edge를 유별나게 보이게 되고 sobley는 y edge를 보여준다. 

미분은 변화율을 구하는 수학적인 방법입니다. x방향의 미분이면 x의 방향을 따라서 변화가 있다면 변화를 감지하여 edge를 검출하는 방식입니다. x방향의 변화율은 세로줄이고 y방향의 변화율은 가로이다. 따라서 위의 결과 이미지에서 sobel_x는 세로선이 더 감지되고 sobel_y는 가로선이 더 감지된다. 

 

Laplacian

아래의 편미분을 활용하여 edge를 검출하는 방식입니다. laplacian은 x방향의 편미분과 y방향의 편미분 결과가 더해진 형태가 결과가 된다. 

코드

import cv2
import numpy as np


img = cv2.imread("../resource/Images/receipt.png", cv2.IMREAD_GRAYSCALE)
laplacian = cv2.Laplacian(img, cv2.CV_32F)


cv2.imshow("original", img)
cv2.imshow("laplacian", laplacian)

cv2.waitKey(0)
cv2.destroyAllWindows()

결과