모폴로지 필터링은 60년대에 영상 분석과 처리를 위해 처음 등장하였습니다. 미리 특정한 형태를 띠는 필터를 만들고 이 필터를 영상에 씌워 새로운 영상을 얻어내는 기법입니다. 이러한 모폴로지 연산은 어떻게 사용하냐에 따라서 여러 결과를 얻을 수 있습니다.
0123456789
<모폴로지 연산 예시 - 팽창>
침식과 팽창 연산은 현재 픽셀을 기준하여 필터를 적용하여 필터 영역안의 값을 확인하고 현재 픽셀의 값을 수정하게 됩니다.
- 침식 : 필터 영역내 픽셀 중 최소 픽셀값을 현재 픽셀값에 대입
- 팽창 : 필터 영역내 픽셀 중 최대 픽셀값을 현재 픽셀값에 대입
이러한 특징을 슬라이드를 통해 확인할 수 있으며 팽창 연산을 수행하면 결과로 10.png의 파란색 박스가 오른쪽의 결과처럼 변화하게 됩니다. 흰 영역(255)가 전보다 넓어지는 형태이기 때문에 팽창이라 부르고 반대의 경우를 침식이라고 부릅니다.
- void erode ( InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1, -1), int iteration = 1, int borderType = BORDER_CONSTANT, const Scalar & boderValue = morphologyDefaultBorderValue() )
입력 영상에 대해 입력 받은 커널을 필터로 하여 침식을 수행하는 함수입니다. 또 iteration에 값을 주어 원하는 만큼 침식을 수행할 수 있습니다. 침식 연산을 통해 이미지에서 원하지 않는 작은 노이즈들을 제거할 수 있습니다. 하지만 노이즈 성분이 제거되는 것뿐만 아니라 대상의 영역이 줄어들게 된다는 문제가 있습니다.
- void dilate ( InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1, -1), int iteration = 1, int borderType = BORDER_CONSTANT, const Scalar & boderValue = morphologyDefaultBorderValue() )
erode()와 사용법이 동일하고 결과에만 차이가 있습니다. 팽창 연산을 통해 이미지에서 대상이 가지는 작은 구멍들을 채울 수 있습니다. 하지만 대상의 크기가 전체적으로 전보다 커진다는 문제와 노이즈 성분이 커질 가능성이 있습니다.
이러한 침식과 팽창이 가지는 문제를 해결하기 위해 침식과 팽창을 연이어 사용하는 닫힘과 열림 연산이 존재합니다.
- void morphologyEx ( InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor = Point(-1, -1), int iteration = 1, int borderType = BORDER_CONSTANT, const Scalar & boderValue = morphologyDefaultBorderValue() )