이미지의 밝기 분포를 시각적으로 나타내는 도구
가로축: 밝기 레벨(0~255)
세로축: 해당 밝기 레벨을 가진 픽셀의 수
이미지의 전반적인 밝기 분포와 대비를 한눈에 파악 가능

그레이스케일 이미지 히스토그램
import cv2
from matplotlib import pyplot as plt
image = cv2.imread('plane_day_resized.png')
# 흑백 이미지 히스토그램
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
histogram_gray = cv2.calcHist([gray_image], [0], None, [256], [0, 256])
# 흑백 이미지 히스토그램 그래프
plt.plot(histogram_gray, color='gray')
plt.xlim([0, 256])
plt.title('Grayscale Histogram')
plt.xlabel('Bins')
plt.ylabel('Number of Pixels')
# 히스토그램 출력
plt.show()

# 컬러 이미지 히스토그램 (RGB)
color = ('b', 'g', 'r')
for i, col in enumerate(color):
histogram_color = cv2.calcHist([image], [i], None, [256], [0, 256])
plt.plot(histogram_color, color=col)
plt.xlim([0, 256])
# 히스토그램 출력
plt.show()

# 원본 이미지 히스토그램
histogram_original = cv2.calcHist([image], [0], None, [256], [0, 256])
# 히스토그램 평활화
equalized_image = cv2.equalizeHist(image)
histogram_equalized = cv2.calcHist([equalized_image], [0], None, [256], [0, 256])

# 불균일한 분포를 가진 데이터 생성
data = np.concatenate([np.random.normal(3, 1, 1000), np.random.normal(7, 2, 1000)])
# 히스토그램 스트레칭
min_val, max_val = np.min(data), np.max(data)
stretched_data = (data - min_val) / (max_val - min_val) * 255

# 테스트용 이미지 생성 (일부 밝고 일부 어두운 영역 포함)
image = np.zeros((500, 500), dtype=np.uint8)
image[0:200, :] = 30 # 상단은 어두운 영역
image[200:300, :] = 120 # 중간은 약간 어두운 영역
image[300:500, :] = 220 # 하단은 밝은 영역
# 원본 이미지의 히스토그램 계산
histogram_original = cv2.calcHist([image], [0], None, [256], [0, 256])
# 히스토그램 스트레칭
stretched_image = cv2.normalize(image, None, 0, 255, cv2.NORM_MINMAX)
histogram_stretched = cv2.calcHist([stretched_image], [0], None, [256], [0, 256])
# 히스토그램 평활화
equalized_image = cv2.equalizeHist(image)
histogram_equalized = cv2.calcHist([equalized_image], [0], None, [256], [0, 256])

이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다