모폴로지 Morphology
모폴로지는 형태학이라는 의미를 갖고 있다.
영상을 형태학적인 측면으로 접근하는 것이 모폴로지이다. 모양에 대한 정보에 더 집중한다.
다양한 영상 처리 시스템에서 전처리(pre-processing) 또는 후처리(post-processing) 형태로 널리 이용된다.
구조 요소(structuring element)는 모폴로지 연산의 결과를 결정하는 커널, 마스크, 윈도우 입니다.
- 모폴로지는 필터링과 비슷한 연산을 내부에서 진행한다.
- 모폴로지에서는 필터가 structuring element 라고 한다.
- 다양한 형태가 있지만 주로 정방형 행렬(3X3)을 이용한다.
- 필터와 마찬가지로 중앙에 고정점(Anchor)이 있다.
이진 영상의 침식(erosion) 연산
침식 연산은 객체 외각을 깍아내는 연산이다.
구조 요소가 객체 영역 내부에 완전히 포함될 경우 고정점 픽셀을 255로 설정한다.
객체 크기는 감소하고 배경은 확대 된다.
객체 영역(흰색)이 점점 줄어든다. 작은 크기의 객체(잡음)제거 효과가 있다.
내부 연산은 구조 요소로 전체 영상을 스캔한다. 구조 요소안에 객체로 가득 찼을 시에 앵커 포인터에 마킹을 하고, 전체 영상을 스캐하며서 마킹을 한뒤에 마킹된 부분만 남기고 다 제거한다.
이진 영상의 팽창(dilation) 연산
팽창 연산은 객체 외곽을 확대시키는 연산이다.
구조 요소와 객체 영역이 한 픽셀이라도 만날 경우 고정점 픽셀을 255로 설정한다.
객체 크기는 감소되고 배경은 확대된다.
객체 영역(흰색)이 점점 커지며, 객체 내부의 홀(구멍)이 채워지게 된다.
구조 요소 크기와 모양을 어떻게 적용하냐에 따라 다른 형태로 채워나가게 된다.
✔︎ 모폴로지 침식 연산 함수 - cv2.erode
dst = cv2.erode(src, kernel, dst=None, anchor=None,
iterations=None, borderType=None, borderValue=None)
- src : 입력 영상
- kernel : 구조 요소. getStructuringElement() 함수에 의해 생성 가능. 만약 None을 지정하면 3x3 사각형 구성 요소를 사용.
- dst : 출력 영상. src와 동일한 크기와 타입.
- anchor : 고정점 위치. 기본값 (-1, -1)을 사용하면 중앙점을 사용.
- iterations : 반복 횟수. 기본값은 1.
- borderType : 가장자리 픽셀 확장 방식. 기본값은 cv2.BORDER_CONSTANT.
- borderValue : cv2.BORDER_CONSTANT인 경우, 확장된 가장자리 픽셀을 채울 값.
kernel에 None을 지정하면 3x3 사각형 구성 요소를 사용한다.
kernel을 만드는 함수를 이용해서 만든 kernel을 입력해도 된다.
iteration은 침식 연산을 얼마나 반복할 것인지에 대한 정보이다.
✔︎ 모폴로지 팽창 연산 함수 - cv2.dilate
dst = cv2.dilate(src, kernel, dst=None, anchor=None,
iterations=None, borderType=None, borderValue=None)
- src : 입력 영상
- kernel : 구조 요소. getStructuringElement() 함수에 의해 생성 가능. 만약 None을 지정하면 3x3 사각형 구성 요소를 사용.
- dst : 출력 영상. src와 동일한 크기와 타입.
- anchor : 고정점 위치. 기본값 (-1, -1)을 사용하면 중앙점을 사용.
- iterations : 반복 횟수. 기본값은 1.
- borderType : 가장자리 픽셀 확장 방식. 기본값은 cv2.BORDER_CONSTANT.
- borderValue : cv2.BORDER_CONSTANT인 경우, 확장된 가장자리 픽셀을 채울 값.
✔︎ 모폴로지 구조 요소(커널) 생성 함수 - cv2.getStructuringElement
retval = cv2.getStructuringElement(shape, ksize, anchor=None)
- shape : 구조 요소 모양을 나타내는 플래그
- ksize : 구조 요소 크기. (width, height) 튜플.
- anchor : MORPH_CROSS 모양의 구조 요소에서 고정점 좌표.
(-1, -1)을 지정하면 구조 요소의 중앙을 고정점으로 사용. - retval : 0과 1로 구성된 cv2.CV_8UC1 타입 행렬. numpy.ndarray.
(1의 위치가 구조 요소 모양을 결정)
💬 이진 영상의 침식과 팽창 예제
import sys
import numpy as np
import cv2
src = cv2.imread('circuit.bmp', cv2.IMREAD_GRAYSCALE)
if src is None:
print('Image load failed!')
sys.exit()
se = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 3))
dst1 = cv2.erode(src, se)
dst2 = cv2.dilate(src, None)
cv2.imshow('src', src)
cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)
cv2.waitKey()
cv2.destroyAllWindows()
'OpenCV' 카테고리의 다른 글
[OpenCV with Python] 이진 영상 처리 : 레이블링 (0) | 2022.02.04 |
---|---|
[OpenCV with Python] 이진 영상 처리 : 모폴로지(Morphology) - 열기와 닫기 (0) | 2022.02.04 |
[OpenCV with Python] 이진 영상 처리 : 지역 이진화 - cv2.adaptiveThreshold (0) | 2022.02.04 |
[OpenCV with Python] 이진 영상 처리 : 자동 이진화 - Otsu 방법 (0) | 2022.02.04 |
[OpenCV with Python] 이진 영상 처리 : 영상의 이진화 - cv2.threshold (0) | 2022.02.04 |