OpenCV 비전 실무8장 · Threshold, Adaptive Threshold, Otsu7 / 21← 이전목차다음 →MetaContents

8장. Threshold, Adaptive Threshold, Otsu

조명이 고르지 않을 때

창가 자리에서 책을 펴면 창 쪽 페이지는 환하고 안쪽 페이지는 그늘이 집니다. 휴대폰으로 문서를 찍어도 손이나 휴대폰의 그림자가 한쪽에 드리웁니다. 사람의 눈은 그늘 속 글자도 잘 읽지만, 커트라인 하나로 나누는 전역 임계값은 그늘진 쪽을 통째로 "검정"으로 보냅니다.

그늘진 안내문의 원본, 히스토그램, 전역 임계값 127 결과, Otsu 결과를 2행 2열로 놓은 그림

왼쪽 위는 오른쪽으로 갈수록 그늘이 짙어지는 가상의 실습 안내문입니다. 오른쪽 위의 히스토그램을 보면 바탕(종이)의 밝기가 50 에서 225 까지 넓게 퍼져 골짜기가 없습니다. 그래서 아래 두 그림처럼 임계값 127 이든 Otsu 가 고른 137 이든, 오른쪽 그늘이 큰 검은 덩어리가 되고 그 안의 글자가 사라집니다. 여기서 창가의 환한 쪽이 그림의 왼쪽, 그늘진 안쪽이 오른쪽입니다.

왼쪽과 오른쪽의 밝기

자리종이(바탕)의 밝기글자의 밝기127 로 나누면
왼쪽(밝은 쪽)220 안팎45 안팎종이 흰색, 글자 검정. 잘 나뉜다
가운데150 안팎35 안팎아직 잘 나뉜다
오른쪽(그늘)50~70더 어둡다종이도 글자도 검정. 글자가 사라진다

오른쪽 그늘의 종이(50~70)는 왼쪽의 글자(45 안팎)와 거의 같은 밝기입니다. 숫자 하나로는 "왼쪽의 글자"와 "오른쪽의 종이"를 함께 가를 수 없습니다.

짧은 예시

Python
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 이 나옵니다. 같은 종이인데 네 배 가까이 밝기가 다릅니다.

주의할 점

  • 4장처럼 평균과 표준편차만 보면 이런 그늘을 알아채기 어렵습니다. 그림의 왼쪽과 오른쪽, 위와 아래를 나눠 평균을 견줘 보면 알 수 있습니다.
  • 5장에서 배운 밝기·대비 조정은 그림 전체에 똑같이 적용되므로 이런 그늘은 지우지 못합니다.
← 이전 절8장 · 임계값을 고르는 어려움다음 절 →8장 · Adaptive Threshold