OpenCV-Python快速入门系列23图像直方图

前言

直方图是图像处理中用来统计像素值分布的常用工具。通过直方图,我们可以快速了解图像的亮度、对比度、颜色分布等信息,从而为后续处理(如直方图均衡化、阈值分割等)提供依据。

功能实现

本示例实现了以下功能:

  1. 显示图像:加载一张彩色图像并显示。
  2. 计算彩色直方图:统计 RGB 三个通道的像素值分布。
  3. 可视化直方图:使用 Matplotlib 绘制直方图。

完整代码

import cv2 as cv
import matplotlib.pyplot as plt

def image_hist():
    # 加载彩色图像
    image = cv.imread('images/test.png')
    if image is None:
        print("无法加载图像")
        return

    # 显示图像
    cv.imshow("image", image)

    # 定义颜色通道
    color = ('blue', 'green', 'red')

    # 计算并绘制每个通道的直方图
    for i, col in enumerate(color):
        hist = cv.calcHist([image], [i], None, [256], [0, 256])
        print(f"{col} 通道直方图数据:\n", hist.T)  # 转置为行向量便于阅读
        plt.plot(hist, color=col, label=f'{col.capitalize()} Channel')
        plt.xlim([0, 256])

    # 显示直方图
    plt.title("Color Histogram")
    plt.xlabel("Pixel Value")
    plt.ylabel("Frequency")
    plt.legend()
    plt.grid()
    plt.show()

    # 等待用户按键关闭窗口
    cv.waitKey(0)
    cv.destroyAllWindows()

# 调用函数
image_hist()

定义颜色通道

color = ('blue', 'green', 'red')
  • 定义通道颜色,用于对应 BGR 三个通道的像素值分布。

3. 计算直方图

hist = cv.calcHist([image], [i], None, [256], [0, 256])
  • image:输入图像。
  • [i]:通道索引,0 表示蓝色通道,1 表示绿色通道,2 表示红色通道。
  • None:不使用掩码。
  • [256]:将像素值分为 256 个区间。
  • [0, 256]:像素值范围为 0 到 255。

4. 绘制直方图

plt.plot(hist, color=col, label=f'{col.capitalize()} Channel')
plt.xlim([0, 256])
  • 使用 Matplotlib 的 plt.plot 函数绘制直方图。
  • 设置 x 轴范围为 [0, 256]

5. 添加图例与网格

plt.legend()
plt.grid()
  • 添加图例便于区分不同通道的直方图。
  • 显示网格方便观察直方图数据分布。

应用场景

  1. 图像分析
    • 通过直方图快速了解图像的亮度、对比度及颜色分布。
  2. 图像增强
    • 结合直方图均衡化技术,提升图像的对比度。
  3. 特征提取
    • 将直方图作为图像特征,用于分类或检索。

输出效果

图片[1]-OpenCV-Python快速入门系列23图像直方图-天煜博客

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容