모폴로지(morphology)란 한글로는 형태학을 의미하며, 일반적으로 생물의 구조나 외형을 연구하는 생물학의 한 분야를 뜻한다. NLP 분야에서의 모폴로지는 문맥에 따라 단어와 형태소에 관해 연구하는 것을, Computer Vision에서 모폴로지는 Noise를 제거하거나 영역 간 경계를 허물어뜨리는 형태학적인 연산을 수행하는 것을 의미한다. Computer Vision에서의 모폴로지를 위한 대표적인 연산 방법으로는 침식과 팽창이 있다.

 

1. 침식 연산

침식(erosion)은 기존에 있던 영역을 깎는 것이다. 침식 연산의 구조화 요소 커널이 해당 픽셀에 온전히 적용되지 않으면 그 픽셀을 없애버린다는 것이다. 행렬로 표현하면 다음과 같이 나타낼 수 있다.

입력 영상(좌) / 구조화 요소 커널(중) / 침식 연산 후 영상(우)

 

구조화 요소 커널이 입력 영상의 pixel 내부에 완전히 포함될 경우에만 값이 유지되고, 그렇지 않으면 침식이 발생한다. OpenCV에는 구조화 요소 커널을 생성하는 cv2.getStructuringElement(), 침식 연산을 수행하는 cv2.erode() 함수가 있다.

# 침식 연산
import cv2
import numpy as np

img = cv2.imread('image.jpg')

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
erode = cv2.erode(img, kernel)

cv2.imshow("Erode", erode)
cv2.waitKey()
cv2.destroyAllWindows()

 

cv2.getStructuringElement()는 구조화 요소 커널의 모양, 커널 크기, [구조화 요소의 기준점]이 인자로 구성된다. 구조화 요소 커널의 모양을 지정할 수 있는 종류는 다음과 같다.

cv2.MORPH_CROSS 십자가형
cv2.MORPH_ELLIPSE 타원형
cv2.MORPH_RECT 사각형

구조화 요소의 기준점은 default 값으로 (-1, -1)이 설정된다. cv2.erode()는 입력 영상, 구조화 요소 커널, [구조화 요소의 기준점, 반복 횟수, 외곽 보정 방법 플래그, 외곽 보정 값]이 인자로 구성된다.

 

2. 팽창 연산

팽창(dilatation)은 기존에 있던 영역에 주변을 덧붙이는 것이다. 팽창 연산의 구조화 요소 커널이 해당 픽셀에 온전히 적용되지 않는 부분을 채워넣게 되며, 행렬로 표현하면 다음과 같다.

입력 영상(좌) / 구조화 요소 커널(중) / 팽창 연산 후 영상(우)

 

구조화 요소 커널이 입력 영상의 일부라도 덮게 되면 1로 채워 넣게 된다. OpenCV에서 팽창 연산을 수행할 수 있도록  cv2.dilate() 함수를 제공하며, 사용하는 인자는 cv2.erode()와 같다.

# 팽창 연산
import cv2
import numpy as np

img = cv2.imread('image.jpg')

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
dilate = cv2.dilate(img, kernel)

cv2.imshow("Dilation", dilate)
cv2.waitKey()
cv2.destroyAllWindows()

 

침식 연산의 경우에는 큰 물체는 주변을 깎아 작게 만들며, 작은 물체는 완전히 사라지게 하는 것도 가능하다. 반대로, 팽창 연산은 큰 물체가 더욱 크게 보일 수도 있는데 두 가지 모두 noise를 없애는 데는 효과적이다.

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기