OpenCV 비전 실무4장 · 채널 처리와 히스토그램 분석12 / 21← 이전목차다음 →MetaContents

4장. 채널 처리와 히스토그램 분석

히스토그램으로 할 수 있는 일

병원에서 잰 키와 혈압은 진단, 비교, 기록에 두루 쓰입니다. 히스토그램도 한 번 세어 두면 여러 곳에 씁니다. 사진이 너무 어둡거나 밝은지 진단하고, 모은 사진 수백 장을 한꺼번에 점검하고, 비슷한 사진을 찾고, 다음 장에서는 고치는 데 씁니다.

노출 진단, 품질 점검, 닮은 그림 찾기, 고치기의 네 가지 쓰임을 나란히 놓은 비교 그림

그림의 네 상자 가운데 앞의 셋은 이 장에서 맛보고, 마지막 "고치기"는 5장에서 합니다. 여기서 키와 혈압이 히스토그램이고, 진단·비교·기록이 상자 네 개의 쓰임입니다.

쓰임과 쓰는 숫자

쓰임쓰는 숫자예
노출 진단평균, 아주 어둡거나 밝은 칸 비율"이 사진은 어두운 칸이 절반이 넘는다"
대비 진단표준편차"막대가 좁게 모여 밋밋하다"
데이터 품질 점검위 숫자를 사진마다 표로학습용 사진에서 지나치게 어두운 것 골라내기
닮은 그림 찾기cv2.compareHist 의 점수같은 장면을 찍은 사진 묶기
고치기히스토그램 평활화, CLAHE5장

짧은 예시

cv2.compareHist 는 히스토그램 두 개를 받아 닮은 정도를 숫자로 돌려줍니다. cv2.HISTCMP_CORREL(correlation, 상관)을 주면 막대 모양이 같을수록 1 에 가깝습니다.

Python
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 미만 등)은 사진의 쓰임에 따라 다르게 정합니다. 이 장의 기준은 연습용으로 정한 값입니다.
← 이전 절4장 · 마스크로 일부만 세기다음 절 →4장 · 실습 지도