영상 처리에서 가장 기본이 되는 작업 중 하나는 이미지를 흑백(0과 255)으로만 표현하는 이진화(Binarization)입니다. 이번 포스팅에서는 특정 임계값을 기준으로 정보를 나누는 스레시홀딩과 최적의 임계값을 자동으로 찾아주는 오츠의 알고리즘, 그리고 조명 변화에 강한 적응형 스레시홀딩에 대해 정리해 보겠습니다.
1. 전역 스레시홀딩 (Global Thresholding)
전역 스레시홀딩은 이미지 전체에 동일한 임계값(Threshold)을 적용하여 픽셀을 두 부류로 나누는 방식입니다. 보통 그레이스케일 이미지에서 특정 밝기를 기준으로 '물체'와 '배경'을 분리할 때 사용합니다.
OpenCV에서는 cv2.threshold() 함수를 사용하며, 적용 방식에 따라 다양한 플래그를 제공합니다.
| 플래그 | 동작 방식 |
| cv2.THRESH_BINARY | 임계값보다 크면 value, 작으면 0 |
| cv2.THRESH_BINARY_INV | BINARY의 반대 (크면 0, 작으면 value) |
| cv2.THRESH_TRUNC | 임계값보다 크면 임계값으로 고정, 작으면 유지 |
| cv2.THRESH_TOZERO | 임계값보다 크면 유지, 작으면 0 |
| cv2.THRESH_TOZERO_INV | 크면 0, 작으면 유지 |
2. 오츠의 이진화 알고리즘 (Otsu's Method)
전역 스레시홀딩의 가장 큰 고민은 "임계값을 몇으로 설정해야 가장 최적인가?"입니다. 오츠의 알고리즘은 이미지의 히스토그램 분포를 분석하여 클래스 간 분산(Between-class variance)을 최대화하는 임계값을 자동으로 계산합니다.
- 특징: 개발자가 수치를 직접 입력할 필요가 없습니다.
- 사용법: cv2.threshold()의 마지막 인자에 cv2.THRESH_OTSU를 추가합니다. 이때 임계값 파라미터는 무시되므로 -1이나 0을 넣으면 됩니다.
# 오츠의 알고리즘 적용 예시
ret, t_otsu = cv2.threshold(img, -1, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
print(f"자동으로 찾아낸 최적 임계값: {ret}")
3. 적응형 스레시홀딩 (Adaptive Thresholding)
전체 이미지에 하나의 임계값을 적용하는 방식은 조명이 불균일하거나 그림자가 있는 이미지에서 한계를 보입니다. 특정 부분은 너무 밝아 날아가고, 특정 부분은 너무 어두워 뭉쳐버리기 때문입니다.
이를 해결하기 위해 이미지를 작은 영역으로 나누고 각 영역의 이웃 픽셀 값을 기반으로 임계값을 동적으로 계산하는 것이 적응형 스레시홀딩입니다.
🛠️ 주요 파라미터
- method: 임계값 결정 방법
- cv2.ADAPTIVE_THRESH_MEAN_C: 이웃 픽셀들의 산술 평균
- cv2.ADAPTIVE_THRESH_GAUSSIAN_C: 가우시안 가중치 합
- block_size: 영역의 크기 (반드시 홀수)
- C: 계산된 평균이나 가중치 합에서 뺄 상수 (미세 조정용)
🚀 실전 요약 코드
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('document.jpg', cv2.IMREAD_GRAYSCALE)
# 1. 전역 스레시홀딩 (임계값 127 직접 지정)
_, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 2. 오츠의 알고리즘 (최적 임계값 자동 탐색)
ret, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# 3. 적응형 스레시홀딩 (가우시안 분포 활용)
th3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2)
📝 마치며
단순한 환경에서는 오츠의 알고리즘이 효율적이지만, 실제 야외 촬영 영상이나 복잡한 조명 조건에서는 적응형 스레시홀딩이 훨씬 뛰어난 결과물을 보여줍니다. 영상 내에서 텍스트를 추출하거나 객체의 윤곽을 명확히 잡아야 할 때 이 기능들을 적절히 혼합하여 사용하시기 바랍니다.
'컴퓨터 과학 > 👀 컴퓨터 비전' 카테고리의 다른 글
| 📊 [OpenCV 기초] 히스토그램과 화질 개선 (정규화, 평탄화, CLAHE) (0) | 2026.01.07 |
|---|---|
| 🖼️ [OpenCV 기초] 이미지 연산과 합성 (블렌딩, 마스킹) (0) | 2026.01.07 |
| 🎨 [OpenCV 기초] 이미지 색상 표현 방식 (BGR, HSV, YUV) 이해하기 (0) | 2026.01.07 |
| 📸 [OpenCV 기초] 이미지 내 관심영역(ROI) 표시 및 활용하기 (0) | 2026.01.07 |
| 🖱️ [OpenCV 기초] 창 관리와 인터랙티브한 이벤트 처리 (키보드 & 마우스) (0) | 2026.01.07 |