모폴로지 - 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
이 블로그를 참고하였습니다.
'CV' 카테고리의 다른 글
이미지 블러링(Images Smoothing/Blurring) (0) | 2022.10.23 |
---|---|
이미지의 기하학적 변환(Geometric Transformations of images) (0) | 2022.10.23 |
OpenCV 기본 연산 (0) | 2022.10.22 |
도형 그리기(직선, 사각형, 원, 타원, 다각형, 텍스트) (0) | 2022.10.22 |
연결 요소 (0) | 2022.10.22 |