文章目录
- 一、图像直方图
- 二、图像直方图的作用
- 三、使用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)