본문 바로가기
Data Science/2) Open CV

[Python] OpenCV 윤곽선 검출 필터 (필터 - 차분필터, filter2D, 로버츠 필터, 프리위트 필터, 소벨 필터, 라플라시안, 캐니)

by 은구잇 2021. 12. 8.
728x90

1. 이미지 필터링

Kernel 이라고 하는 행렬을 정의하고 커널을 이미지 위에서 이동시켜가면서 커널과 이미지 영역을 연산.

그 결과값으로 새로운 이미지를 만드는 것.

OpenCV 에서는  cv2.filter2D 를 이용하면

이미지와 kernel을 convolution(합성곱)하여 이미지를 필터링 할 수 있음.

 

아래와 같이 진행됨.

 

2. cv2.filter2D

모든 필터링 커널 행렬의 원소의 합은 1이 되도록 만들어져야해서

5x5 행렬이라면 (5,5) 형태로 선언후에 25로 나눠주는 작업을 해야함.

 

3. 로버츠 필터

대각선 방향으로 +1 과 -1을 배치시켜 사선 경계 검출 효과를 높임.

노이즈에 민감함.

 

 

로버츠 필터를 구현할때는 아래와 같이 함수를 만들어서 사용할 수도 있고

 

filter2D를 이용할 수도 있음.

 

4. 프리윗 필터 (Prewitt Filter)

x 축과 y축의 각 방향으로 차분을 세번 계산해서 경계를 검출하는 필터

상하좌우 경계는 잘 검출되지만 대각선 검출이 약함.

 

 

5. 소벨 필터

소벨 필터는 중심 픽셀의 차분 비중을 두 배로 준 필터.

따라서 소벨 필터는 x축, y축, 대각선 방향의 경계 검출에 모두 강함.

 

위에 나온 필터는 현재 거의 쓰이지 않지만, 소벨필터는 실무에서 많이 사용되어 opencv 에서 별도의 함수를 제공함.

 

<코드>

import cv2

img = cv2.imread("./OpenCV-images/house.jpg", cv2.IMREAD_GRAYSCALE)

x_edge = cv2.Sobel(img, -1, 1, 0, ksize=3)
y_edge = cv2.Sobel(img, -1, 0, 1, ksize=3)

cv2.imshow("Origin", img)
cv2.imshow("Sobel Filter X Y", np.c_[x_edge, y_edge])
cv2.imshow("Sobel Filter", x_edge+y_edge)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.waitKey(1)

 

6. 캐니 엣지(Canny Edge)

캐니 엣지는 한가지 필터만 사용하는 것이 아니라 4가지 알고리즘에 따라 경계를 검출.

 

1. 노이즈 제거 -> 가우시안 블러링 필터로 노이즈 제거

2. 경계 범위 방향 계산  -> 소벨필터로 검출

3. 검출된 경계 중 가장 큰 값만 선택.

4. 두개의 경계값을 설정해서 큰 경계깞 밖에 필셀과 연결성 없는 픽셀 제거.

 

  • edges = cv2.Canny(img, threshold1, threshold2, edges, apertureSize, L2gardient)
    img: 입력 영상
    threshold1, threshold2: 이력 스레시홀딩에 사용할 Min, Max 값
    apertureSize: 소벨 마스크에 사용할 커널 크기
    L2gradient: 그레디언트 강도를 구할 방식 (True: 제곱 합의 루트 False: 절댓값의 합)
    edges: 엣지 결과 값을 갖는 2차원 배열

위에 함수를 이용해보면 하나의 필터보다 경계 검출이 확실이 잘되고 뚜렷함.