모폴로지(Morphology)란?
- 영상을 형태학적인 측면에서 다루는 기법
- 다양한 영상처리 시스템에서 전처리(pre-processing) 또는 후처리(post-processing) 형태로 널리 사용
- 수학적 모폴로지(mathematical morphology)
구조 요소(Structuring element)
- 모폴로지 연산의 결과를 결정하는 커널, 마스크, 윈도우
이진 영상의 침식(erosion) 연산
- 구조 요소가 객체 영역 내부에 완전히 포함될 경우 고정점 픽셀을 255로 설정
- 침식 연산은 객체 외곽을 깎아내는 연산 → 객체 크기는 감소 & 배경은 확대
이진 영상의 팽창(dilation) 연산
- 구조 요소와 객체 영역이 한 픽셀이라도 만날 경우 고정점 픽셀을 255로 설정
- 팽창 연산은 객체 외곽을 확대시키는 연산 → 객체 크기는 감소 & 배경은 확대
실제 영상의 침식 연산 결과
- 객체 영역(흰색)이 점점 줄어든다.
- 작은 크기의 객체(잡음) 제거 효과
침식이 진행될수록 hole이 커진다.
실제 영상의 팽창 연산 결과
- 객체 영역(흰색)이 점점 불어난다.
- 객체 내부의 홀(구멍)이 채워진다.
침식과 반대대는 양상을 보인다.
모폴로지 침식 연산
cv2.erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None) -> dst
- src : 입력 영상
- kernel : 구조 요소. getStructuringElement() 함수에 의해 생성 가능. 만약 None을 지정하면 3x3 사각형 구성 요소를 사용.
- dst : 출력 영상. src와 동일한 크기와 타입.
- anchor : 고정점 위치. 기본값 (-1, -1)을 사용하면 중앙점을 사용.
- iterations : 반복 횟수. 기본값은 1.
- borderType : 가장자리 픽셀 확장 방식. 기본값은 cv2.BORDER_CONSTANT.
- borderValue : cv2.BORDER_CONSTANT인 경우, 확장된 가장자리 픽셀을 채울 값.
모폴로지 팽창 연산
cv2.dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None) -> dst
- src : 입력 영상
- kernel : 구조 요소. getStructuringElement() 함수에 의해 생성 가능. 만약 None을 지정하면 3x3 사각형 구성 요소를 사용.
- dst : 출력 영상. src와 동일한 크기와 타입.
- anchor : 고정점 위치. 기본값 (-1, -1)을 사용하면 중앙점을 사용.
- iterations : 반복 횟수. 기본값은 1.
- borderType : 가장자리 픽셀 확장 방식. 기본값은 cv2.BORDER_CONSTANT.
- borderValue : cv2.BORDER_CONSTANT인 경우, 확장된 가장자리 픽셀을 채울 값.
모폴로지 구조 요소(커널) 생성
cv2.getStructuringElement(shape, ksize, anchor=None) -> retval
- shape : 구조 요소 모양을 나타내는 플래그
- ksize : 구조 요소 크기. (width, height) 튜플.
- anchor : MORPH_CROSS 모양의 구조 요소에서 고정점 좌표. (-1, -1)을 지정하면 구조 요소의 중앙을 고정점으로 사용.
- retval : 0과 1로 구성된 cv2.CV_8UC1 타입 행렬. numpy.ndarray. (1의 위치가 구조 요소 모양을 결정)
이진 영상의 침식과 팽창 예제
src = cv2.imread('circuit.bmp', cv2.IMREAD_GRAYSCALE)
se = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 3))
dst1 = cv2.erode(src, se)
dst2 = cv2.dilate(src, None)
...
se = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 7))
...
dst2 = cv2.dilate(src, se)
...
이전에 끊어진 부분이 있었던 dst2가 잘 이어진 모습을 관찰할 수 있다.