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

OpenCV进阶操作:图像直方图、直方图均衡化

文章目录

  • 一、图像直方图
  • 二、图像直方图的作用
  • 三、使用matplotlib方法绘制直方图
    • 2.使用opencv的方法绘制直方图(划分16个小的子亮度区间)
    • 3、绘制彩色图像的直方图
  • 四、直方图均衡化
    • 1、绘制原图的直方图
    • 2、绘制经过直方图均衡化后的图片的直方图
    • 3、自适应直方图均衡化
      • 1)概念
      • 2)步骤
      • 3)代码实现


一、图像直方图

图像直方图是描述图像像素值分布情况的统计图形。它表示了图像中不同像素值的数量或频率。
在这里插入图片描述

在图像直方图中,横轴表示像素值的范围,通常为0-255,纵轴表示像素值的数量或频率。直方图的每一个条柱代表某个像素值范围内像素的数量或频率。例如,柱子的高度表示图像中具有该像素值的像素的数量或出现的频率。
在这里插入图片描述
在这里插入图片描述

二、图像直方图的作用

  • 分析图像的亮度分布
    通过直方图可以了解图像中不同亮度值的像素数量,从而判断图像的亮度分布情况。例如,如果直方图中灰度级别集中在低亮度区域,说明图像较暗;如果直方图分布在高亮度区域,则说明图像较亮。

  • 判断图像的对比度
    直方图的宽度反映了图像的对比度。直方图宽度越大,表示图像中像素值分布越分散,对比度越高;相反,直方图宽度越窄,表示图像中像素值分布越集中,对比度越低。

  • 检测图像的亮度和色彩偏移
    通过比较不同颜色通道的直方图,可以判断图像是否存在亮度或色彩偏移。例如,如果红色通道的直方图偏向左侧,则说明图像偏向较暗的红色,存在亮度偏移。

  • 图像增强和调整
    通过分析直方图,可以根据图像的特点进行增强和调整。例如,可以通过直方图均衡化来增强图像的对比度;可以通过直方图匹配来调整图像的色彩和亮度分布。

  • 阈值分割
    直方图可以用于确定图像的阈值,用于分割图像中的目标物体和背景。通过直方图的谷底或者双峰可以确定一个适合的阈值值,将图像分成两个部分。

三、使用matplotlib方法绘制直方图

img =cv2.imread('../data/310.jpg',cv2.IMREAD_GRAYSCALE)# 转成一维
a=img.ravel()# 使用 matplotlib 的 hist 函数绘制直方图。
plt.hist(a,bins=256)
plt.show()# 参数解释:
# - a:一维数组,即图像的像素值组成的数组。
# - bins=256:指定直方图的条数,即灰度级的数量。

在这里插入图片描述

2.使用opencv的方法绘制直方图(划分16个小的子亮度区间)

#这里的calcHist参数在上面有介绍,这里是对img图片做直方图统计,采用灰度图,即零通道,未设置掩膜,划分为16个区间,亮度值统计[0,256]的值
phone_hist = cv2.calcHist([img],[0],None,[16],[0,256])
plt.plot(phone_hist)#使用calcHist的值绘制曲线图
plt.show()

统计的值为每个亮度区间内属于该亮度值的像素点个数。
在这里插入图片描述

3、绘制彩色图像的直方图

img=cv2.imread('zl.jpg')
color=('b','g','r')    #设置绘制的折线图每条线的颜色
for i,col in enumerate(color):    #依次遍历三个颜色通道histr=cv2.calcHist([img],[i],None,[256],[0,256])    #依次计算每个通道的直方图值plt.plot(histr,color=col)    #绘制折线图
plt.show()

分别统计了不同颜色通道下的直方图
在这里插入图片描述

四、直方图均衡化

直方图均衡化:直方图均衡化是一种图像增强技术,它可以通过增加图像的对比度和亮度来改善图像的质量。直方图均衡化通过将图像的像素值分布均匀化来实现这一目标。
在这里插入图片描述

