OpenCV 비전 실무9장 · Morphology: 침식, 팽창, 열기, 닫기8 / 21← 이전목차다음 →MetaContents

9장. Morphology: 침식, 팽창, 열기, 닫기

열기

화단의 잡초를 뽑는 장면을 떠올려 봅시다. 땅을 한 번 갈아엎으면 뿌리가 얕은 잡초는 뽑혀 나가고 뿌리 깊은 꽃은 남습니다. 꽃 둘레의 흙도 조금 파였으니 다시 흙을 덮어 다져 줍니다. 열기는 침식으로 잡티를 뽑아낸 뒤, 같은 도장으로 팽창해 깎였던 물체를 원래 굵기로 되돌립니다.

원본, 침식, 팽창의 세 단계로 열기를 보인 흐름도

그림의 세 단계가 열기의 순서입니다. 침식에서 도장보다 작은 잡티는 사라지고 글자는 가늘어집니다. 이어서 팽창하면 남은 글자만 다시 굵어지고, 이미 사라진 잡티는 돌아오지 않습니다. 여기서 뿌리 얕은 잡초가 잡티, 뿌리 깊은 꽃이 글자, 흙을 다시 덮는 일이 팽창입니다.

흰 잡티 낀 글자, 5×5 침식, 이어서 5×5 팽창한 결과를 나란히 놓은 그림

왼쪽은 깨끗한 MORPH 글자에 씨앗 911 로 흰 잡티 60개를 뿌린 그림입니다. 가운데의 침식 뒤에는 잡티가 모두 사라졌지만 글자도 가늘어졌습니다. 오른쪽의 팽창 뒤에는 글자가 원래 굵기로 돌아왔고 잡티는 없습니다.

열기로 손계산하기

침식 절의 8×8 그림을 3×3 도장으로 열기 합니다.

단계흰 칸일어난 일
원본184×4 네모, 튀어나온 칸, 떨어진 점
침식 뒤4네모 한가운데 2×2 만 남는다
팽창 뒤(열기)162×2 가 다시 4×4 로 커진다. 튀어나온 칸과 점은 돌아오지 않는다

짧은 예시

Python
import cv2
import numpy as np

img = np.zeros((8, 8), np.uint8)
img[1:5, 1:5] = 255
img[3, 5] = 255
img[6, 6] = 255
se = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))

# morphologyEx(그림, 연산 종류, 구조 요소). MORPH_OPEN = 열기
opened = cv2.morphologyEx(img, cv2.MORPH_OPEN, se)
# 침식 뒤 팽창을 손으로 이어 한 것과 같은지 본다
by_hand = cv2.dilate(cv2.erode(img, se), se)
print("흰 칸:", int((opened == 255).sum()), "/ 손으로 이은 것과 같은가:", np.array_equal(opened, by_hand))
# 결과: 흰 칸 16 / 손으로 이은 것과 같은가: True

주의할 점

  • 열기는 도장보다 작거나 가는 흰 것을 모두 지웁니다. 지킬 물체 가운데 가는 선(글자의 가는 획, 전선)이 있으면 함께 사라지므로 도장을 그보다 작게 고릅니다.
  • 열기는 흰 덩어리의 뾰족한 모서리도 조금 둥글게 깎습니다. 네모 물체에 타원 도장으로 열기를 하면 귀퉁이가 둥글어집니다.
← 이전 절9장 · 크기와 횟수다음 절 →9장 · 닫기