▶ 모폴로지 연산
모폴로지 연산(Morphological Operations) 은 이진화된 영상에서 객체의 형태를 조작하는 연산으로, 침식(Erosion), 팽창(Dilation), 열기(Open), 닫기(Close) 등의 기법을 포함합니다.
모폴로지 연산은 주로 노이즈 제거, 객체의 형태 보정, 경계 강조, 윤곽선 추출 등에 사용됩니다. OpenCV에서는 cv2.morphologyEx() 함수를 통해 다양한 모폴로지 연산을 적용할 수 있으며, 구조 요소(커널, cv2.getStructuringElement())를 정의하여 원하는 형태로 연산을 수행할 수 있습니다.
침식(Erosion)은 객체를 축소하여 작은 노이즈를 제거하는 데 사용되며, 반대로 팽창(Dilation)은 객체를 확장하여 빈 공간을 채우는 역할을 합니다.
또한, 열기(Open)는 작은 노이즈를 효과적으로 제거하는 데 사용되며, 닫기(Close)는 객체의 내부 구멍을 메우는 데 유용합니다. 이러한 연산은 OCR, 영상 전처리, 객체 검출 등의 다양한 컴퓨터 비전 응용에서 필수적으로 활용됩니다.
살짝 끊어진 부분에 대해서는 이어주는역할도 하고, 안보여줘도 되는 불필요한 요소들에 대해서는 없애는 역할도 합니다.그 부분을 침식 혹은 팽창으로 진행하게 됩니다.
▶ 예제 확인
import cv2
import numpy as np
img = cv2.imread('C:/AIProject2/DAY12/ong.jpg', cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (400, 200))
gse = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
dst1 = cv2.dilate(img, gse)
dst2= cv2.erode(img, gse)
cv2.imshow('img', img)
cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)
cv2.waitKey()
#getStructuringElement: 커널 생성
#dilate : 팽창
#erode: 침식
▶ 대각선 근사화
대각선 근사화(Diagonal Approximation) 는 영상 처리에서 객체의 경계를 단순화하거나 윤곽선을 보다 부드럽게 표현하기 위해 사용되는 기법 중 하나입니다.
일반적으로 경계 추출 후 얻어진 픽셀 집합은 계단 형태(zigzag)로 나타날 수 있으며, 이러한 불필요한 세부 구조를 줄이기 위해 대각선 방향으로 연결된 픽셀을 보정하는 방식이 사용됩니다.
OpenCV에서는 cv2.approxPolyDP() 함수를 활용하여 윤곽선을 근사화할 수 있으며, 특정 오차 범위(ε)를 설정하여 객체의 복잡도를 줄이면서도 원본 모양을 유지할 수 있습니다.
이 기법은 주로 객체 검출, 도형 인식, 경계 단순화 등의 분야에서 활용되며, 불필요한 점을 제거하여 연산 속도를 향상시키는 효과도 있습니다.
import cv2
import matplotlib.pyplot as plt
import random
img = cv2.imread('C:/AIProject2/DAY12/ong.jpg', cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (400, 200))
# findContours : 외곽선 검출
# findContours(이미지, 검색모드, 근사화방법), 검색모드(RETR_CCOMP) : 외곽선 계층을 두 개의 레벨(연속 외곽선과 내부 구멍)으로 구분하여서 찾는 방법!
# 근사화 방법(CHAIN_APPROX_NONE) : 모든 좌표를 생략하지 않음
contours, hierarchy = cv2.findContours(img, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE)
#모든좌표를 생략하지 않기때문에 수많은 좌표들이 찍히는것임!
print(contours)
#외곽선의 계층정보
print(hierarchy)
dst = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
color = (random.randint(0,255), random.randint(0,255), random.randint(0,255))
print(color)
#drawContours ,외곽선 그리기
#drawContours(이미지, 외곽선리스트, 인덱스, 색상, 두께)
# 인덱스 -1 == 모든 외곽선그리는것
cv2.drawContours(dst, contours, -1, color, 3)
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey()
▶ 결과 확인
외곽선이 잘 따지는 그림이면 잘 따지는데 사실 일반 그림사진으로는 잘 따지지 않았다. 이런 부분은 내가 하려는 이미지에 따라서 다른것같습니다.
'AI > 컴퓨터 비전' 카테고리의 다른 글
Pascal데이터셋 + YOLOv8s를 이용한 디텍션해보기 (0) | 2025.03.25 |
---|---|
OpenCV - 영상필터링 연산 | 블러처리 | Canny (0) | 2025.03.24 |
OpenCV 영상처리 | 영상이진화 | 오츠이진화 | 적응형 이진화 (0) | 2025.03.19 |
OCR 광학 문자인식 (0) | 2025.03.18 |
OpenCV - getRotationMatrix2D| getPerspectiveTransform (0) | 2025.03.17 |