모폴로지 연산 (Morphology)

개요

  • 모폴로지 연산은 영상 처리에서 노이즈 제거, 구멍 채우기, 끊어진 선 이어 붙이기 등에 쓰이는 형태학적(morphological) 연산을 말한다.
  • 주로 이진 영상(Binary Image) 에서 객체의 모양을 분석·변형하는 데 사용되지만, 그레이스케일 영상에도 확장 적용이 가능하다.

방법

  • 모폴로지 연산에 사용할 커널의 모양(구조적 요소, Structuring element)을 정의하고, 커널이 전체 이미지를 슬라이딩 하면서 원본과 커널 영역을 비교하며 침식(Erosion), 팽창(Dilation) 등의 연산을 수행하며 이미지를 변형한다.
  • 커널 (Structuring element) :
  • 모폴로지 연산 종류에 따른 결과 :

커널 (Structuring Element)

  • 모폴로지 연산에 사용되는 구조화 요소 커널은 1이 채워진 모양에 따라 사각형, 타원형, 십자형 등으로 사용할 수 있다.
  • OpenCV에서 제공하는 getStructuringElement 함수를 이용해 커널 사이즈에 따른 다양한 모양의 구조화 요소를 생성할 수 있다.
# Rectangular Kernel (사각형)
>>> cv.getStructuringElement(cv.MORPH_RECT,(5,5))
array([[1, 1, 1, 1, 1],
	   [1, 1, 1, 1, 1],
	   [1, 1, 1, 1, 1],
	   [1, 1, 1, 1, 1],
	   [1, 1, 1, 1, 1]], dtype=uint8)
 
# Elliptical Kernel (타원형)
>>> cv.getStructuringElement(cv.MORPH_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)
 
# Cross-shaped Kernel (십자형)
>>> cv.getStructuringElement(cv.MORPH_CROSS,(5,5))
array([[0, 0, 1, 0, 0],
	   [0, 0, 1, 0, 0],
	   [1, 1, 1, 1, 1],
	   [0, 0, 1, 0, 0],
	   [0, 0, 1, 0, 0]], dtype=uint8)
 
# Diamond-shaped Kernel (마름모)
>>> cv.getStructuringElement(cv.MORPH_DIAMOND,(5,5))
array([[0, 0, 1, 0, 0],
	   [0, 1, 1, 1, 0],
	   [1, 1, 1, 1, 1],
	   [0, 1, 1, 1, 0],
	   [0, 0, 1, 0, 0]], dtype=uint8)

모폴로지 - 침식 (Erosion)

개요

  • 모폴로지 연산에서 침식(Erosion)은 객체 외곽을 깎아내는 연산.
  • 커널이 원본 영상을 슬라이딩 하면서, 커널 내 1에 해당하는 영역과 원본을 비교하여 모두 1을 만족한다면 타겟 픽셀(중앙 픽셀)을 1로, 아니면 0으로 변형한다. (=bitwise_and)
  • 즉, 구조요소가 완전히 맞아떨어질 때만 중심 픽셀을 1로 유지한다.
  • 구조요소 크기보다 작은 영역은 제거됨 노이즈 제거 효과.

방법

  • 3x3 사각형 커널을 이용한 모폴로지 침식 연산 결과 :

OpenCV

import cv2
 
# 이미지 읽기 (바이너리 이미지, 그레이스케일)
src = cv2.imread('binary.png', cv2.IMREAD_GRAYSCALE)
 
# 3×3 구조요소(사각형 모양) 생성
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
# 침식 연산
eroded = cv2.erode(src, kernel, iterations=1)
cv2.erode(src, kernel, dst, anchor, iterations, borderType, borderValue) -> dst
  • src : 입력 이미지 (이진/그레이스케일 모두 가능, np.uint8 권장)
  • kernel : 구조요소(Structuring Element), np.uint8 타입의 2D 배열. 보통 cv2.getStructuringElement()로 생성
  • dst (optional) : 출력 이미지 저장 변수. 지정하지 않으면 새로운 배열 반환
  • anchor (optional) : 커널에서 중심점 위치. 기본값 (-1, -1)은 자동 중앙 설정
  • iterations (optional) : 연산 반복 횟수 (기본 1). 값이 크면 효과가 강해짐
  • borderType (optional) : 가장자리 처리 방식. 기본값 cv2.BORDER_CONSTANT
  • borderValue (optional) : BORDER_CONSTANT일 때 채울 값 (기본 0)

