본문으로 바로가기

erode

erode 는 기존 객체의 영역을 깎아 내는 연산으로 객체 크기가 감소합니다.

구조 요소를 입력 영상에 적용하여 정확히 핏이 맞으면 해당 픽셀을 255로, 그 외에는 픽셀을 0으로 변경합니다.

 

cv2.getStructuringElement(shape, ksize, anchor=None) -> retval

  • shape: 구조 요소 kernel 모양 (cv2.MORPH_RECT, cv2.MORPH_ELIPSE, cv2.MORPH_CROSS)
  • ksize: kernel 크기
  • anchor: cv2.MORPH_CROSS 에만 적용, 구조 요소의 기준점(default: 중심)
import os
import cv2
import numpy as np

path = os.path.join('image', 'morph_dot.png')
img = cv2.imread(path)

k = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))

erosion = cv2.erode(img, k)
erosion2 = cv2.erode(erosion, k)
erosion3 = cv2.erode(erosion2, k)

merged = np.hstack((img, erosion, erosion2, erosion3))

cv2.imshow('Erode', merged)

cv2.waitKey(0)
cv2.destroyAllWindows()

 

dilate

dilate 는 기존 객체의 영역을 확장하는 연산으로 객체의 크기가 증가합니다.

구조 요소를 입력 영상에 적용하여 겹치는 부분의 위치에서 구조 요소 크기만큼 픽셀을 255로, 그 외에는 픽셀을 0으로 변경합니다.

 

cv2.getStructuringElement(shape, ksize, anchor=None) -> retval

  • shape: 구조 요소 kernel 모양 (cv2.MORPH_RECT, cv2.MORPH_ELIPSE, cv2.MORPH_CROSS)
  • ksize: kernel 크기
  • anchor: cv2.MORPH_CROSS 에만 적용, 구조 요소의 기준점(default: 중심)
import os
import cv2
import numpy as np

path = os.path.join('image', 'morph_hole.png')
img = cv2.imread(path)

k = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))

dilation = cv2.dilate(img, k)
dilation2 = cv2.dilate(dilation, k)
dilation3 = cv2.dilate(dilation2, k)

merged = np.hstack((img, dilation, dilation2, dilation3))

cv2.imshow('Dilation', merged)

cv2.waitKey(0)
cv2.destroyAllWindows()

 

Opening

Opening 연산은 erode 적용 후 dilate 를 적용하며, 흰색의 노이즈를 제거하는데 사용합니다.

 

cv2.morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None) -> dst

  • src: 입력 이미지
  • op: 모폴로지 연산 종류
  • cv2.MORPH_OPEN
  • cv2.MORPH_CLOSE
  • cv2.MORPH_GRADIENT
  • cv2.MORPH_TOPHAT
  • cv2.MORPH_BLACKHAT
import os
import cv2
import numpy as np

path1 = os.path.join('image', 'morph_dot.png')
path2 = os.path.join('image', 'morph_hole.png')
img1 = cv2.imread(path1, cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread(path2, cv2.IMREAD_GRAYSCALE)

k = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))

opening = cv2.morphologyEx(img1, cv2.MORPH_OPEN, k)
opening2 = cv2.morphologyEx(img2, cv2.MORPH_OPEN, k)

merged1 = np.vstack((img1, opening))
merged2 = np.vstack((img2, opening2))
merged3 = np.hstack((merged1, merged2))
cv2.imshow('opening', merged3)

cv2.waitKey()
cv2.destroyAllWindows()

 

Closing

Closing 연산은 dliate 적용 후 erode 를 적용하며, 객체 안의 검은색의 노이즈를 제거하는데 사용합니다.

 

cv2.morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None) -> dst

  • src: 입력 이미지
  • op: 모폴로지 연산 종류
  • cv2.MORPH_OPEN
  • cv2.MORPH_CLOSE
  • cv2.MORPH_GRADIENT
  • cv2.MORPH_TOPHAT
  • cv2.MORPH_BLACKHAT
import os
import cv2
import numpy as np


path = os.path.join('image', 'morph_dot.png')
img1 = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
path = os.path.join('image', 'morph_hole.png')
img2 = cv2.imread(path, cv2.IMREAD_GRAYSCALE)

k = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))

closing = cv2.morphologyEx(img1, cv2.MORPH_CLOSE, k)
closing2 = cv2.morphologyEx(img2, cv2.MORPH_CLOSE, k)

merged1 = np.vstack((img1, closing))
merged2 = np.vstack((img2, closing2))
merged3 = np.hstack((merged1, merged2))
cv2.imshow('closing', merged3)

cv2.waitKey()
cv2.destroyAllWindows()