Gradient Filter (code)
본 글은 2020-2학기 “컴퓨터 비전” 수업을 듣고, 스스로 학습하면서 개인적인 용도로 정리한 것입니다. 지적은 언제나 환영입니다 :)
수업 내용 중, Convolution filter를 이용해 이미지의 Edge를 추출하는 방법으로 Gradient filter가 소개되었다.
실제로 어떤 결과가 생기는지 흥미가 생겨 직접 코드로 확인해보자.
Gradient filter는 openCV
의 함수들을 이용해 정말 쉽게 구현할 수 있다!
먼저 전체 코드는 아래와 같다.
import cv2
IMG_PATH = "origin.png"
if __name__ == "__main__":
# load image
img = cv2.imread(IMG_PATH)
# make image gray
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# take gradient
## Gaussian blurring
blurred = cv2.GaussianBlur(img, (3, 3), 0)
## sobel filter
sobelX = cv2.Sobel(blurred, cv2.CV_8U, 1, 0, ksize=3)
sobelY = cv2.Sobel(blurred, cv2.CV_8U, 0, 1, ksize=3)
## merge two gradients
gradient = sobelX + sobelY
cv2.imshow("Gradient Image", gradient)
cv2.waitKey()
# cv2.imwrite("Gradient Image", gradient)
코드의 로직을 하나씩 살펴보자.
이미지의 Edge만 살펴볼 것이기 때문에 RGB 이미지를 gray 이미지로 바꿔준다.
# make image gray
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
먼저 입력된 이미지에 Gaussian 필터를 적용해 blurring한다. Gaussian 필터는 적요하면 Noise를 제거할 수 있어, 더 nice한 결과를 얻을 수 있다.
## Gaussian blurring
blurred = cv2.GaussianBlur(img, (3, 3), 0)
이제 이미지에 Gradient를 적용하는 부분이다. Gradient filter를 Sobel filter라고도 하는데, openCV
의 cv2.Sobel()
함수를 사용하면 된다!
## sobel filter
sobelX = cv2.Sobel(blurred, cv2.CV_8U, 1, 0, ksize=3)
sobelY = cv2.Sobel(blurred, cv2.CV_8U, 0, 1, ksize=3)
sobelX
는 수평 성분을 제거한 이미지로, 수직 Edge를 검출한다. 반대로 sobelY
는 수직 성분을 제거한 이미지로, 수평 Edge를 검출한다.
이제 수직/수평 Edge를 검출한 것을 합쳐주면 된다.
## merge two gradients
gradient = sobelX + sobelY
출력된 결과를 보면 알 수 있듯이 cv2.Sobel()
같은 openCV
의 함수들을 잘 이용하면 이미지의 Edge를 쉽게 검출할 수 있다.
수업 PPT에 있는 사진은 결과가 회색 배경이던데, 본인의 결과는 검은 배경으로 출력이 된다. 아마 전처리 방식이 조금 다른 것 같다!
심심해서 본인 로고에도 적용해봤다 ㅎㅎ