모폴로지 - 팽창 (Dilation)

개요

  • 모폴로지 연산에서 팽창(Dilation)은 객체 외곽을 확장하는 연산.
  • 커널이 원본 영상을 슬라이딩 하면서, 커널 내 1에 해당하는 영역과 원본을 비교하여 하나라도 1을 만족한다면 타겟 픽셀(중앙 픽셀)을 1로, 아니면 0으로 변형한다. (=bitwise_or)
  • 즉, 구조요소가 객체의 일부와 닿기만 해도 중심 픽셀을 1로 설정한다.
  • 구조요소 크기보다 작은 구멍이나 틈이 메워짐 → 객체 연장 및 확장 효과.

방법

  • 3x3 사각형 커널을 이용한 모폴로지 팽창 연산 결과 :

OpenCV

import cv2
 
# 이미지 읽기 (바이너리 이미지, 그레이스케일)
src = cv2.imread('binary.png', cv2.IMREAD_GRAYSCALE)
 
# 3×3 구조요소(사각형 모양) 생성
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
# 팽창 연산
dilated = cv2.dilate(src, kernel, iterations=1)
cv2.dilate(src, kernel, dst, anchor, iterations, borderType, borderValue) -> dst
  • src : 입력 이미지 (이진/그레이스케일 모두 가능, np.uint8 권장)
  • kernel : 구조요소(Structuring Element), np.uint8 타입의 2D 배열. 보통 cv2.getStructuringElement()로 생성
  • dst (optional) : 출력 이미지 저장 변수. 지정하지 않으면 새로운 배열 반환
  • anchor (optional) : 커널에서 중심점 위치. 기본값 (-1, -1)은 자동 중앙 설정
  • iterations (optional) : 연산 반복 횟수 (기본값 1). 값이 크면 효과가 강해짐
  • borderType (optional) : 가장자리 처리 방식. 기본값 cv2.BORDER_CONSTANT
  • borderValue (optional) : BORDER_CONSTANT일 때 채울 값 (기본 0)

모폴로지 - 열기 (Opening) / 닫기 (Closing)

열기 (Opening)

  • 침식(Erosion) 연산 팽창(Dilation) 연산
  • 침식 연산을 먼저 수행하고, 팽창 연산을 함으로써 작은 노이즈는 제거되고, 대상 요소는 원래 크기를 유지할 수 있다.

닫기 (Closing)

  • 팽창(Dilation) 연산 침식(Erosion) 연산
  • 팽창 연산을 먼저 수행하고, 침식 연산을 함으로써 끊어져 보이는 개체를 연결하거나 구멍을 메우고 대상 요소의 원래 크기를 유지한다.

OpenCV

import cv2
 
# 구조화 요소 커널, 사각형 (3x3) 생성
k = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
# 열림 연산 적용
opening = cv2.morphologyEx(img1, cv2.MORPH_OPEN, k)
# 닫힘 연산 적용
closing = cv2.morphologyEx(img2, cv2.MORPH_CLOSE, k)
dst = cv2.morphologyEx(src, op, kernel, dst, anchor, iteration, borderType, borderValue)
  • src: 입력 영상
  • op: 모폴로지 연산 종류
    • cv2.MORPH_OPEN
    • cv2.MORPH_COLSE
    • cv2.MORPH_GRADIENT
    • cv2.MORPH_TOPHAT
    • cv2.MORPH_BLACKHAT
  • kernel: 구조화 요소 커널
  • dst (optional): 결과 영상
  • anchor (optional): 커널의 기준점. 기본값 (-1, -1)
  • iteration (optional): 연산 반복 횟수 기본값 1
  • borderType (optional): 외곽 영역 보정 방법. 기본값 cv2.BORDER_CONSTANT
  • borderValue (optional): BORDER_CONSTANT일 때 채울 값 (기본 0)

참고