当前位置: 首页 > news >正文

OpenCV(8):图像直方图

        在图像处理中,直方图是一种非常重要的工具,它可以帮助我们了解图像的像素分布情况。通过分析图像的直方图,我们可以进行图像增强、对比度调整、图像分割等操作。

1 什么是图像直方图?

        图像直方图是图像像素强度分布的图形表示,对于灰度图像,直方图显示了每个灰度级(0到255)在图像中出现的频率,对于彩色图像,我们可以分别计算每个通道(如R、G、B)的直方图。直方图可以帮助我们了解图像的亮度、对比度等信息。例如,如果直方图集中在低灰度区域,说明图像偏暗;如果直方图分布均匀,说明图像对比度较好。

  • 直方图: 表示图像中像素强度的分布情况,横轴表示像素强度值,纵轴表示该强度值的像素数量。
  • 灰度直方图: 针对灰度图像的直方图,表示每个灰度级的像素数量。
  • 颜色直方图: 针对彩色图像的直方图,分别表示每个颜色通道(如 BGR)的像素强度分布。
功能函数说明
计算直方图cv2.calcHist()计算图像的直方图。
直方图均衡化cv2.equalizeHist()增强图像的对比度。
直方图比较cv2.compareHist()比较两个直方图的相似度。
绘制直方图matplotlib.pyplot.plot()使用 Matplotlib 绘制直方图。

        直方图的应用 

  • 图像增强: 通过直方图均衡化,可以增强图像的对比度,使细节更加清晰。
  • 图像分割: 过分析直方图,可以确定阈值,用于图像分割。
  • 图像匹配: 通过比较直方图,可以判断两幅图像的相似度,用于图像匹配和检索。
  • 颜色分析: 通过颜色直方图,可以分析图像的颜色分布,用于颜色校正和风格化处理。

2 OpenCV 中的直方图计算函数

        在 OpenCV 中,我们可以使用 cv2.calcHist() 函数来计算图像的直方图。

cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
  • images: 输入的图像列表,通常是一个包含单通道或多通道图像的列表。例如 [img]
  • channels: 需要计算直方图的通道索引。对于灰度图像,使用 [0];对于彩色图像,可以使用 [0][1][2] 分别计算蓝色、绿色和红色通道的直方图。
  • mask: 掩码图像。如果指定了掩码,则只计算掩码区域内的像素。如果不需要掩码,可以传入 None
  • histSize: 直方图的 bin 数量。对于灰度图像,通常设置为 [256],表示将灰度级分为 256 个 bin。
  • ranges: 像素值的范围。对于灰度图像,通常设置为 [0, 256],表示像素值的范围是 0 到 255。
  • hist: 输出的直方图数组。
  • accumulate: 是否累积直方图。如果设置为 True,则直方图不会被清零,而是在每次调用时累积。

        假设我们有一张灰度图像 img,我们可以使用以下代码计算其直方图:

import cv2
import matplotlib.pyplot as plt

# 读取图像
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 计算直方图
hist = cv2.calcHist([img], [0], None, [256], [0, 256])

# 绘制直方图
plt.plot(hist)
plt.title('Grayscale Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')
plt.show()

3 直方图均衡化

        直方图均衡化是一种增强图像对比度的方法,通过重新分配像素强度值,使直方图更加均匀。

equalized_image = cv2.equalizeHist(image)
import cv2

# 读取图像
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 直方图均衡化
equalized_image = cv2.equalizeHist(img)

# 显示结果
cv2.imshow("Equalized Image", equalized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

4 颜色直方图

        对于彩色图像,可以分别计算每个颜色通道的直方图。

import cv2
from matplotlib import pyplot as plt

# 读取图像
img = cv2.imread('image.jpg')

# 计算 BGR 各通道的直方图
colors = ('b', 'g', 'r')
for i, color in enumerate(colors):
    hist = cv2.calcHist([img], [i], None, [256], [0, 256])
    plt.plot(hist, color=color)

# 绘制直方图
plt.title("Color Histogram")
plt.xlabel("Pixel Intensity")
plt.ylabel("Pixel Count")
plt.show()

        对于彩色图像,可以对每个通道分别进行直方图均衡化。

import cv2

# 读取图像
img = cv2.imread('image.jpg')

# 分离通道
b, g, r = cv2.split(img)

# 对每个通道进行直方图均衡化
b_eq = cv2.equalizeHist(b)
g_eq = cv2.equalizeHist(g)
r_eq = cv2.equalizeHist(r)

# 合并通道
equalized_image = cv2.merge([b_eq, g_eq, r_eq])

# 显示结果
cv2.imshow("Equalized Color Image", equalized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

5 直方图比较

        OpenCV 提供了 cv2.compareHist() 函数,用于比较两个直方图的相似度。

similarity = cv2.compareHist(hist1, hist2, method)
  • hist1: 第一个直方图。
  • hist2: 第二个直方图。
  • method: 比较方法,例如 cv2.HISTCMP_CORREL(相关性比较)。
import cv2

# 读取图像
img = cv2.imread('image.jpg', 0)
image2 = cv2.imread('bird.jpg', 0)

# 计算两个图像的直方图
hist1 = cv2.calcHist([img], [0], None, [256], [0, 256])
hist2 = cv2.calcHist([image2], [0], None, [256], [0, 256])

# 比较直方图
similarity = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)
print("Histogram Similarity:", similarity)

http://www.dtcms.com/a/35880.html

相关文章:

  • 【备赛】在keil5里面创建新文件的方法+添加lcd驱动
  • https和http有什么区别
  • VMware 与 CentOS 安装指南
  • Spring Core面试题
  • P1038 [NOIP 2003 提高组] 神经网络
  • 数据结构——静态顺序表,动态顺序表
  • 三维重建_点云重建方法及开源框架推荐
  • 基于 IMX6ULL 的环境监测自主调控系统
  • 网络安全-php安全知识点
  • 下载安装umamba教程使用命令
  • 2024 nginx已知 sztu.edu.cn.key和sztu.edu.cn.pem配置ssl
  • AIGC技术助力空军招飞,近屿智能开启智能人才培育新征程
  • Docker 搭建 Nginx 服务器
  • w227springboot旅游管理系统设计与实现
  • leetcode刷题记录(一百一十八)——39. 组合总和
  • clickhouse--本地表和分布式表,副本机制,分片集群
  • c++ 典型练习题
  • MongoDB 查询文档
  • Python解决“数字分组求偶数和”问题
  • 如何实现网关
  • 课程分享 | 安全系统建设的挑战与解决方案
  • 【DeepSeek】CherryStudio + Ollama
  • FreiHAND (handposeX-json 格式)数据集-release >> DataBall
  • Springboot 熔断,穿透,雪崩
  • 网络安全-新型路径攻击流程及防御措施
  • 【论文精读】YOLO-World:实时开放词汇目标检测
  • 【无人集群系列---无人机集群编队算法】
  • Qt中C++与QML交互从原理、方法与实践陷阱深度解析
  • List的模拟实现(2)
  • 远程部署 Qt 应用程序套件错误原因