728x90
미분 필터링
- 엣지를 검출하는데 사용된다.
- 경계를 검출하려면 픽셀 값의 변화가 급격히 일어나야한다.
- 연속된 필셀 값이 미분 연산을 해서 경계 값을 검출한다.
- 영상 속 픽셀 데이터는 연속적이지 않고 이산적이라 근사값으로 계산한다.
기본
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)
'OpenCV' 카테고리의 다른 글
파이썬 OpenCV 미분 필터링 -3 : Canny (0) | 2020.07.26 |
---|---|
파이썬 OpenCV 미분 필터링 -2 : Sobel / Scharr / Laplacian (0) | 2020.07.25 |
파이썬 OpenCV 기하학적 변환 알아보기 -3 : Affine / Perspective Transformation (0) | 2020.07.25 |
파이썬 OpenCV 이미지에 글자 출력하기 : 한글 출력 (PIL) (0) | 2020.07.24 |
파이썬 OpenCV 를 위한 Numpy 정리 (0) | 2020.07.24 |