4장. 채널 처리와 히스토그램 분석
히스토그램으로 할 수 있는 일
병원에서 잰 키와 혈압은 진단, 비교, 기록에 두루 쓰입니다. 히스토그램도 한 번 세어 두면 여러 곳에 씁니다. 사진이 너무 어둡거나 밝은지 진단하고, 모은 사진 수백 장을 한꺼번에 점검하고, 비슷한 사진을 찾고, 다음 장에서는 고치는 데 씁니다.
그림의 네 상자 가운데 앞의 셋은 이 장에서 맛보고, 마지막 "고치기"는 5장에서 합니다. 여기서 키와 혈압이 히스토그램이고, 진단·비교·기록이 상자 네 개의 쓰임입니다.
쓰임과 쓰는 숫자
| 쓰임 | 쓰는 숫자 | 예 |
|---|---|---|
| 노출 진단 | 평균, 아주 어둡거나 밝은 칸 비율 | "이 사진은 어두운 칸이 절반이 넘는다" |
| 대비 진단 | 표준편차 | "막대가 좁게 모여 밋밋하다" |
| 데이터 품질 점검 | 위 숫자를 사진마다 표로 | 학습용 사진에서 지나치게 어두운 것 골라내기 |
| 닮은 그림 찾기 | cv2.compareHist 의 점수 | 같은 장면을 찍은 사진 묶기 |
| 고치기 | 히스토그램 평활화, CLAHE | 5장 |
짧은 예시
cv2.compareHist 는 히스토그램 두 개를 받아 닮은 정도를 숫자로 돌려줍니다. cv2.HISTCMP_CORREL(correlation, 상관)을 주면 막대 모양이 같을수록 1 에 가깝습니다.
import cv2
names = ["normal", "dark", "bright", "low_contrast"]
hists = {}
for name in names:
gray = cv2.imread(f"ch04_exposure/{name}.png", cv2.IMREAD_GRAYSCALE)
hists[name] = cv2.calcHist([gray], [0], None, [32], [0, 256])
# 정상 사진의 히스토그램과 나머지를 견준다
for name in names:
score = cv2.compareHist(hists["normal"], hists[name], cv2.HISTCMP_CORREL)
print(f"normal 과 {name:12} 의 닮음 점수: {score:.3f}")교안 PC 에서 이 코드를 돌리면 normal 끼리는 1.000, dark 는 0.134, bright 는 0.070, low_contrast 는 -0.020 이 나옵니다. 같은 장면이라도 밝기가 바뀌면 막대가 옮겨 가서 점수가 낮아집니다. 히스토그램은 "무엇이 찍혔나"가 아니라 "밝기가 어떻게 퍼졌나"를 견준다는 뜻입니다.
주의할 점
- 히스토그램이 닮았다고 같은 장면은 아닙니다. 픽셀의 자리를 버렸으므로, 위아래를 뒤집은 사진도 히스토그램은 똑같습니다.
- 진단 기준(평균 80 미만 등)은 사진의 쓰임에 따라 다르게 정합니다. 이 장의 기준은 연습용으로 정한 값입니다.