直方图(英语:Histogram)是一种对数据分布情况的图形表示,是一种二维统计图表,它的两个坐标分别是统计样本和该样本对应的某个属性的度量。把直方图上每个属性的计数除以所有属性的计数之和,就得到了归一化直方图。之所以叫“归一”,是因为归一化直方图的所有属性的计数之和为1,也就是说,每个属性对应计数都是0到1之间的一个数(百分比)。在图像处理中,直方图的横坐标为灰度级(0-255),纵坐标为每个灰度级的像素个数。
直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。
对比度是画面黑与白的比值,也就是从黑到白的渐变层次。比值越大,从黑到白的渐变层次就越多,从而色彩表现越丰富。对比度对视觉效果的影响非常关键,一般来说对比度越大,图像越清晰醒目,色彩也越鲜明艳丽;而对比度小,则会让整个画面都灰蒙蒙的。
高对比度对于图像的清晰度、细节表现、灰度层次表现都有很大帮助。在一些黑白反差较大的文本显示、CAD显示和黑白照片显示等方面,高对比度产品在黑白反差、清晰度、完整性等方面都具有优势。相对而言,在色彩层次方面,高对比度对图像的影响并不明显。
在直方图均衡化中我们需要将集中的像素分布分散开,使得图像更清晰醒目。
在直方图绘制时我们通过调用matplotlib的子库pyplot实现,在pyplot库中给我们定义了一个hist()函数
hist()函数中有两个参数:
第一个参数为数据源,此处的数据源必须为一维数组,可以通过通过函数ravel()进行降维处理。
第二个参数为间隔数,即绘制的直方图中X轴的划分个数
图片灰度像素直方图绘制参考代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
image = cv2.imread("coinss.png")
#cv2.imshow("if imread successfully",image)
#将图片转换为灰度图
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#直方图绘制
plt.hist(gray.ravel(), 256)
plt.show()
在opencv中为我们提供了直方图均衡化函数:cv2.equalizeHist(src, dst)
其中两个参数分别表示:
参数 | 参数意义 |
---|---|
src | 输入的灰度图像 |
dst | 输出直方图均衡化后的图像 |
直方图均衡化参考代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
image = cv2.imread("coinss.png")
#cv2.imshow("if imread successfully",image)
#将图片转换为灰度图
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#直方图绘制
gray1 = plt.hist(gray.ravel(), 256)
plt.show(gray1)
#应用直方图均衡化
dst = cv2.equalizeHist(gray)
#直方图绘制
gray2 = plt.hist(dst.ravel(), 256)
plt.show(gray2)
cv2.equalizeHist(src, dst)直方图均衡化会改变整个图像的对比度,但在cv2.createCLAHE(clipLimit, tileGridSize)中整幅图像会被分成很多小块,这些小块被称为 “tiles”(在 OpenCV 中 tiles 的大小默认是 8x8),然后再对每一个小块分别进行直方图均衡化(跟前面类似)。 所以在每一个的区域中,直方图会集中在某一个小的区域中(除非有噪声干扰)。如果有噪声的话,噪声会被放大。为了避免这种情况的出现要使用对比度限制。对于每个小块来说,如果直方图中的 bin 超过对比度的上限的话,就把其中的像素点均匀分散到其他 bins 中,然后在进行直方图均衡化。最后,为了去除每一个小块之间“人造的”(由于算法造成)边界,再使用双线性差值,对小块进行缝合。
cv2.createCLAHE(clipLimit, tileGridSize)中参数分别表示:
参数 | 参数意义 |
---|---|
clipLimit | 对比度限制的阈值 |
tileGridSize | 图像分割每块的尺寸,默认8x8 |
有限对比适应性直方图均衡化参考代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
image = cv2.imread("coinss.png")
#将图片转换为灰度图
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow("gray",gray)
#直方图绘制
gray1 = plt.hist(gray.ravel(), 256)
plt.show(gray1)
#应用直方图均衡化
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
dst = clahe.apply(gray)
cv2.imshow("gray1",dst)
#直方图绘制
gray2 = plt.hist(dst.ravel(), 256)
plt.show(gray2)
图片显示对比如下:
未均衡化处理之前的图片和灰度像素分布直方图如下:
有限对比适应性直方图均衡化处理后的图片和灰度像素分布直方图如下: