直方图
cv.calcHist(images, channels, mask, histSize, ranges)
images:它是uint8或float32类型的源图像。它应该放在方括号中,即“ [img]”。
channels:也以方括号给出。它是我们计算直方图的通道的索引。例如,如果输入为灰度图像,则其值为[0]。对于彩色图像,您可以传递[0],[1]或[2]分别计算蓝色,绿色或红色通道的直方图。
mask:遮罩图像。为了找到完整图像的直方图,将其指定为“无”。但是,如果要查找图像特定区域的直方图,则必须为此创建一个遮罩图像并将其作为遮罩。
histSize:这表示我们的BIN计数。需要放在方括号中。对于全尺寸,我们通过[256]。
![](https://i-blog.csdnimg.cn/blog_migrate/7f6e5cb14bcd0ddb88afffcfdc4d831f.jpeg)
啥是BIN
ranges:这是我们的RANGE。通常为[0,256]。
import cv2
import matplotlib.pyplot as plt
import numpy as np
def cv_show(name,image):
cv2.imshow(name,image)
cv2.waitKey()
cv2.destroyAllWindows()
img=cv2.imread('D:/BaiduNetdiskDownload/opencv/Astexia.jpg',0)
hist=cv2.calcHist([img],[0],None,[256],[0,256])
plt.hist(img.ravel(),256)#参数(直方图信息,BIN的数量)
plt.show()
#三色
color=('b','g','r')
for i,col in enumerate(color):
img1 = cv2.imread('D:/BaiduNetdiskDownload/opencv/girl.jpg')
histr = cv2.calcHist([img1],[i],None,[256],[0,256])
plt.plot(histr,color=col)
plt.xlim([0,256])
plt.show()
![](https://i-blog.csdnimg.cn/blog_migrate/1446a673367708dc03f99a71274a7fd3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bc3b57b7b9f3d0a7ad2d60b0a5e5dae1.png)
mask创建(即创建出除了中间为255,其他全为0的矩阵)
cv2.bitwise_and()是OpenCV中的一个函数,用于对两个图像进行按位与操作。它的参数含义如下:
src1:第一个输入图像。
src2:第二个输入图像。
mask:可选参数,用于指定操作的掩码图像。
dst:输出图像,与输入图像大小和类型相同。
#mask创建
mask=np.zeros(img.shape[:2],np.uint8)
mask[120:750,200:1800]=255
cv_show('mask',mask)
masked_img=cv2.bitwise_and(img,img,mask=mask)
cv_show('666',masked_img)
![](https://i-blog.csdnimg.cn/blog_migrate/c4b3c0ef0cc39460b550b8e00817ba90.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f0d0f872f038efc8aeaa10e6a20b2d9d.png)
均衡化
将直方图变得差不多一样高,变胖一点
![](https://i-blog.csdnimg.cn/blog_migrate/2f5491f22786f75cfbb42af19b1bf444.png)
累积概率即分布函数
![](https://i-blog.csdnimg.cn/blog_migrate/d708871a76de49a2ce60070e84caa98d.png)
equ=cv2.equalizeHist(img_boy)
#均衡化
img_boy=cv2.imread('D:/BaiduNetdiskDownload/opencv/boy.png',0)
plt.hist(img.ravel(),256)
equ=cv2.equalizeHist(img_boy)
plt.hist(equ.ravel(),256)
plt.show()
res=np.hstack((img_boy,equ))
cv_show("0",res)
![](https://i-blog.csdnimg.cn/blog_migrate/e0bb7e094ba031e1d934f07774d7ff7f.png)
自适应直方图均衡化
即分区域均衡化,全图统一均衡化可能会使某些位置过白/黑(如图2)
cv2.createCLAHA(clipLimit=8.0, titleGridSize=(8, 8))
参数1:clipLimit:颜色对比度的阈值(用来防止每一个区域之间割裂感严重)
参数2:titleGridSize:进行像素均衡化的网格大小,即在多少网格下进行直方图的均衡化操作
#自适应直方图均衡化
room=cv2.imread('D:/BaiduNetdiskDownload/opencv/room.png',0)
old_equ=cv2.equalizeHist(room)
a=cv2.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))
new_equ = a.apply(room)
res = np.hstack((room,old_equ,new_equ))
cv_show('111',res)
![](https://i-blog.csdnimg.cn/blog_migrate/7ad31b797aeec342a6bd73e4cd5679f8.png)