OpenCV- 이미지 이진화, 모폴로지

dumbbelldore·2025년 1월 28일
0

zero-base 33기

목록 보기
91/97

1. 이진화(Binarization) 개념

  • 그레이스케일 이미지를 흑백(이진 이미지)으로 변환하는 과정
  • 이진화 과정을 거치면 픽셀 값이 0(검정) 또는 255(흰색)로 변환되어 단순한 형태를 취하게 됨
  • 이진화 수행을 위해 특정 임계값(threshold)을 활용하며 임계값 보다 크면 흰색, 임계값 보다 작으면 검정색으로 변환함

2. 이진화 목적

  • 데이터 용량 감소: 데이터 크기가 현저히 줄어들어 저장공간과 전송시간이 절약됨
  • 처리속도 향상: 단순한 흑백으로 구성되어 복잡한 연산이 불필요함
  • 특징 강조: 특정 요소나 형상을 두드러지게 하여 패턴인식과 같은 작업에 유용
  • 잡음 제거: 색상의 복잡성을 줄여 이미지 내 불필요한 정보나 잡음 감소 가능
  • 텍스트 인식 향상: 문서 스캔이나 OCR과 같은 작업에서 배경과 텍스트 간 구분을 명확화할 수 있음

3. 이진화 실습

import cv2

image = cv2.imread("data/sunset.jpg") # 원본 용량: 11.9MB

# 그레이스케일 변환
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 이진화
_, image_binary = cv2.threshold(
	image_gray,
    127, # 임계값
    255, # 최대값
    cv2. THRESH_BINARY
)

cv2.imwrite("data/susnet_binary.jpg", image_binary) # 이진화 후 용량: 3MB


4. 모폴로지(Morphology) 개념

  • 이진화된 이미지에 적용하여 객체의 형태를 변형하고 분석하는데 사용하는 기법
  • 주요 기법
    • Erosion: 객체의 경계 축소로 백색 잡읍 제거에 유용
    • Dilation: 객체의 경계 확장으로 사라진 객체의 정보 복구 가능
    • Opening: Erosion 후 Dilation 적용, 작은 객체나 돌출부 제거 가능
    • Closing: Dilation 후 Erosion 적용, 작은 홀이나 간격을 채울 수 있음
    • Morphology Gradient: Erosion과 Dilation의 차이를 나타내며, 객체의 윤곽을 강조할 수 있음

5. 모폴로지 실습

  • 샘플 이미지 생성
import cv2
import numpy as np

bg = np.full((500, 500), 0, dtype=np.uint8)

cv2.putText(bg,
            "ABC",
            (50,300),
            cv2.FONT_HERSHEY_SIMPLEX,
            7,
            255,
            20,
            cv2.LINE_AA)

noise = np.random.randint(0, 2, (500, 500)).astype(np.uint8) * 255
img_bwor = cv2.bitwise_or(bg, noise)
img_bwand = cv2.bitwise_and(bg, noise)

cv2.imwrite("data/abc_bwor.jpg", img_bwor)
cv2.imwrite("data/abc_bwand.jpg", img_bwand)

abc_bwor.jpg

abc_bwand.jpg

  • 4가지 모폴로지 연산 적용
kernel = np.ones((5, 5), np.uint8)

# erosion은 검은색이 우세 (흰색이 줄어듬)
erosion = cv2.erode(img_bwor, kernel, iterations=1)
# dilation은 흰색이 우세 (검은색이 줄어듬)
dilation = cv2.dilate(img_bwand, kernel, iterations=1)
opening = cv2.morphologyEx(img_bwor, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(img_bwand, cv2.MORPH_OPEN, kernel)

cv2.imwrite("data/abc_erosion.jpg", erosion)
cv2.imwrite("data/abc_dilation.jpg", dilation)
cv2.imwrite("data/abc_opening.jpg", opening)
cv2.imwrite("data/abc_closing.jpg", closing)

abc_erosion.jpg

abc_dilation.jpg

abc_opening.jpg

abc_closing.jpg


*이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.

profile
데이터 분석, 데이터 사이언스 학습 저장소

0개의 댓글