[Image Processing] 구조적 요소(Structuring Element) 및 팽창, 침식, 닫힘, 열림 연산
수학적 형태학이란?
수학적 형태학(Mathematical Morphology, MM)은 집합론, 격자론, 위상수학 그리고 무작위 함수에 기반한 기하학적 구조를 분석하고 처리하는 이술과 기론이다. 이는 대부분 디지털 이미지에 적용되지만, 그래프, 폴리곤 메시, 솔리드, 그리고 많은 공간 구조에도 적용할 수 있다. 크기, 모양, 블록성, 연결성 그리고 지오데식 거리 같은 위상수학적 그리고 기하학적 연속 공간 개념은 MM에 의해서 연속 공간과 이산 공간 모두에서 소개되었다. 또한 이미지를 위의 특성화에 따르도록 이미지를 변환하는 연산의 집합으로 이루어진 형태학적 디지털 화상 처리의 근본이다.
구조적 요소란?
구조적 요소란 원본 이미지에 적용되는 커널(Kernel)이라고 할 수 있는데, 수학적 형태학에서 구조적 요소(Structuring Element)란 이 형태가 이미지에 맞는지, 맞지 않는지를 결론 내기 위해 주어진 이미지를 탐색하거나 작용하는데 사용되는 형태이다. 이는 특히 팽창(Dilation), 침식(Erosion), 열기(Opening), 닫힘(Closing)과 같은 형태학적 연산에 사용된다.
구조적 요소는 3 x 3 정사각형이나 21 x 21 정사각형이 될 수 있으며, 이는 커널 형태로 되어있고 이미지에 적용할 때 중심을 원점으로 사용할 수도 있고, 원점을 변경할 수도 있다. 또한 일반적으로 꽉찬 사각형, 타원형, 십자형을 많이 사용하기도 한다.
아래와 같이 배열로 정의할 수도 있고 OpenCV의 cv2.getStructuringElement() 함수를 이용하여 만들 수도 있다.
>>> cv2.getStructuringElement(cv2.MORP_ELLIPSE,(5,5))
array([[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0]], dtype=uint8)
침식(Erosion)
침식은 각 픽셀에 구조적 요소를 적용하여 하나라도 0이 있으면 대상 픽셀을 제거하는 방법이다.
십자형 구조적 요소를 원본 이미지에 적용하게 되고, 원본의 각 픽셀에 적용을 하여 겹치는 부분이 없는 부분이 하나라도 있으면 그 중심 픽셀을 제거하는 방식이다. 최종적으로 우측의 분홍색 영역만 남게 되며, 이 방법은 작은 객체를 제거하는 효과를 지닌다.
팽창(Dilation)
팽창은 침식 연산과는 반대로 객체를 확대한 후 작은 구멍을 채우는 방법이다. 침식 연산과 마찬가지로 각 픽셀에 구조적 요소를 적용한다. 대상 픽셀에 대해 OR 연산을 수행한다. 즉 겹치는 부분이 하나라도 있다면 이미지를 확장하게 된다.
이는 결과적으로 경계가 부드러워지고, 구멍이 메꿔지는 효과를 지닌다.
이진 영상 및 회색조 영상의 팽창 연산에서 구조적 요소가 적용되는 과정은 아래 이미지를 참고하면 이해가 수월하다.
열림(Opening) 및 닫힘(Closing) 연산
열림 및 닫힘 연산은 침식 및 팽창의 조합 결과이다. 침식과 팽창 중 어떤 것을 먼저 사용할지에 따라 열림 연산인지 닫힘 연산인지 정해진다.
열림 연산
- 침식 -> 팽창
- 작은 객체 제거에 적합
닫힘 연산
- 팽창 -> 침식
- 전체적인 윤곽 파악에 적합
OpenCV에서의 침식, 팽창, 닫힘, 열림 연산 사용은 아래와 같다.
import cv2
import numpy as np
from matplotlib import pyplot as plt
dotImage = cv2.imread('images/dot_image.png')
holeImage = cv2.imread('images/hole_image.png')
orig = cv2.imread('images/morph_origin.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
# kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
# kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
erosion = cv2.erode(dotImage,kernel,iterations = 1)
dilation = cv2.dilate(holeImage,kernel,iterations = 1)
opening = cv2.morphologyEx(dotImage, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(holeImage, cv2.MORPH_CLOSE,kernel)
gradient = cv2.morphologyEx(orig, cv2.MORPH_GRADIENT, kernel)
tophat = cv2.morphologyEx(orig, cv2.MORPH_TOPHAT, kernel)
blackhat = cv2.morphologyEx(orig, cv2.MORPH_BLACKHAT, kernel)
images =[dotImage, erosion, opening, holeImage, dilation, closing, gradient, tophat, blackhat]
titles =['Dot Image','Erosion','Opening','Hole Image', 'Dilation','Closing', 'Gradient', 'Tophat','Blackhot']
for i in xrange(9):
plt.subplot(3,3,i+1),plt.imshow(images[i]),plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
참고자료 1 : ko.wikipedia.org/wiki/%EC%88%98%ED%95%99%EC%A0%81_%ED%98%95%ED%83%9C%ED%95%99
참고자료 2 : ko.wikipedia.org/wiki/%EA%B5%AC%EC%A1%B0%EC%A0%81_%EC%9A%94%EC%86%8C
참고자료 3 : kr.mathworks.com/help/images/morphological-dilation-and-erosion.html
참고자료 4 : opencv-python.readthedocs.io/en/latest/doc/12.imageMorphological/imageMorphological.html
'AI Research Topic > Image Processing' 카테고리의 다른 글
[Machine Vision] 머신비전 기술분석 (0) | 2018.11.09 |
---|---|
[Image Processing] Computer Vision 분류 (0) | 2018.07.22 |
[Machine Vision] 머신비전이란 (0) | 2018.02.11 |
[Image Processing] OpenCV Watershed를 이용한 영상 분할 (7) | 2017.01.18 |
[Image Processing] Fourier Transform (푸리에 변환) (2) | 2016.11.18 |