
如图所示: 我们可以看到直方图的左侧区域显示图中较暗像素的数量,而右侧区域显示图中较亮像素的数量. (当然,此直方图是针对灰度图像绘制的)
在Opencv中搜索,绘制和分析图像直方图:
我们使用cv2.calcHist()查找直方图:
1.cat = cv2.imread(cat.jpg, 0) # 此处0为读取该图像灰度图的意思
2.cv_show(cat, cat)

在Opencv中调用calcHist()函数可以实现图像像素直方图的绘制
calcHist(img, channels, mask, histSize, ranges[, hist [, accumulate]])
·参数说明:
1.hist = cv2.calcHist([cat], [0], None, [256], [0, 256])
2.plt.hist(cat.ravel(), 256)
3.plt.show()


(我们可以清楚地看到猫的灰度图像中有很多明亮的像素,因此直方图右侧显示的像素数量很大. )
我们还可以使用Numpy中的np.histogram()函数来计算图像的直方图:
1.hist,bins = np.histogram(img.ravel(),256,[0,256])
但是Numpy中bin的值将有257个元素,因为Numpy计算出bin的范围为0-0.99、1-1.99、2-2.99等局部直方图均衡化opencv2,因此最终范围是255-255.99. 为了说明这一点,Numpy在末尾添加了256.
但是值得注意的是,opencv函数比np.histogram()快40倍. 因此,我们尽可能使用opencv函数.
使用matplotlib绘制三通道直方图:
1.cat = cv2.imread(cat.jpg)
2.cv_show(cat, cat)

输出三个通道的像素直方图:
1.color = (b, g, r)
2.for i, col in enumerate(color):
3. histr = cv2.calcHist([cat], [i], None, [256], [0, 256])
4. plt.plot(histr, color=col)
5. plt.xlim([0, 256])
6.plt.show()


蒙版操作:
图像的遮罩操作是指通过遮罩内核运算符重新计算图像中每个像素的值. 遮罩内核运算符描述了场像素对新像素的影响程度,并且根据遮罩运算符Point加权平均值对像素进行加权. 图像遮罩操作通常用于图像平滑局部直方图均衡化opencv2,边缘检测和特征分析等领域.
1.mask = np.zeros(cat.shape[:2], np.uint8) # 创建掩码
2.mask[100:300, 100:400] = 255
3.
4.mask_cat = cv2.bitwise_and(cat, cat, mask=mask) # 掩码和图片合并
5.cv_show(mask_cat, mask_cat)

绘制遮罩操作后图像的直方图:
1.cat_mask = cv2.calcHist([cat], [0], mask, [256], [0, 256])
2.plt.plot(cat_mask)
3.plt.show() # 可发现直方图的y轴值变小

直方图均衡化
考虑到图像,其像素值被限制在特定的值范围内. 例如,较亮的图像会将所有像素限制为较高的值. 但是,好的图像将具有图像所有区域的像素. 因此,您需要将直方图拉伸到两端,这是直方图均衡化的功能(简单来说). 通常可以改善图像的对比度.


获取图像和原始像素直方图:
1.clahe = cv2.imread(clahe.jpg, 0)
2.hist = cv2.calcHist([clahe], [0], None, [256], [0, 256])
3.plt.hist(clahe.ravel(), 256)
4.plt.show()
5.cv_show(1, clahe)


(我们可以看到,由于图像较暗,直方图位于较暗的区域,因此我们需要全光谱. 为此,我们需要一个转换函数,将暗区域中的输入像素映射到输出像素在整个区域中. 是直方图均衡化的功能
要进行均衡,请调用equalizeHist()函数:
1.equ = cv2.equalizeHist(clahe)
2.plt.hist(equ.ravel(), 256)
3.plt.show()
4.cv_show(2, equ)



(经过均衡后,我们可以看到直方图的明亮区域也具有值,并且直方图的整体变化是平均的,因此我们使所有图像具有相同的照明条件. 此操作非常例如在面部识别中,在训练面部数据之前,先对面部图像进行均衡处理,以使其具有相同的照明条件. )
应注意,我们背景的对比度得到了改善. 但是,对于当前图像,我们可以直观地看到在均衡后,图像雕塑的面部太亮,并且在那里我们失去了很多信息. 这是因为在直方图覆盖强度变化较大的较大区域(即,既有亮像素又有暗像素)的情况下效果不佳.
为解决此问题,我们使用自适应直方图均衡. 此时,图像被分成称为“瓷砖”的小瓷砖. 在OpenCV中,默认大小为8x8. 然后,每个小块被均衡,就好像它是均衡操作一样. 因此,在较小的区域内,直方图将被限制在较小的区域内(除非存在噪声). 如果有噪音,它将被放大. 为避免这种情况,将应用对比度限制. 如果任何直方图bin超出指定的对比度限制(在OpenCV中默认为40),则在应用直方图均衡之前,这些像素将被裁剪并均匀地分布到其他bin中. 均衡后,要消除块边界中的伪影,请应用双线性插值.
1.clahe1 = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
2.clahe2 = clahe1.apply(clahe)
3.hist1 = cv2.calcHist([clahe2], [0], None, [256], [0, 256])
4.plt.hist(clahe2.ravel(), 256)
plt.show()

(处理后的直方图由于限制了平衡对比度的属性,使直方图分布在明暗区域. 此处理方法有效地确保了明暗图像之间对比度较大的区域中的信息不会丢失)<
最后分别显示效果图:

此外,CLAHE主要用于克服AHE的放大噪声过大的问题. 而AHE是自适应直方图均衡(Adaptive histgram equalization)
自适应直方图均衡化(AHE): 一种计算机图像处理技术,用于增加图像的对比度. 与普通的直方图均衡算法不同,AHE算法通过计算图像的局部直方图然后重新分配亮度来更改图像对比度. 因此,该算法更适合于提高图像的局部对比度并获得更多的图像细节.
但是,AHE的问题是在图像的相同区域过度放大了噪声. 另一种自适应直方图均衡算法,即有限对比度直方图均衡(CLAHE)算法,可以限制这种不利的放大.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-189368-1.html
美国对伊拉克有领导权
前提是男性的颜值身材要过关
没成功即使说的是真理