Thresholding에 의해 얻어진 binary image를 좀 더 가공하여 완성도를 높이기 위해서는morphology를 이용한다. 가공의 의미는 noise나 너무 작은 feature들을 제거하는 것을 의미한다.
Morphology는 structuring element (SE)라는 것을 이용하는데, 이것은 마치 bit mask와 같은 것이다. Bit-mask가 1차원인데 반해, SE는 2차원이다. SE를 이미지 위에 슬라이딩 시켜가면서 logical operation을 수행하여 결과 이미지를 만든다. original image는 변하지 않고, 새로운 이미지가 만들어진다. 이 분야는 독자적인 학회를 가지고 있을 정도로 이론적으로 정립되어 있다.
SE는 여러 가지 모양을 가질 수 있는데, 일반적으로 정사각형 모양이면 isotropic이라고 한다. SE를 구성하는 픽셀 들 중의 하나를 origin이라고 한다. 이 origin을 이미지의 각 픽셀마다 매칭시켜가면서 morphology가 수행된다. 보통은 이미지의 좌상단에 origin을 두고, 이후에는 좌에서 우로, 위에서 아래로 움직여가면서 순차적으로 수행한다. 수행결과가 나오면 origin 위치의 이미지 픽셀의 값이 결정된다. 아래 그림은 3x3, 5x5 isotropic SE들의 예를 보여주며, 가운데 x로 표시한 픽셀이 origin이다.
대표적인 morphological operation에는 dilation, erosion, opening, closing 등이 있다. 여기서는 각각에 대해서 알아본다.
1. Dilation
사전적인 의미로는 확장하다, 크게하다라는 의미로, 이미지 상의 물체를 확대시키는 효과를 가진다. 쉽게 이해하자면, SE origin과 매칭된 이미지 상의 픽셀을 SE의 모든 다른 픽셀들로 확대한다고 보면 된다. 아래 그림에서는 3x3 isotropic SE을 이용하여 dilation을 수행할 때 어떠한 결과가 생기는지를 간략히 보여준다.
OpenCV 는 dilation을 위한 함수 dilate(binary_image, dilated_image, Mat())를 제공한다. 이 함수에 의해서, binary_image는 default 3x3 SE를 이용하여 dilation되고, 그 결과는 dialated_image에 저장된다.다른 SE를 사용하려면, 예를 들어, 5x5 isotropic이라면, 아래와 같이 한다.
아래 두 개의 예는 dilation의 적용결과를 보여준다. 그림 1과 그림 2는 동일한 컬러 입력이미지에 대해서, 두 가지 thresholding방식을 적용하고, dilation (3x3 isotropic structuring element)을 수행한 결과이다.
그림 1은 왼쪽의 입력이미지에 대해 Otsu threshoding을 이용하여 중간결과를 얻었다. 입력 이미지 전체의 조명상황이 고르치 않기 때문에, 하나의 threshold를 이용하는 Otsu방법의 결과에는 한계가 있다. 좌하단 영역이 소실된 것을 알 수 있다. 여기에 dilation을 수행하여 오른쪽 결과를 얻었는데, 글자들이 굵어진 것을 알 수 있다.
[그림 1: Otsu thresholding을 이용한 binary image에 dilation을 적용한 결과]
그림 2는 영역별로 다른 threshold를 사용하는 adaptive thresholding을 적용한 결과로 고르지 않은 조명상황에도 불구하고, 이미지 전체가 고루 반영되는 것을 볼 수 있다. (중간이미지). 하지만 전체적으로 noise가 상당히 많은 것을 볼 수 있다. 여기에 dilation (3x3 isotropic SE)을 적용하면 noise의 상당부분이 사라진 것을 볼 수 있고, 글자체도 전반적으로 굵어진 것을 알 수 있다.
Dilation의 반대로, 이미지상의 물체를 축소(shrinking)하는 역할을 한다. 이를 위해 SE를 완전히 포함할 수 있는 이미지상의 픽셀들만 결과 이미지에 남게 된다. 그 결과, 물체크기가 줄어들게 되고, 이미지상의 noise나 narrow feature 등이 사라지게 되는 효과가 있다. Erosion의 또다른 용도는 매칭으로도 사용할 수 있다는 것이다. SE를 찾고자 하는 패턴으로 지정하고 erosion을 실행하면, 결과이미지는 패턴이 발견되는 위치들이 된다.

