5.15. 형태학적 연산

형태학적 연산은 이진 이미지 – 임계값 처리와 에지 검출에서 나오는 마스크 – 에 작동합니다. 각 연산은 평활화 필터가 사용하는 것과 같은 종류의 슬라이딩 이웃을 따라가지만, 모든 위치에서 묻는 질문은 예/아니오입니다. 이웃의 모든 픽셀이 켜져 있는가, 이웃의 어떤 픽셀이라도 켜져 있는가, 켜짐/꺼짐 패턴은 어떻게 생겼는가? 그 답은 평균화 필터가 할 수 없는 방식으로 영역을 키우고, 줄이고, 경계를 다시 자릅니다.

형태학은 초기 이진 마스크 – 임계값 처리, 에지 검출 또는 다른 분류기의 출력 – 와 파이프라인의 나머지 부분이 사용할 수 있는 깨끗한 이진 마스크 사이에 오는 것입니다. 원시 임계값 출력은 보통 진짜 전경 영역 곳곳에 흩어진 고립된 노이즈 픽셀, 그렇지 않으면 단단한 영역에 뚫린 작은 구멍, 그리고 임계값이 물체의 에지 가까이에서 잘린 곳의 들쭉날쭉한 경계를 가지고 있습니다. 형태학은 그러한 결함을 제거합니다.

5.15.1. 네 가지 고전적 연산

두 가지 기본 연산과 그것들을 조합한 두 가지가 형태학적 도구 모음을 구성합니다:

dilate()는 모든 전경 영역을 키웁니다. 규칙은 다음과 같습니다. (2 * size + 1) 윈도우 안에 적어도 하나의 전경 이웃을 가진 픽셀은 전경이 됩니다. 눈에 보이는 효과는 전경 영역이 모든 방향으로 size 픽셀만큼 커지고, 그 내부의 구멍이 같은 양만큼 줄어들거나 사라진다는 것입니다.

erode()는 그 반대를 수행합니다. 윈도우 안의 모든 이웃이 전경이 아닌 픽셀은 배경이 됩니다. 전경 영역은 모든 방향으로 size 픽셀만큼 작아지고, 고립된 전경 픽셀(전경 이웃이 없는)은 완전히 사라지며, 더 큰 영역들 사이의 작은 연결이 잘립니다.

맨 왼쪽 패널에 이진 입력 영역이 있습니다. 가운데에 한 픽셀짜리 구멍이 있고 그 주위에 세 개의 고립된 노이즈 픽셀이 있는 단단한 정사각형입니다. 오른쪽의 네 패널은 그 입력에 dilate, erode, open, close를 적용한 결과를 보여줍니다. Dilate는 영역을 키우고, 구멍을 채우고, 각 노이즈 픽셀을 블록으로 키웁니다. Erode는 영역을 줄이고, 구멍을 키우고, 노이즈를 제거합니다. Open은 영역과 그 구멍을 정확히 재현하면서 노이즈를 제거합니다. Close는 영역의 윤곽선과 노이즈 픽셀을 정확히 재현하면서 구멍을 채웁니다.

노이즈가 있는 이진 영역에 적용된 네 가지 고전적 형태학적 연산. Erode는 줄이고, dilate는 키우며, open은 erode 후 dilate(노이즈 제거)이고, close는 dilate 후 erode(구멍 채우기)입니다.

open()erode 후 dilate입니다. 침식된 이미지는 모든 고립된 노이즈 픽셀이 제거되었지만, 모든 방향으로 size 픽셀만큼 줄어들기도 했습니다. erode 다음에 같은 크기의 dilate를 적용하면 진짜 전경 영역을 노이즈가 제거된 상태로 두면서 대략 원래 경계로 복원합니다. 이 조합이 open을 고전 형태학에서 표준 “노이즈 제거” 연산으로 만드는 것입니다. 고립된 전경 픽셀은 사라지고, 실제 영역은 손상되지 않고 돌아옵니다.

close()는 그 거울상입니다 – dilate 후 erode입니다. Dilate는 전경 영역 내부의 작은 구멍을 채우고 작은 간격으로 분리된 영역들을 연결합니다. Erode는 채워진 내부를 단단하게 둔 채로 결과를 원래의 외부 경계로 다시 줄입니다. close는 표준 “작은 간격 채우기” 연산입니다.

binary_mask.open(1)       # remove single-pixel noise
binary_mask.close(2)      # fill small holes and gaps

size 매개변수는 밝기 필터에서와 같은 의미를 갖습니다. size=1은 3×3 이웃, size=2는 5×5 등을 의미합니다. 크기가 클수록 더 적극적인 정리를 의미하며 – 픽셀당 비용도 더 길어집니다.

5.15.2. 탑햇과 블랙햇

두 가지 추가 조합은 openclose가 제거하는 특징들을 정확히 추출하기 때문에 알아둘 가치가 있습니다:

top_hat()은 원본 이미지와 그것을 열기(open)한 버전의 차이open이 제거했을 전경 픽셀 – 를 반환합니다. 그것은 말 그대로 노이즈 픽셀, 고립된 작은 전경 영역, open 연산이 보존할 수 없었던 얇은 전경 구조의 마스크입니다. 작은 전경 특징을 제거하는 것이 아니라 그러한 특징이 애플리케이션이 관심을 두는 대상일 때 그것들을 추출하는 데 유용합니다.

black_hat()은 이미지를 닫기(close)한 버전과 원본의 차이close가 채웠을 배경 픽셀 – 를 반환합니다. 그것은 전경 영역 내부의 작은 구멍, close 연산이 다리를 놓았을 영역 사이의 좁은 간격의 마스크입니다.

둘 다 네 가지 기본 연산보다 덜 사용되지만, 그 패턴은 기억해 둘 가치가 있습니다 – 애플리케이션이 표준 정리 과정이 제거하는 작거나 얇은 특징을 추출해야 할 때, 탑햇과 블랙햇은 그것들을 되찾는 자연스러운 방법입니다.

5.15.3. 임계값 모드

네 가지 기본 형태학적 연산은 모두 각 위치에서 켜짐/꺼짐 테스트를 완화하는 정수 threshold 키워드를 받습니다. 그것이 없으면 연산은 위 설명대로 동작합니다. erode()모든 이웃이 켜져 있을 것을 요구하고, dilate()적어도 하나를 요구합니다. threshold가 설정되면, 각 연산은 그만큼의 이웃이 반대로 투표하는 것을 허용합니다. erode의 경우 threshold는 픽셀이 여전히 살아남으면서 가질 수 있는 배경 이웃의 수입니다. threshold=4는 여덟 이웃 중 적어도 넷이 켜져 있는 픽셀을 유지하므로(3×3 윈도우에서 중심 픽셀은 여덟 개의 이웃을 가집니다) 덜 적극적으로 침식합니다. dilate의 경우 threshold는 배경 픽셀이 켜지기 전에 더 많이 가지고 있어야 하는 전경 이웃의 수입니다. threshold=2는 하나가 아니라 적어도 세 개의 전경 이웃을 요구하므로 덜 적극적으로 키웁니다.

임계값 형식은 윈도우의 크기를 바꾸지 않고 형태학적 과정의 적극성을 조정하는 데 유용한데, 윈도우 크기를 바꾸면 그것이 작용하는 특징의 규모도 바뀌게 됩니다. 대부분의 애플리케이션은 기본 동작을 고수합니다. 임계값 형식은 기본값이 약간 너무 많거나 너무 적은 경우를 위해 존재합니다.