소스 뷰어
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 이미지 로드 (회색조로)
img = cv2.imread("histogram_example.jpg", cv2.IMREAD_GRAYSCALE)
# np.histogram을 사용하여 히스토그램 계산
histogram, bins = np.histogram(img.flatten(), bins=256, range=(0, 255))
# 평균(mean)과 중앙값(median) 계산
mean_val = np.mean(img)
median_val = np.median(img)
# 그래프 설정
rows, cols = 1, 2
plt.figure(figsize=(cols*7, rows*3))
# 원본 이미지 표시
plt.subplot(1, 2, 1)
plt.title('Image')
plt.imshow(img, cmap="gray")
plt.axis("off")
# 히스토그램 Bar Chart 출력
plt.subplot(1, 2, 2)
plt.title('Pixel Histogram')
# np.histogram으로 계산된 hist를 바 차트로 표시
plt.bar(bins[:-1], histogram, width=1, color='blue', label="Pixel count")
# 평균과 중앙값 표시
plt.axvline(mean_val, color='red', linestyle='--', linewidth=1.5, label=f'Mean: {mean_val:.2f}')
plt.axvline(median_val, color='green', linestyle='--', linewidth=1.5, label=f'Median: {median_val:.2f}')
# x, y축 설정
plt.xlabel('Pixel Intensity')
plt.ylabel('Pixel Count')
plt.xlim([0, 255])
# x축 tick을 적당한 간격으로 설정 (예: 0, 25, 50, ..., 255)
tick_values = np.arange(0, 256, 25)
plt.xticks(tick_values, rotation=45)
# y축 tick 포매팅
from matplotlib.ticker import FuncFormatter
plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda value, _: f'{int(value):,}'))
plt.legend()
plt.grid(axis='y', linestyle='--', alpha=0.7)
# 그래프 보여주기
plt.tight_layout()
plt.show()