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

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

히스토그램이란

담임 선생님이 반 학생들의 키를 조사한다고 해 봅시다. 20명의 키를 한 줄로 늘어놓으면 한눈에 들어오지 않습니다. 그래서 150~155cm, 155~160cm 처럼 5cm 씩 구간을 나누고, 구간마다 학생이 몇 명인지 셉니다. 센 숫자를 막대로 세우면 "165cm 근처에 가장 많구나"가 바로 보입니다. 이 막대그래프가 히스토그램입니다.

0~255 를 구간으로 나누고, 구간마다 픽셀 수를 센 뒤, 막대로 그리는 세 걸음 흐름도

그림의 세 걸음은 키를 세는 순서와 같습니다. 학생의 키 대신 픽셀의 밝기를, 학생 수 대신 픽셀 수를 셉니다. 여기서 5cm 구간이 bin 이고, 구간마다 센 학생 수가 도수입니다.

가상의 반 학생 20명의 키를 5cm 구간으로 세어 그린 막대그래프

키 숫자는 설명을 위해 지어낸 가상의 숫자입니다. 막대 하나가 구간 하나이고, 막대의 높이가 그 구간에 든 학생 수입니다. 165~170cm 막대가 6명으로 가장 높습니다.

키 히스토그램과 밝기 히스토그램

견줄 것키 히스토그램밝기 히스토그램
세는 것학생 한 명픽셀 한 칸
가로축키(cm)밝기(0~255)
세로축학생 수픽셀 수
구간(bin)5cm 씩보통 1 씩(256개), 넓게 보려면 8 씩(32개)
막대 높이를 모두 더하면반 학생 수(20)픽셀 수(320×240 = 76,800)

짧은 예시

Python
import numpy as np

# 가상의 반 학생 20명의 키(cm)
heights = [152, 155, 157, 158, 160, 161, 162, 163, 164, 165,
           165, 166, 167, 168, 169, 171, 172, 174, 176, 181]

# 구간 경계: 150, 155, ..., 185 (range 의 끝 186 은 들어가지 않는다)
edges = list(range(150, 186, 5))
# np.histogram: 구간마다 값이 몇 개인지 센 도수와 구간 경계를 함께 돌려준다
counts, bins = np.histogram(heights, bins=edges)
print([int(c) for c in counts])   # 결과: [1, 3, 5, 6, 3, 1, 1]
print(int(counts.sum()))          # 결과: 20 → 막대를 모두 더하면 학생 수

구간 경계가 8개(150~185)이면 구간은 7개입니다. 울타리 기둥이 8개면 칸이 7개인 것과 같습니다.

주의할 점

  • 구간은 왼쪽 경계를 넣고 오른쪽 경계를 뺍니다. 165cm 학생은 160~165 가 아니라 165~170 구간에 들어갑니다.
  • 히스토그램은 "어디에 몇 개"만 남기고 "누가 어느 자리에"는 지웁니다. 사진의 히스토그램으로는 밝은 칸이 위에 있는지 아래에 있는지 알 수 없습니다.
← 이전 절4장 · 채널 바꿔치기와 색 정보 분석다음 절 →4장 · cv2.calcHist 의 인자