OpenCV 모폴로지 연산 (침식, 팽창, 열기, 닫기) - OpenCV 활용
개요
모폴로지 연산(Morphological Operations)은 이미지의 구조적 특징을 분석하고 변환하는 기법으로, 주로 이진화된 이미지에서 형태를 조정하는 데 사용됩니다. 이러한 연산은 주로 노이즈 제거, 객체 강조 및 분할 등의 작업에서 활용됩니다. OpenCV에서는 다양한 모폴로지 연산을 제공하며, 대표적으로 침식(Erosion), 팽창(Dilation), 열기(Open), 닫기(Close) 연산이 있습니다.
이번 포스팅에서는 모폴로지 연산의 개념을 설명하고 OpenCV를 사용하여 실제로 구현하는 방법을 다룹니다.
1. 모폴로지 연산이란?
모폴로지 연산은 구조적 요소(structuring element)를 사용하여 이미지의 형태를 변경하는 기법입니다. 이 과정에서 커널(kernel)이라는 작은 행렬을 사용하여 픽셀을 그룹으로 묶어 연산을 수행합니다.
주요 모폴로지 연산은 다음과 같습니다:
- 침식(Erosion): 객체의 경계를 줄이는 연산 (노이즈 제거, 객체 축소)
- 팽창(Dilation): 객체의 경계를 확장하는 연산 (객체 강조, 빈 공간 채우기)
- 열기(Open): 침식 후 팽창을 적용하는 연산 (노이즈 제거에 효과적)
- 닫기(Close): 팽창 후 침식을 적용하는 연산 (객체 내부의 빈 공간 제거)
이제 각 연산을 하나씩 살펴보고 OpenCV를 활용한 구현 방법을 알아보겠습니다.
2. 침식(Erosion)
개념
침식(Erosion)은 이미지에서 객체의 외곽선을 깎아내는 연산입니다. 주어진 커널이 객체의 픽셀 위에 놓였을 때, 커널이 덮고 있는 모든 픽셀이 1(흰색)일 경우에만 해당 픽셀이 유지됩니다. 그렇지 않으면 0(검은색)으로 변경됩니다.
즉, 작은 노이즈를 제거하거나 객체를 축소하는 데 사용됩니다.
OpenCV 구현
import cv2
import numpy as np
# 이미지 불러오기
gray = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# 커널 정의 (5x5)
kernel = np.ones((5,5), np.uint8)
# 침식 연산 적용
erosion = cv2.erode(gray, kernel, iterations=1)
# 결과 출력
cv2.imshow('Original', gray)
cv2.imshow('Erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
결과:
- 객체의 외곽이 줄어들며, 작은 노이즈가 제거됩니다.
- 반복(iterations) 횟수를 증가시키면 침식 효과가 더 강해집니다.
3. 팽창(Dilation)
개념
팽창(Dilation)은 반대로 객체의 경계를 확장하는 연산입니다. 커널이 덮고 있는 영역 중 하나라도 1(흰색) 픽셀이 있으면 해당 픽셀을 1로 설정합니다.
이 연산은 객체를 강조하거나 빈 공간을 채우는 데 유용합니다.
OpenCV 구현
# 팽창 연산 적용
dilation = cv2.dilate(gray, kernel, iterations=1)
# 결과 출력
cv2.imshow('Original', gray)
cv2.imshow('Dilation', dilation)
cv2.waitKey(0)
cv2.destroyAllWindows()
결과:
- 객체의 크기가 커지고, 빈 공간이 채워집니다.
- 글씨가 끊어진 경우, 팽창을 통해 연결할 수 있습니다.
4. 열기 연산(Open)
개념
열기 연산(Open)은 침식 후 팽창을 수행하는 연산입니다. 주로 이미지에서 작은 노이즈를 제거하는 데 유용합니다.
즉, 객체가 아닌 작은 점(노이즈)을 먼저 제거한 후, 원래 객체 크기를 복원합니다.
OpenCV 구현
# 열기 연산 적용
opening = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel)
# 결과 출력
cv2.imshow('Original', gray)
cv2.imshow('Opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()
결과:
- 작은 노이즈가 제거되며, 원본 객체의 크기는 유지됩니다.
5. 닫기 연산(Close)
개념
닫기 연산(Close)은 팽창 후 침식을 수행하는 연산입니다. 객체 내부의 빈 공간을 채우거나, 끊어진 부분을 연결하는 데 유용합니다.
OpenCV 구현
# 닫기 연산 적용
closing = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)
# 결과 출력
cv2.imshow('Original', gray)
cv2.imshow('Closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()
결과:
- 객체 내부의 작은 구멍이 채워지고, 끊어진 부분이 연결됩니다.
6. 정리 및 활용 예시
모폴로지 연산 비교
| 연산 종류 | 효과 |
|---|---|
| 침식(Erosion) | 객체 축소, 노이즈 제거 |
| 팽창(Dilation) | 객체 확장, 빈 공간 채우기 |
| 열기(Open) | 작은 노이즈 제거 |
| 닫기(Close) | 끊어진 객체 연결 |
활용 예시
- 문자인식(Optical Character Recognition, OCR): 배경 노이즈를 제거하고 글자를 더 선명하게 만들 때 사용됩니다.
- 객체 검출(Object Detection): 배경과 전경을 분리할 때 모폴로지 연산을 적용할 수 있습니다.
- 의료 영상 처리: MRI나 CT 스캔에서 불필요한 잡음을 제거할 때 활용됩니다.
- 자율 주행: 도로 표지판이나 차선을 더 명확하게 검출하는 데 사용됩니다.
마무리
이번 포스팅에서는 모폴로지 연산의 개념과 OpenCV를 활용한 구현 방법을 살펴보았습니다. 모폴로지 연산은 단순한 이진화 처리뿐만 아니라 다양한 컴퓨터 비전 프로젝트에서 중요한 역할을 합니다. 실제 프로젝트에서 원하는 효과를 얻기 위해 커널 크기와 반복 횟수를 조정하면서 실험해보는 것이 중요합니다.
'Python > OpenCV' 카테고리의 다른 글
| OpenCV 윤곽선 그리기 및 특징 분석 (cv2.boundingRect(), cv2.minAreaRect()) (0) | 2025.11.10 |
|---|---|
| Django에서 WebSocket과 채팅 기능 구현 (Django Channels) (0) | 2025.11.10 |
| OpenCV 윤곽선 검출 (cv2.findContours()) (0) | 2025.11.09 |
| OpenCV로 색상 히스토그램 평탄화 (cv2.equalizeHist()) (0) | 2025.11.08 |
| OpenCV 이미지 히스토그램 분석 (cv2.calcHist()) (0) | 2025.11.07 |