본문 바로가기

심화/영상 - 구현 및 OpenCV

erode & dilate

참고 자료: https://docs.opencv.org/4.x/d9/d61/tutorial_py_morphological_ops.html

 

OpenCV: Morphological Transformations

Goal In this chapter, Theory Morphological transformations are some simple operations based on the image shape. It is normally performed on binary images. It needs two inputs, one is our original image, second one is called structuring element or kernel wh

docs.opencv.org

C++ 버전 문서: https://docs.opencv.org/3.4/db/df6/tutorial_erosion_dilatation.html

 

1. Erosion(침식)

2. Dilation(팽창)

3. Opening

4. Closing

5. Structuring Element


형태학적 변환(Morphological transformations)은 이미지 모양에 기반한 연산이다. 주로 이진 이미지 상에서 수행된다. 형태학적 변환은 두가지 입력을 받으며, 첫번째는 원본 이미지 두번째는 '구조적 요소' 혹은 '커널' 이라 불리는 것으로 작업의 특성을 결정한다. 두가지 기본적인 연산은 침식 과 팽장( Erosion and Dilation) 이다. 

 

원본 이미지

 

1. Erosion(침식)

- 토양의 침식에서 아이디어를 얻었다. 커널은 이미지를 슬라이딩하고, 커널 아래의 이미지 픽셀이 모두 '1'인 경우만 원본 이미지를 '1'로 둔다. (그렇지 않으면 '0'으로 두어서, 경계 이미지가 침식 된다)

- 커널 사이즈에 따라 버려지는 정도가 결정된다.

 

import cv2 as cv
import numpy as np
img = cv.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv.erode(img,kernel,iterations = 1)

 

Erosion 연산 적용 후

 

2. Dilation(팽창)

- Erosion과는 반대로 커널 아래 이미지 픽셀이 하나라도 '1'이면 이미지를 '1'로 바꾼다. 따라서, 백색 영역이 늘어난다(Foreground 객체가 증가한다)

- Erosion은 커널을 이용해 노이즈를 제거하는 효과가 있으므로 일반적으로 Erosion->Dilation을 순서대로 사용하여 노이즈를 제거하는 일을 수행하기도 한다. 

dilation = cv.dilate(img,kernel,iterations = 1)

Dilation 연산 적용 후

3. Opening

- Erosion->Dilation 연산을 하나로 수행하는 OpenCV 연산이 있다.

- Erosion->Dilation 즉, '침식 후 팽창' 연산은 배경의 노이즈를 제거할 때 유용하다

opening = cv.morphologyEx(img, cv.MORPH_OPEN, kernel)

opening 연산 적용 전후

4. Closing

- Dilation->Erosion 연산을 수행한다. Openin 연산의 순서를 반대로 적용한 것이다.

- Dilation -> Erosion 즉, '팽창 후 침식' 연산은 전경의 노이즈를 제거할 때 유용하다.

closing 연산 적용 전후

5. Structuring Element

커널은 직사각형/정사각형 형태 뿐만 아니라 임의로 모양을 지정할 수 있다.

# 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)

 

반응형

'심화 > 영상 - 구현 및 OpenCV' 카테고리의 다른 글

Epipolar Geometry  (0) 2022.11.18
OpenCV는 Row-Major, Matlab은 Column-Major  (0) 2022.11.14
ORB (Oriented FAST and Rotated BRIEF)  (0) 2022.03.15
Optical Flow  (0) 2021.06.21
Fast Algorithm for Corner Detection  (0) 2021.06.19