欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > OpenCV进阶操作:图像直方图、直方图均衡化

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

2025/5/6 7:39:29 来源:https://blog.csdn.net/m0_65065095/article/details/147722852  浏览:    关键词: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)

在这里插入图片描述


版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词