[ch07] 이진 영상 처리 - 모폴로지 (1) : 침식과 팽창

빨주노·2021년 8월 27일
0

모폴로지(Morphology)란?

  • 영상을 형태학적인 측면에서 다루는 기법
  • 다양한 영상처리 시스템에서 전처리(pre-processing) 또는 후처리(post-processing) 형태로 널리 사용
  • 수학적 모폴로지(mathematical morphology)

구조 요소(Structuring element)

  • 모폴로지 연산의 결과를 결정하는 커널, 마스크, 윈도우

이진 영상의 침식(erosion) 연산

  • 구조 요소가 객체 영역 내부에 완전히 포함될 경우 고정점 픽셀을 255로 설정
  • 침식 연산은 객체 외곽을 깎아내는 연산 → 객체 크기는 감소 & 배경은 확대

이진 영상의 팽창(dilation) 연산

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

실제 영상의 침식 연산 결과

  • 객체 영역(흰색)이 점점 줄어든다.
  • 작은 크기의 객체(잡음) 제거 효과

    침식이 진행될수록 hole이 커진다.

실제 영상의 팽창 연산 결과

  • 객체 영역(흰색)이 점점 불어난다.
  • 객체 내부의 홀(구멍)이 채워진다.

    침식과 반대대는 양상을 보인다.

모폴로지 침식 연산

cv2.erode(src, kernel, dst=None, anchor=None, iterations=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, iterations=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
  • shape : 구조 요소 모양을 나타내는 플래그
  • ksize : 구조 요소 크기. (width, height) 튜플.
  • anchor : MORPH_CROSS 모양의 구조 요소에서 고정점 좌표. (-1, -1)을 지정하면 구조 요소의 중앙을 고정점으로 사용.
  • retval : 0과 1로 구성된 cv2.CV_8UC1 타입 행렬. numpy.ndarray. (1의 위치가 구조 요소 모양을 결정)

이진 영상의 침식과 팽창 예제

src = cv2.imread('circuit.bmp', cv2.IMREAD_GRAYSCALE)
se = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 3))
dst1 = cv2.erode(src, se)
dst2 = cv2.dilate(src, None)

  • 코드를 다음과 같이 바꾼 결과
...
se = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 7))
...
dst2 = cv2.dilate(src, se)
...


이전에 끊어진 부분이 있었던 dst2가 잘 이어진 모습을 관찰할 수 있다.

profile
딥 하게 딥러닝 하는중

0개의 댓글