直方图从图像内部灰度级的角度对图像进行表述,从直方图的角度对图像进行处理,可以达到增强图像显示效果的目的
从统计的角度来说,直方图是图像内灰度值的统计特性与图像灰度值之间的函数,直方图统计图像内各个灰度级出现的次数。从直方图的图形上观察,横坐标是图像中各个像素点的灰度级,纵坐标是具有该灰度级(像素值)的像素个数。
例如:九个像素点,存在五个灰度级,x轴= [1,2,3,4,5] y轴=[3,1,2,1,2]
折线图和直方图,,这两种都是直方图。一般来说 x轴区间是[0,255] 对应8位位图的 256 个灰度级。不同图像属于不同灰度级的数量不一样。感觉跟PS 的那个色阶一样吧。。。
有时为了便于表示会采用归一化直方图,x轴仍然是灰度级,y轴表示灰度级出现的频率。 灰度级出现的次数 / 总像素数
opencv官网中提出来要注意的三个概念:
就是我们的 matplotlib.pyplot.hist((X,BINS)
啦,以前简单写过,,
o=cv2.imread("7.jpg")
plt.hist(o.ravel(),256) # plt.hist(o.ravel(),16) 划分成16组
hist = cv2.calcHist( images, channels, mask, histSize, ranges, accumulate )
如果一副图像拥有全部可能的灰度级,并且像素值的灰度均匀分布,那么这副图像就具有高对比度和多变的灰度色调,灰度级丰富且覆盖范围大,外观上具有丰富的色彩不会过亮或过暗。。。但还是灰度图。。。
直方图均衡化的目的是将原始图像的灰度级均匀的映射到整个灰度级范围内,得到一个灰度级分布均匀的图像。这种均衡化实现了灰度统计上的概率均衡,也实现了人类视觉系统 HVS 上的视觉均衡。例如
情况A ,均匀分布,情况B ,由于人眼无法区分一个像素值的差异,会将1,2,3灰度级看作一样的,后三个灰度级看作一组,所以化成两组,每组三个,也是均衡的。再均衡化处理中,是综合考虑统计概率和HVS 的均衡。
直方图均衡化的算法主要包括两个步骤:
例如:
再计算归一化统计直方图,然后累积获得
再累积直方图的基础上,对原有灰度级空间进行转换,可以再原有范围内对灰度级实现均衡化,也可以再更广泛的灰度空间范围实现均衡化
3. 再原有范围实现均衡化
就是用当前灰度级的累积概率乘以当前灰度级的最大值 7,得到新的灰度级,作为均衡化的结果。
原图灰度级1和2 经过均衡化调整为灰度级3,原图中灰度级1,2共有15个像素点,新灰度级3 就有15个像素点。同理构造新的灰度级
原图中,灰度级0-3 共像素点29个,4-7像素点20个,均衡化后灰度级0-3像素点 24个,4-7 25个。是不是更均衡化了。。
用当前灰度级的累积概率乘以更广范围灰度级的最大值获得新的灰度级作为均衡化结果。例如将灰度级扩展为 [0-255] 就要将原灰度级的累积概率乘以255.
很明显,原图灰度级集中再 [0-7] ,均衡化后范围大了那么多肯定更均匀了。
直方图均衡化使图像色彩更均衡、外观更清晰,也使图像更便于处理,它被广泛地应用在医学图像处理、车牌识别、人脸识别等领域。
dst = cv2.equalizeHist( src )
src是单通道原始图像
img=cv2.imread("7-2.jpg",0)
equ=cv2.equalizeHist(img)
cv2.imshow('equ',equ)
plt.figure("原始图像直方图")
plt.hist(img.ravel(),256)
plt.figure("均衡化结果直方图")
plt.hist(equ.ravel(),256)
cv2.waitKey()
cv2.destroyAllWindows()
别看处理后还是左低右高,右边明显变稀疏了,人眼会将相近的像素看作一个值,左边虽然单个灰度值的像素点数量少,但是密,相近的数量加起来跟右边是一样高的,,,聪明的你们一定可以理解的。
复习一下吧。。
matplotlib.pyplot.subplot(nrows, ncols, index) 添加一个子窗口,参数是行号,列好,窗口序号。序号从1开始。如果三个参数都小于10,可以省略逗号
matplotlib.pyplot.imshow(X, cmap=None) ,X为图像信息,可以是各种形式的值。cmap表示色彩空间默认RGB。注意正确的显示灰度图