8장. Threshold, Adaptive Threshold, Otsu
조명이 고르지 않을 때
창가 자리에서 책을 펴면 창 쪽 페이지는 환하고 안쪽 페이지는 그늘이 집니다. 휴대폰으로 문서를 찍어도 손이나 휴대폰의 그림자가 한쪽에 드리웁니다. 사람의 눈은 그늘 속 글자도 잘 읽지만, 커트라인 하나로 나누는 전역 임계값은 그늘진 쪽을 통째로 "검정"으로 보냅니다.
왼쪽 위는 오른쪽으로 갈수록 그늘이 짙어지는 가상의 실습 안내문입니다. 오른쪽 위의 히스토그램을 보면 바탕(종이)의 밝기가 50 에서 225 까지 넓게 퍼져 골짜기가 없습니다. 그래서 아래 두 그림처럼 임계값 127 이든 Otsu 가 고른 137 이든, 오른쪽 그늘이 큰 검은 덩어리가 되고 그 안의 글자가 사라집니다. 여기서 창가의 환한 쪽이 그림의 왼쪽, 그늘진 안쪽이 오른쪽입니다.
왼쪽과 오른쪽의 밝기
| 자리 | 종이(바탕)의 밝기 | 글자의 밝기 | 127 로 나누면 |
|---|---|---|---|
| 왼쪽(밝은 쪽) | 220 안팎 | 45 안팎 | 종이 흰색, 글자 검정. 잘 나뉜다 |
| 가운데 | 150 안팎 | 35 안팎 | 아직 잘 나뉜다 |
| 오른쪽(그늘) | 50~70 | 더 어둡다 | 종이도 글자도 검정. 글자가 사라진다 |
오른쪽 그늘의 종이(50~70)는 왼쪽의 글자(45 안팎)와 거의 같은 밝기입니다. 숫자 하나로는 "왼쪽의 글자"와 "오른쪽의 종이"를 함께 가를 수 없습니다.
짧은 예시
import cv2
gray = cv2.imread("ch08_shadow_doc.png", cv2.IMREAD_GRAYSCALE)
# 글자가 없는 아래 여백 가까이(세로 230~239)에서 왼쪽과 오른쪽 끝의 종이 밝기를 잰다
left = gray[230:240, 0:20]
right = gray[230:240, 300:320]
print(round(float(left.mean()), 1), round(float(right.mean()), 1))
# 결과: 왼쪽은 밝고 오른쪽은 아주 어둡다교안 PC 에서는 왼쪽 207.8, 오른쪽 51.7 이 나옵니다. 같은 종이인데 네 배 가까이 밝기가 다릅니다.