opencv学习:calcHist 函数绘制图像直方图及代码实现

cv2.calcHist 函数是 OpenCV 库中用于计算图像直方图的函数。直方图是一种统计图像中像素值分布的工具,它可以提供图像的亮度、颜色等信息。这个函数可以用于灰度图像和彩色图像。

函数语法

python 复制代码
hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate=False)

参数

  • images: 图像数组或图像列表。对于单通道图像(如灰度图像),只需一个图像;对于多通道图像(如彩色图像),可以传入多个图像。
  • channels : 需要计算直方图的通道索引列表。对于灰度图像,通常传入 [0];对于彩色图像,可以传入 [0](蓝色通道)、[1](绿色通道)、[2](红色通道)。
  • mask : 可选参数,用于指定计算直方图的区域。如果为 None,则计算整个图像的直方图。如果提供了掩码图像,直方图将只计算掩码非零区域的像素值。
  • histSize : 直方图的大小,即直方图的"bin"数量。对于灰度图像,通常设置为 [256],因为像素值的范围是 0 到 255。
  • ranges : 像素值的范围。对于灰度图像,通常设置为 [0, 256]。
  • accumulate : 可选参数,用于指定是否在现有的直方图上累加。默认为 False。

返回值

  • hist: 计算得到的直方图,是一个一维数组。

代码步骤

读取灰度图像:

  • 使用 cv2.imread 读取图像,并将其转换为灰度图像。

  • cv2.IMREAD_GRAYSCALE 指定读取图像时将其转换为灰度图像。

    python 复制代码
    phone=cv2.imread("phone.png",cv2.IMREAD_GRAYSCALE)

展平灰度图像:

  • 使用 numpy.ravel 将灰度图像的二维数组展平为一维数组,以便绘制直方图。

    python 复制代码
    a=phone.ravel()

绘制灰度图像直方图:

  • 使用 matplotlib.pyplot.hist 绘制灰度图像的直方图,其中 bins=256 表示将直方图分为256个区间。

    python 复制代码
    # 使用 matplotlib 绘制灰度图像的直方图
    # bins=256 表示将直方图分为256个区间
    plt.hist(a, bins=256)
    plt.show()

计算灰度图像直方图(OpenCV方法):

  • 使用 cv2.calcHist 计算灰度图像的直方图,其中直方图分为16个区间。

    python 复制代码
    # 使用 OpenCV 计算灰度图像的直方图
    # 直方图分为16个区间
    phone_hist = cv2.calcHist([phone], [0], None, [16], [0, 256])

绘制灰度图像直方图(OpenCV方法):

  • 使用 matplotlib.pyplot.plot 绘制计算得到的灰度图像直方图。

    python 复制代码
    # 绘制计算得到的灰度图像直方图
    plt.plot(phone_hist)
    plt.show()

读取彩色图像:

  • 使用 cv2.imread 读取彩色图像。

    python 复制代码
    # 读取名为 "phone.png" 的彩色图像
    img = cv2.imread("phone.png")

定义颜色通道列表:

  • 定义一个包含蓝色、绿色和红色通道的列表。

    python 复制代码
    # 定义颜色通道的列表
    color = ('b', 'g', 'r')

计算并绘制彩色图像直方图:

  • 遍历每个颜色通道,使用 cv2.calcHist 计算每个通道的直方图,并将直方图分为256个区间。

  • 使用 matplotlib.pyplot.plot 绘制每个通道的直方图,并使用对应的颜色绘制。

    python 复制代码
    # 遍历每个颜色通道
    for i, col in enumerate(color):
        # 计算每个颜色通道的直方图
        # 直方图分为256个区间
        histr = cv2.calcHist([img], [i], None, [256], [0, 256])
        
        # 绘制每个颜色通道的直方图
        # 使用对应的颜色绘制
        plt.plot(histr, color=col)

显示彩色图像直方图:

  • 使用 matplotlib.pyplot.show 显示绘制的彩色图像直方图。

    python 复制代码
    # 显示绘制的彩色图像直方图
    plt.show()

完整代码

python 复制代码
import cv2
import matplotlib.pyplot as plt
import numpy as np

# 读取名为 "phone.png" 的图像,并将其转换为灰度图像
phone = cv2.imread("phone.png", cv2.IMREAD_GRAYSCALE)

# 将灰度图像的二维数组展平为一维数组
a = phone.ravel()

# 使用 matplotlib 绘制灰度图像的直方图
# bins=256 表示将直方图分为256个区间
plt.hist(a, bins=256)
plt.show()

# 使用 OpenCV 计算灰度图像的直方图
# 直方图分为16个区间
phone_hist = cv2.calcHist([phone], [0], None, [16], [0, 256])

# 绘制计算得到的灰度图像直方图
plt.plot(phone_hist)
plt.show()

# 读取名为 "phone.png" 的彩色图像
img = cv2.imread("phone.png")

# 定义颜色通道的列表
color = ('b', 'g', 'r')

# 遍历每个颜色通道
for i, col in enumerate(color):
    # 计算每个颜色通道的直方图
    # 直方图分为256个区间
    histr = cv2.calcHist([img], [i], None, [256], [0, 256])
    
    # 绘制每个颜色通道的直方图
    # 使用对应的颜色绘制
    plt.plot(histr, color=col)

# 显示绘制的彩色图像直方图
plt.show()

实验结果

相关推荐
拆房老料4 小时前
【第四部分:Agentic 智能体设计模式】16. 一个 Prompt 搞不定复杂任务?试试 Prompt Chaining
java·前端·人工智能·设计模式·prompt
运维行者_5 小时前
应用性能监控怎么选?从调用链到用户体验的五个能力维度
运维·服务器·数据库·人工智能·mysql·性能优化·应用性能监控
张张123y5 小时前
后端第十四课:Agent 记忆系统(让 Agent 记住上下文和用户,跨会话不健忘)
java·大数据·人工智能·python·agent·记忆
国科安芯9 小时前
四重证据,一条逻辑链:商业航天级微控制器MCU抗辐射验证方法学综述——以国科安芯AS32S601为例
人工智能·单片机·嵌入式硬件·mcu·安全·抗辐射
dk_tjy9 小时前
AI驱动的自动化攻击背景下:企业端点安全体系的技术架构与建设路径
网络·人工智能·安全·自动化·终端安全管理·数据防泄漏
dadaobusi9 小时前
学习: PCIe 6.0 的 L0p
学习
布吉岛的石头9 小时前
Java 程序员第 50 阶段2:预训练的目标函数:自回归语言建模本质
java·开发语言·人工智能·深度学习·回归·transformer
2601_9654542310 小时前
用AI把开源项目功能清单做成MG动画介绍视频
人工智能·开源·音视频
风雅GW10 小时前
局域网访问为何少一半配置页:DSH 的安全边界设计复盘
人工智能
衡石科技10 小时前
同一句业务问题,怎样持续问对数?衡石 ChatBI 的语义准备与回归验证
人工智能·数据挖掘·回归·chatbi