8장. Threshold, Adaptive Threshold, Otsu
정리
- 이진화는 흑백 그림의 칸을 커트라인(임계값)과 견줘 0 과 255 두 값으로 나누는 일입니다. 결과는 3장의 마스크와 같은 꼴이라 9장의 모폴로지와 12장의 윤곽선 찾기의 재료가 됩니다.
cv2.threshold(src, thresh, maxval, type)은 (쓴 임계값, 결과) 두 값을 돌려줍니다. 임계값보다 커야 maxval 이 되므로 127 은 127 로 나눌 때 검정입니다.- 방식은 BINARY, BINARY_INV, TRUNC, TOZERO, TOZERO_INV 다섯 가지이고, 앞의 둘만 이진 그림을 만듭니다. 어두운 글자나 부품을 흰색으로 고르려면 BINARY_INV 를 씁니다.
- 임계값은 히스토그램의 두 봉우리 사이 골짜기에 두면 깨끗합니다. 부품 그림에서 100 과 150 은 검은 칸이 0.167 과 0.177 로 비슷했고, 작업대 봉우리 안의 200 은 0.906 으로 작업대 대부분을 검게 칠했습니다.
- 조명이 고르지 않으면 커트라인 하나로는 모자랍니다. 그늘진 안내문에서 정답과 같은 칸은 전역 127 이 0.619, Otsu 가 0.560 이었고, Adaptive(GAUSSIAN_C, 15, 10)는 0.987 이었습니다.
cv2.adaptiveThreshold는 칸마다 "주변 blockSize × blockSize 의 평균 − C"를 기준으로 씁니다. blockSize 는 1 보다 큰 홀수이고, C 를 키우면 잡티가 줄어듭니다.- Otsu 는 모든 후보를 해 보고 "비율 × 비율 × (두 평균의 차)²" 가 가장 큰 값을 고릅니다. 부품 그림에서 고른 136 은 직접 짠 NumPy 계산과 같았습니다. 노이즈가 많으면 블러를 먼저 해서 원본 결과와 같은 칸이 0.926 에서 0.997 로 올랐고, 영수증처럼 그늘이 지면 Otsu(평균 정확도 0.72)보다 Adaptive(0.992)가 알맞습니다.