8장. Threshold, Adaptive Threshold, Otsu
이진화란
시험 커트라인을 다시 떠올려 봅시다. 학생마다 점수는 37점, 61점, 88점처럼 제각각입니다. 커트라인 60점을 대면 61점과 88점은 "합격", 37점은 "불합격"이 됩니다. 점수의 세세한 차이는 사라지고 두 무리만 남습니다. 대신 "누가 합격했나"는 아주 또렷해집니다.
그림을 왼쪽부터 읽습니다. 흑백 그림의 칸마다 밝기를 임계값과 견줘서, 넘으면 흰색(255), 못 넘으면 검정(0)으로 적습니다. 여기서 학생의 점수가 칸의 밝기이고, 커트라인이 임계값이며, 합격·불합격이 흰색·검정입니다. 비유와 다른 점이 하나 있습니다. 시험은 "60점 이상"이 합격이지만, OpenCV 는 임계값과 같은 값은 넘지 못한 쪽(검정)으로 보냅니다.
밝은 작업대 위에 어두운 동전, 와셔, 볼트가 놓인 가상의 그림입니다. 임계값 127 로 이진화하면 가운데처럼 부품은 검정, 작업대는 흰색이 됩니다. 오른쪽은 흑백을 뒤집은 결과로, 부품이 흰색입니다. 3장에서 마스크는 "고른 칸은 흰색(255)"이라고 했으므로, 부품을 고르고 싶으면 오른쪽 꼴을 씁니다.
왜 이진화하나
| 쓰임 | 하는 일 | 이어지는 장 |
|---|---|---|
| 글자만 남기기 | 문서·영수증의 글자를 검정, 종이를 흰색으로 | 문자 인식(OCR)의 앞 단계 |
| 물체만 남기기 | 부품, 동전, 세포처럼 바탕과 밝기가 다른 것을 흰색으로 | 넓이·개수 재기 |
| 마스크 만들기 | 고른 곳만 255 인 판 | 4장처럼 일부만 세기 |
| 다듬기의 재료 | 이진 그림의 잡티를 지우고 구멍을 메우기 | 9장 모폴로지 |
| 윤곽선의 재료 | 흰 덩어리의 테두리 찾기 | 12장 윤곽선 |
짧은 예시
import numpy as np
# 칸 다섯 개의 밝기와 커트라인 127
row = np.array([30, 100, 127, 128, 200])
# 127 보다 크면 255, 아니면 0. np.where(조건, 참일 때, 거짓일 때)
binary = np.where(row > 127, 255, 0)
print(binary.tolist()) # 결과: [0, 0, 0, 255, 255] → 127 은 넘지 못한 쪽np.where 는 조건이 참인 칸과 거짓인 칸에 다른 값을 넣습니다. 이진화의 뼈대는 이 한 줄입니다. OpenCV 의 함수는 같은 일을 빠르게, 여러 방식으로 해 줍니다.
주의할 점
- 이진화는 흑백 그림에 합니다. 컬러 그림은 먼저
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)로 바꾸거나cv2.IMREAD_GRAYSCALE로 읽습니다(2장). - 이진화하면 밝기의 세세한 차이는 버려집니다. 원본은 지우지 말고 따로 둡니다.