OpenCV는 이를 지원하는 함수 erode를 가지고 있다. 예를 들어, default 3x3 isotropic structuring element 에 의한 erosion은 다음과 같이 수행한다.
erode(binary_image, eroded_image, Mat());
다른 형태의 SE를 사용하려면, 예를 들어 5x5 isotropic SE인 경우 아래와 같다.
아래 그림 3은 dilation 예에서 사용한 동일한 입력이미지에 대해서 erosion을 수행한 결과이다. 중간이미지는 이전과 마찬가지로 adaptive thresholding (block size = 51)을 적용하였다. 오른쪽 결과는 erosion결과를 보여주는데, 3x3 SE를 온전히 품을 수 있는 흰색영역이 적다보니 대부분에서 글자가 사라지는 부정적인 결과를 보여주고 있다.
Opening은 erosion과 dilation의 조합이다. 이미지에 erosion을 먼저 적용한 후, 그 결과에 다시 dilation을 적용하는 것이다. 이 때, 같은 structuring element를 이용한다. 그 결과, 이미지에서 noise와 narrow feature들이 제거되지만, 물체의 크기는 보존된다.
OpenCV는 opening을 위한 함수를 제공한다. 예를 들어, 5 by 5 isotropic structuring element를 이용한 opening은 다음과 같다.
Mat five_by_five_element (5, 5, CV_8U, Scalar(1));
아래 그림 4는 opening을 적용한 결과이다. 위의 예제들과의 차이점이라면, 원본크기의 이미지에 opening을 모두 적용한 후 이미지 크기를 줄였다는 것이다. 중간이미지와 오른쪽 이미지를 비교해 보면, 중간이미지의 흰색이 많이 없어지고 검정색이 늘었다는 것을 볼 수 있다. 이것은 5x5 SE가 포함될 흰색부분이 많이 없기 때문에 그렇게 된 것이다.
[그림 4: Adaptive thresholding (block size=101)을 이용한 binary image에 opening을 적용한 결과. 5x5 isotropic structuring element를 적용.]
4. Closing
Mathematical morphology에서 erosion과 dilation은 서로 dual operation의 관계라고 하는데, 이는 erosion이 물체 픽셀들을 깍아내는 것이라면, dilation은 덧붙여나가는 것과 같이 서로 정반대의 역할을 하기 때문이다. Erosion에 의해서는 물체가 작아지지만, dilation은 물체가 커지게 된다. erosion과 dilation간의 dual 관계와 마찬가지인 것이 openning과 closing이다.
Closing은 opening과 유사하지만 두 동작의 적용순서가 거꾸로이다. 우선 dilation을 적용하여 결과를 얻은 후 거기에 erosion을 수행한다. 역시 마찬가지로 같은 structuring element를 이용한다. Closing은 narrow gap등을 메꾼 후, 물체 경계를 smoothing하는 효과가 있으되, 물체의 원래 크기가 보존된다.
OpenCV는 closing을 위한 함수를 제공한다. 예를 들어, 5 by 5 isotropic structuring element를 이용한 closing은 다음과 같다.
Mat five_by_five_element (5, 5, CV_8U, Scalar(1));
아래 그림 5는 closing 연산을 적용한 결과이다. 중간이미지는 위의 opening의 경우와 동일하지만, closing연산의 결과 (맨오른쪽 이미지)에서 글씨가 훨씬 더 잘 인식되는 것을 알 수 있고, 배경에 해당하는 검은 색이 대부분 사라진 것을 알 수 있다.
[그림 5: Adaptive thresholding 결과에 closing을 적용한 결과]
5. Closing followed by Opening
위의 closing의 결과에서 볼 수 있듯이, opening보다는 noise 제거 측면에서 효과가 좋다. 따라서 일반적으로 opening과 closing은 연속적으로 적용되어 이용된다. 이미지에 closing을 먼저 적용하고, 다시 opening을 수행하는데, 같은 structuring element를 이용한다. 이렇게 하면, 이미지를 전체적으로 깨끗하게 정리하는 효과가 있다.
아래 그림은 closing과 opening을 순차적으로 적용한 결과이다. 우측끝에서 두 번째가 closing을 적용한 결과이고, 맨 오른쪽이 opening까지 적용한 결과이다. 두 결과는 대체적으로 동일해 보이지만, 글자인식면에서 맨 끝의 "Test" 글자가 opening이 후에 보다 선명해진 것을 볼 수 있다. (아래 그림을 확대해서 확인)
기본적으로 morphology는 binary image에 적용된다. 하지만 grey-scale 이나 컬러이미지에도 적용이 가능하다. Grey-scale 이미지에 적용하는 방법은 조금 복잡한데, 각 grey-level별로 이미지를 따로 만든 후, morphology를 적용하고 이미지들을 하나로 합친다. 즉, grey-level 1을 가지는 픽셀들만 모아서 이미지1를 만들고, 이런 식으로 이미지2, 이미지3,..., 이미지 255를 만든다. 단, 이미지 0은 따로 만들 필요가 없다. 그리고 각 이미지i에 대해서 morphology 연산을 수행한 후, 각 결과이미지들을 ORing 하여 하나로 합친다.
컬러이미지에 morphology연산을 적용하는 방법도 gray-level 이미지와 유사하되, R, G, B채널별로 나누어서 각 채널을 grey-scale 이미지인 것 처럼 처리하고, 그 결과들을 합친다.
OpenCV에서 제공하는 morphology 관련 함수들은 grey-scale과 컬러이미지에 대해서도 동작한다. 방식은 위에서 설명한 방식을 따른다. 이 함수들을 사용하기 위해서는 입력영상으로 grey-scale과 컬러이미지으로 지정하면 된다.
아래 그림 7과 8은 컬러이미지에 각각 erosion (그림 7)과 dilation (그림 8)을 적용한 결과이다. 우선 그림 7부터 살펴보면, erosion은 흰색 (밝은 색)을 깍아내는 경향이 있으므로 어두운 색인 글씨들이 더 굵어지고 선명해진 것을 볼 수 있다. 그림 8의 dilation은 흰색이 확장되는 경향이 있으므로 어두운 색인 글씨들이 가늘어지고 끊어지는 것을 볼 수 있다.