4장. 채널 처리와 히스토그램 분석
히스토그램이란
담임 선생님이 반 학생들의 키를 조사한다고 해 봅시다. 20명의 키를 한 줄로 늘어놓으면 한눈에 들어오지 않습니다. 그래서 150~155cm, 155~160cm 처럼 5cm 씩 구간을 나누고, 구간마다 학생이 몇 명인지 셉니다. 센 숫자를 막대로 세우면 "165cm 근처에 가장 많구나"가 바로 보입니다. 이 막대그래프가 히스토그램입니다.
그림의 세 걸음은 키를 세는 순서와 같습니다. 학생의 키 대신 픽셀의 밝기를, 학생 수 대신 픽셀 수를 셉니다. 여기서 5cm 구간이 bin 이고, 구간마다 센 학생 수가 도수입니다.
키 숫자는 설명을 위해 지어낸 가상의 숫자입니다. 막대 하나가 구간 하나이고, 막대의 높이가 그 구간에 든 학생 수입니다. 165~170cm 막대가 6명으로 가장 높습니다.
키 히스토그램과 밝기 히스토그램
| 견줄 것 | 키 히스토그램 | 밝기 히스토그램 |
|---|---|---|
| 세는 것 | 학생 한 명 | 픽셀 한 칸 |
| 가로축 | 키(cm) | 밝기(0~255) |
| 세로축 | 학생 수 | 픽셀 수 |
| 구간(bin) | 5cm 씩 | 보통 1 씩(256개), 넓게 보려면 8 씩(32개) |
| 막대 높이를 모두 더하면 | 반 학생 수(20) | 픽셀 수(320×240 = 76,800) |
짧은 예시
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 구간에 들어갑니다.
- 히스토그램은 "어디에 몇 개"만 남기고 "누가 어느 자리에"는 지웁니다. 사진의 히스토그램으로는 밝은 칸이 위에 있는지 아래에 있는지 알 수 없습니다.