본문으로 바로가기

파이썬 OpenCV 미분 필터링 -1

category OpenCV 2020. 7. 25. 21:13

미분 필터링

  • 엣지를 검출하는데 사용된다.
  • 경계를 검출하려면 픽셀 값의 변화가 급격히 일어나야한다.
  • 연속된 필셀 값이 미분 연산을 해서 경계 값을 검출한다.
  • 영상 속 픽셀 데이터는 연속적이지 않고 이산적이라 근사값으로 계산한다.

 

기본

filter2D 함수에 kernel을 적용합니다.

import cv2
import os
import numpy as np

path = os.path.join('image', 'sudoku.jpg')
img = cv2.imread(path)

x_kernel = np.array([[-1, 1]])
y_kernel = np.array([[-1], [1]])

edge_gx = cv2.filter2D(img, -1, x_kernel)
edge_gy = cv2.filter2D(img, -1, y_kernel)

cv2.imshow('img', img)
cv2.imshow('edge_gx', edge_gx)
cv2.imshow('edge_gy', edge_gy)

cv2.waitKey()
cv2.destroyAllWindows()

 

x 축 방향 미분

x_kernel = np.array([[-1, 1]])
edge_gx = cv2.filter2D(img, -1, x_kernel)

y 축 방향 미분

y_kernel = np.array([[-1], [1]])
edge_gy = cv2.filter2D(img, -1, y_kernel)

 

 

로버츠(Roberts) 마스크

로버츠 마스크는 대각선 방향으로 1과 -1을 배치하여 사선 엣지 검출 효과를 높입니다.

수행 속도가 빠르지만, 노이즈에 민감하고 엣지 강도가 약한 단점이 있습니다.

 

import cv2
import os
import numpy as np

path = os.path.join('image', 'sudoku.jpg')
img = cv2.imread(path)

x_kernel = np.array([[1, 0], [0,-1]])
y_kernel = np.array([[0, 1], [-1,0]])

edge_gx = cv2.filter2D(img, -1, x_kernel)
edge_gy = cv2.filter2D(img, -1, y_kernel)

cv2.imshow('img', img)
cv2.imshow('edge_gx', edge_gx)
cv2.imshow('edge_gy', edge_gy)

cv2.waitKey()
cv2.destroyAllWindows()

 

x 축 방향 미분

x_kernel = np.array([[1, 0], [0,-1]])
edge_gx = cv2.filter2D(img, -1, x_kernel)

y 축 방향 미분

y_kernel = np.array([[0, 1], [-1,0]])
edge_gy = cv2.filter2D(img, -1, y_kernel)

 

 

프리윗(Prewitt) 마스크

기존의 미분을 세 번하여 엣지의 강도가 강하고, 수직과 수평 엣지를 동등하게 찾는 장점이 있습니다.

수직과 수평에 비해 대각선 검출이 약하다는 단점이 있습니다.

 

import cv2
import os
import numpy as np

path = os.path.join('image', 'sudoku.jpg')
img = cv2.imread(path)

x_kernel = np.array([[-1, 0, 1], [-1,0,1], [-1, 0, 1]])
y_kernel = np.array([[-1, -1, -1], [0, 0, 0], [1, 1, 1]])

edge_gx = cv2.filter2D(img, -1, x_kernel)
edge_gy = cv2.filter2D(img, -1, y_kernel)

cv2.imshow('img', img)
cv2.imshow('edge_gx', edge_gx)
cv2.imshow('edge_gy', edge_gy)

cv2.waitKey()
cv2.destroyAllWindows()

 

x 축 방향 미분

x_kernel = np.array([[-1, 0, 1], [-1,0,1], [-1, 0, 1]])
edge_gx = cv2.filter2D(img, -1, x_kernel)

y 축 방향 미분

y_kernel = np.array([[-1, -1, -1], [0, 0, 0], [1, 1, 1]])
edge_gy = cv2.filter2D(img, -1, y_kernel)