1. 灰度图像直方图统计与可视化

灰度图像直方图统计与可视化 学习卡片

任务说明

读取一张灰度图像,统计每个灰度级(0~255)的像素出现次数,绘制直方图条形图,并观察图像亮度分布特征。本案例使用 OpenCV 读取图像、NumPy 完成统计、Matplotlib 绘制图形。

实现代码

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 1. 读取灰度图像(若原图为彩色,自动转为灰度)
image = cv2.imread('lena_gray.jpg', cv2.IMREAD_GRAYSCALE)
if image is None:
    raise FileNotFoundError('未找到图像文件,请确认 lena_gray.jpg 位于当前目录')

# 2. 计算灰度直方图(bins=256,范围[0,255])
hist = cv2.calcHist([image], [0], None, [256], [0, 256])
hist = hist.flatten()  # 转为形状(256,)的一维数组

# 3. 绘制直方图条形图
plt.figure(figsize=(10, 4))
plt.bar(range(256), hist, width=1.0, color='gray', edgecolor='none')
plt.title('Grayscale Histogram')
plt.xlabel('Pixel Intensity (0-255)')
plt.ylabel('Pixel Count')
plt.xlim([0, 255])
plt.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.savefig('histogram_result.png', dpi=150)
plt.show()

# 4. 输出基础统计信息(用于观察分布特征)
print(f'图像尺寸: {image.shape[1]}x{image.shape[0]}')
print(f'灰度最小值: {image.min()}, 最大值: {image.max()}')
print(f'灰度均值: {image.mean():.2f}, 标准差: {image.std():.2f}')
print(f'最暗(0)像素数: {hist[0]}, 最亮(255)像素数: {hist[255]}')

运行方式

  1. 安装依赖:pip install opencv-python numpy matplotlib
  2. 将任意灰度图像命名为 lena_gray.jpg 放在脚本同目录(若使用其他图像,请修改文件名)
  3. 运行脚本,观察弹出的直方图窗口与终端统计信息

验证方法

程序正常执行后,应满足以下判定标准:

  • 终端输出的图像尺寸与输入图像一致;
  • 直方图横轴为0~255灰度级,纵轴为像素数量,所有柱状条数值之和等于图像总像素数(宽×高);
  • 若图像偏暗,直方图柱状条集中在左侧低灰度区;若偏亮则集中在右侧;对比度低时柱状条分布范围窄且集中。
灰度直方图统计流程与数据映射 灰度图像 (M×N 像素) cv2.calcHist 统计0~255各级像素数 hist[256] hist[i] = 灰度i的像素数 plt.bar 直方图条形图 直方图条形图示意(横轴:灰度级,纵轴:像素数) 0 128 255 灰度级 → 观察要点:柱状条集中在左侧→图像偏暗;集中在右侧→偏亮;分布范围窄→对比度低

预期输出示例

对于一张典型的 512×512 灰度测试图,终端输出格式如下(具体数值随图像内容变化):

图像尺寸: 512x512
灰度最小值: 12, 最大值: 245
灰度均值: 118.37, 标准差: 52.14
最暗(0)像素数: 0, 最亮(255)像素数: 0

直方图将显示各灰度级的像素分布柱状条,可通过观察柱状条集中区域判断图像亮度与对比度特性。