在Python OpenCV中,可以使用cv2.equalizeHist()函数来实现直方图均衡化。该函数将输入图像转换为灰度图像,并将其像素值分布均匀化,从而增强图像的对比度和亮度。下面是将不均衡的直方图均衡化之后的结果。

1、绘制原图的直方图

woman = cv2.imread('ja.jpg',cv2.IMREAD_GRAYSCALE)
# # # phone_hist = cv2.calcHist([phone],[0],None,[256],[0,256])
plt.hist(woman.ravel(), bins=256)#numpy中的ravel将数组多维度拉成一维数组
plt.show()

在这里插入图片描述

2、绘制经过直方图均衡化后的图片的直方图

phone_equalize = cv2.equalizeHist(woman)
plt.hist(phone_equalize.ravel(), bins=256)#numpy中的ravel将数组多维度拉成一维数组
plt.show()

在这里插入图片描述
在这里插入图片描述

3、自适应直方图均衡化

1)概念

传统的直方图均衡化方法是将整个图像的直方图变成均匀分布,但在某些情况下,图像的局部区域可能存在过亮或过暗的问题。自适应直方图均衡化通过将图像分成多个小的局部区域,并对每个局部区域进行直方图均衡化,从而避免了全局均衡化带来的问题。

2)步骤

  • 将图像分成多个不重叠的小块,每个小块称为一个局部区域。
  • 对每个局部区域进行直方图均衡化,得到均衡化后的局部区域。
  • 将均衡化后的局部区域重新拼合,得到最终的均衡化图像。

3)代码实现

(接上面代码)

clahe = cv2.createCLAHE(clipLimit=1,tileGridSize=(16,16))   # 通过类创建了一个均衡化对象
# clipLimit表示对比度的限制,tileGridSize表示图像均匀划分的小块大小
phone_clahe = clahe.apply(phone)  # 将均衡化对象应用到图片phone上得到均衡化处理后的图片phone_clahe
res = np.hstack((phone,phone_equalize,phone_clahe))  # 将原图、直方图均衡化后的图像、自适应直方图均衡化后的图像,水平方向合并
cv2.imshow("phone_equalize",res)
cv2.waitKey(0)

在这里插入图片描述


相关文章:

  • 【最新Python包管理工具UV的介绍和安装】
  • yolov11 epoch100轮 训练笔记5 kaggle comet
  • HarmonyOS Device Connector(hdc)
  • 基于 HTML 和 CSS 实现的 3D 翻转卡片效果
  • 数据存储——高级存储之PV和PVC
  • 力扣面试150题-- 翻转二叉树
  • ThreadLocal源码深度剖析:内存管理与哈希机制
  • GisWeb实战笔记(1)基于 Vue 3 + Vite + CesiumJS搭建gis开发环境
  • 深入探索Anthropic Claude与Spring AI的融合应用
  • 【STM32单片机】#13 RTC实时时钟
  • 分析strtol(),strtoul()和strtod()三个函数的功能
  • 从网页到桌面:将 Web 应用无缝迁移为 Electron 桌面程序
  • 电赛经验分享——模块篇
  • 定积分的定义式(黎曼和极限定义)
  • 协议(消息)生成
  • STA中的multi_cycle 和false_path详细讨论
  • 从Rtos到Linux:学习的策略
  • Dify框架面试内容整理-如何评估基于Dify开发的AI应用的效果?
  • 【Vue】Vue3源码解析与实现原理
  • 基于muduo库实现高并发服务器
  • 中国证监会:帮助受关税政策影响较大的上市公司纾困解难
  • 金融监管总局将推出8项增量政策:涉房地产金融、险资入市、稳外贸等
  • 同为“东部重要中心城市”后交出首份季报:宁杭苏表现如何?
  • 韩正出席庆祝中国欧盟建交50周年招待会并致辞
  • 市场监管总局通报民用“三表”专项检查结果
  • 老人误操作免密支付买几百只鸡崽,经济日报:支付要便捷也要安全