본문 바로가기

CV

영상의 모폴로지 연산 - Morphological Image Processing

모폴로지 - Morphology

- 모폴로지는 형태학이라는 의미를 갖고 있다.

- 영상을 형태학적인 측면으로 접근하는 것이 모폴로지 이다.

- 모양에 대한 정보에 더 집중을 한다.

- 모폴로지 연산은 이미지를 분할하여 단순화, 제거, 보정을 통해 형태를 파악하려는 목적으로 사용이 된다.

- 일반적으로 binary나 grayscale image에 사용이 된다.

- 사용하는 방법으로는 Dilation(팽창), Erosion(침식), 그리고 2개를 조합한 Opening과 Closing이 있다.

- 여기에는 2가지 Input값이 있는데, 하나는 원본 이미지 또 다른 하나는 structing element이다.

 

구조 요소(structuring element)

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

-  모폴로지는 필터링과 비슷한 연산을 내부에서 진행합니다.

 - 모폴로지에서는 필터가 structucturing element 라고 합니다.

-  다양한 형태가 있지만 주로 정방형 행렬(3X3)을 이용합니다.

 - 필터와 마찬가지로 중앙에 고정점(Anchor)이 있습니다.

 

 

침식(Erosion)

- 각 Pixel에 structuring element를 적용하여 하나라도 0이 있으면 중심 pixel을 제거하는 방법.

- 침식 연산은 객체 외곽을 깎아내는 연산이다. --> 객체 크기는 감소하고, 배경은 확대된다.

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

더보기

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인 경우, 확장된 가장자리 픽셀을 채울 값.

import cv2
import numpy as np
kernel = np.ones((3,3),dtype = np.uint8)

img = cv2.imread('img.jpg',cv2.IMREAD_GRAYSCALE)
erode1 = cv2.erode(img,kernel,iterations=1) # iterations : 반복 횟수

cv2.imshow('gray',img)
cv2.imshow('erode1',erode1)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(0)

 

 

팽창(Dilation)

- 각 Pixel에 structuring element를 적용하여 하나라도 0이 있으면 중심 pixel을 제거하는 방법.

- Erosion과 반대로 대상을 확장한 후 작은 구멍을 채우는 방법

- Erosion과 마찬가지로 각 pixel에 structuring element를 적용한다.

- 대상 pixel에 대해서 OR 연산을 수행한다. 즉 겹치는 부분이 하나라도 있으면 이미지를 확장한다.

- 위 그림은 structuring element를 원본 이미지에 OR 연산을 적용한다. 

- 최종적으로 확장된 이미지를 얻을 수 있다.

- 결과적으로 경계가 부드러워 지고, 구멍이 메꿔지는 효과를 얻을 수 있다.

더보기

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인 경우, 확장된 가장자리 픽셀을 채울 값

import cv2
import numpy as np

kernel = np.ones((3,3),dtype=np.uint8)

img = cv2.imread('img.jpg',cv2.IMREAD_GRAYSCALE)

dilate1= cv2.dilate(img,kernel,iterations=1) #반복횟수

cv2.imshow('img',img)
cv2.imshow('dilate1',dilate1)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(0)

 

모폴로지 구조 요소(커널) 생성 함수 - cv2.getStructuringElement

 

-  모폴로지 구조 요소를 생성해주는 함수가 있다.

-  이를 이용하면 크기와 모양을 설정하고 고정점 위치도 임의대로 결정할 수 있다.

더보기

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의 위치가 구조 요소 모양을 결정.)

Opening & Closing

Opening과 Closing은 Erosion과 Dilation의 조합 결과 입니다. 차이는 어느 것을 먼저 적용을 하는 차이 이다.

  • Opeing : Erosion적용 후 Dilation 적용. 작은 Object나 돌기 제거에 적합
  • Closing : Dilation적용 후 Erosion 적용. 전체적인 윤곽 파악에 적합

 

https://deep-learning-study.tistory.com/226

 

[파이썬 OpenCV] 영상의 모폴로지 - 침식과 팽창 - cv2.erode, cv2.dilate, cv2.getStructuringElement

황선규 박사님의 'OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝' 을 공부하면서 정리해 보았습니다. 예제 코드 출처 :  황선규 박사님 github홈페이지 『OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝』

deep-learning-study.tistory.com

이 블로그를 참고하였습니다.