모폴로지 연산(Morphological Operation)은 이미지 프로세싱의 한 가지 방법으로 이미지를 형태(shape) 관점에서 변형, 분석하며 주로 바이너리 이미지에 활용된다. 모폴로지 연산을 통해 노이즈 제거, 엣지 변형, 객체의 형태 분석 등을 해낼 수 있다.
연산의 종류로는 Erosion(침식), Dilation(팽창), Gradient, Opening, Closing 이 있다.
- Erosion
이미지를 커널이 스캔하고, 커널의 모든 영역이 이미지의 객체 내부에 포함될 때 (교집합) 커널의 중심점의 집합이 Erosion의 결과가 된다. Erosion을 통해 커널보다 크기가 작은 white noise를 제거하거나 객체의 경계를 후퇴시킬 수 있다.
- Dilation
이미지를 커널이 스캔하고, 커널의 일부 영역이 이미지의 객체 내부에 포함될 때 (합집합) 커널의 중심점의 집합이 Dilation의 결과가 된다. Dilation을 통해 객체를 확장시키거나 객체 내부의 구멍을 매울 수 있다.
img = cv2.imread("/content/drive/MyDrive/Dataset/opencv/Screenshot20220304172134-660x558.jpg", 0)
ret, bin = cv2.threshold(img, 120, 255, cv2.THRESH_BINARY_INV)
# kernel = np.ones((5, 5), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
# Erosion and Dilation
img_erosion = cv2.erode(bin, kernel, iterations=1)
img_dilation = cv2.dilate(bin, kernel, iterations=1)
cv2.getStructuringElement을 통해 다양한 형태의 커널을 만들 수 있다. 직사각형 모양, 타원형, 심자가형 등이 있다.

5x5 직사각형 형태의 커널이 이미지 전체를 스캔하며 Erosion에서는 커널의 전체 영역이 알파벳(하얀 부분)에 포함된 경우의 중심점들이 하얀색으로 남았고, Dilation에서는 커널의 한 픽셀이라도 알파벳과 겹친 경우 중심점이 하얀색이 되었다. Erosion에서는 알파벳들이 가늘어지고 Dilation의 결과 알파벳들이 두꺼워졌다.
- Gradient
Gradient는 "같은 이미지에 Dilation과 Erosion을 적용했을 때의 차이" 이다. 객체의 윤곽선 부분이 강조된다.
# gradient: difference between erosion and dilation
gradient = cv2.morphologyEx(bin, cv2.MORPH_GRADIENT, kernel)

- Opening
Opening 은 이미지에 Erosion 후 Dilation을 적용하는 것이다. 이미지의 작은 노이즈는 제거하고 엣지를 부드럽게 하면서 기존의 객체 크기는 유지한다. 떨어져 있어야 하는 두 객체가 원본 이미지에서 붙어 있을 때 분리하는 식으로 활용할 수도 있다.

위와 같이 작은 노이즈를 제거하면서 객체의 크기를 거의 유지할 수 있다.
opened = cv2.morphologyEx(bin, cv2.MORPH_OPEN, kernel)

- Closing
Closing 은 이미지에 Dilation 후 Erosion을 적용하는 것이다. 이미지의 객체 내부에 존재하는 작은 구멍을 매우고 가까운 객체를 연결시킨다.

위와 같이 객체 내부의 작은 구멍들을 매우는 동시에 객체의 크기를 거의 유지할 수 있다.
closed = cv2.morphologyEx(bin, cv2.MORPH_CLOSE, kernel)

이외에도 원본 이미지에서 Opening을 뺀 값인 Top-hat, Closing에서 원본 이미지를 뺀 값인 Black-hat 등이 있다.
- Top-hat: 밝고 작은 객체 강조, Original Image - Opening
- Black-hat: 어둡고 작은 객체 강조, Closing - Original Image
'컴퓨터 비전 > openCV' 카테고리의 다른 글
| [openCV] Image Thresholding (0) | 2025.12.09 |
|---|---|
| [openCV] Image Transformation - Affine Transformation, Perspective Transformation (0) | 2025.12.03 |
| [openCV] Image Transformation - Log, Gamma, Piecewise-linear (0) | 2025.12.02 |
| [openCV] Image Blurring - Gaussian Blur, Median Blur, Bilateral Filter (0) | 2025.11.29 |