Computer Vision/opencv(python)

[42] 4) 모폴로지 (1): 침식과 팽창

jwjwvison 2021. 3. 23. 14:28
  • 모폴로지(Morphology) 연산이란?
    • 영상을 형태학적인 측면에서 다루는 기법
    • 다양한 영상 처리 시스템에서 전처리(pre-processing) 또는 후처리(post-processing) 형태로 널리 사용
    • 수학적 모폴로지(mathematical morphology)

 

  • 구조 요소(Structuring element)
    • 모폴로지 연산의 결과를 결정하는 커널, 마스크, 윈도우

 

  • 이진 영상의 침식(errosion) 연산
    • 구조 요소가 객체 영역 내부에 완전히 포함될 경우 고정점 픽셀을 255로 설정
    • 침식 연산은 객체 외각을 깍아내는 연산 --> 객체 크기는 감소 & 배경은 확대

 

  • 이진 영상의 팽창(diliation) 연산
    • 구조 요소와 객체 영역이 한 픽셀이라도 만날 경우 고정점 픽셀을 255로 설정
    • 팽창 연산은 객체 외곽을 확대시키는 연산 -> 객체 크기는 감소 & 배경은 확대

 

  • 실제 영상의 침식 연산 결과
    • 객체 영역(흰색)이 점점 줄어듦
    • 작은 크기의 객체(잡음) 제거 효과

 

  • 실제 영상의 팽창 연산 결과
    • 객체 영역(흰색)이 점점 늘어남
    • 객체 내부의 홈(구멍)이 채워짐

  • 모폴로지 침식 연산
cv2.erode(src,kernel,dst=None,anchor=None,iteration=None,borderType=None,borderValue=None) -> dst

 • src: 입력 영상
 • kernel: 구조 요소 . getStructuringElement () 함수에 의해 생성 가능
             만약 None 을 지정하면 3x3 사각형 구성 요소를 사용 .
 • dst : 출력 영상 . src 와 동일한 크기와 타입
 • anchor: 고정점 위치 . 기본값(-1, -1) 을 사용하면 중앙점을 사용
 • iterations: 반복 횟수 . 기본값은 1.
 • borderType: 가장자리 픽셀 확장 방식 . 기본값은 cv2.BORDER_CONSTANT.
 • borderValue: cv2.BORDER_CONSTANT 인 경우 , 확장된 가장자리 픽셀을 채울 값

 

  • 모폴로지 팽창 연산
cv2.dilate(src,kernel,dst=None,anchor=None,iteration=None,borderType=None,borderValue=None) -> dst

 • src: 입력 영상
 • kernel: 구조 요소 . getStructuringElement () 함수에 의해 생성 가능
             만약 None 을 지정하면 3x3 사각형 구성 요소를 사용 .
 • dst : 출력 영상 . src 와 동일한 크기와 타입
 • anchor: 고정점 위치 . 기본값(-1, -1) 을 사용하면 중앙점을 사용
 • iterations: 반복 횟수 . 기본값은 1.
 • borderType: 가장자리 픽셀 확장 방식 . 기본값은 cv2.BORDER_CONSTANT.
 • borderValue: cv2.BORDER_CONSTANT 인 경우 , 확장된 가장자리 픽셀을 채울 값

 

  • 모폴로지 구조 요소 (커널) 생성
cv2.getStructuringElement(shape,ksize,anchor=None) -> retval

 

  • 이진 영상의 침식과 팽창 예제
import sys
import numpy as np
import cv2


src = cv2.imread('circuit.bmp', cv2.IMREAD_GRAYSCALE)

if src is None:
    print('Image load failed!')
    sys.exit()

se=cv2.getStructuringElement(cv2.MORPH_RECT,(5,3))  #행렬 크기조정을 통해 끊어진 부분을 연결시키거나 할 수 있다

dst1=cv2.erode(src,se)
dst2=cv2.dilate(src,None)     #단순 3x3행렬 kernel

cv2.imshow('src',src)
cv2.imshow('dst1',dst1)
cv2.imshow('dst2',dst2)
cv2.waitKey()
cv2.destroyAllWindows()