1、直方图:对灰度图像中的各像素值得个数的统计
cv.calcHist(sec,channels,mask,histSize,ranges)
src:原图像格式为uint8或float32,当传入图函数时应用中括号[]括起来,例如[src]
channels:同样用中括号括起来,如果传入图像是灰度图,它的值就是[0],如果是彩色图,则传入[0][1][2]分别对应着BGR
mask:掩模图像,统计整副图像的直方图将其置为None,如果只统计图像的一部分直方图时需要制作一个掩模
histSize:BIN的数目,也应该用中括号括起来
ranges:像素范围常为[0,256]
灰度图像直方图:
src=cv.imread("E:\OpenCVTests\Samples\sample\The Eighth notebook\cat.jpg",0)#0表示灰度图像
hist=cv.calcHist([src],[0],None,[256],[0,256])
plt.hist(src.ravel(),256)
plt.show()
**彩色图像二值图:**分通道展示
src=cv.imread("E:\OpenCVTests\Samples\sample\cat.jpg")
color=['b','g','r']
for i,col in enumerate(color):
histr=cv.calcHist([src],[i],None,[256],[0,255])
plt.plot(hist,color=col)
plt.xlim([0,256])
**2、**掩码(mask)操作:相当于对图像进行截取,掩码部分为255,其它部分为黑色,与原始图形结合后,就只显示图像与掩码重合的部分
分别为原图、掩码图、掩码图应用于原图之后、掩模图部分的直方图
mask=np.zeros(src.shape[:2],np.uint8)#第一个参数,刚好创建与原始图像一样大小的形状,所以为src.shape[:2];uint8,无符号整型,刚好表示0-255的范围
mask[100:300,100:400]=255#默认要求,指定mask在图像上的范围,mask为白色,其它部分为黑色
histr = cv.calcHist([src], [i], mask, [256], [0, 255])#将mask应用到原图上,则只会显示mask区域对应的直方图
3、cv.equalizeHist()直方图均衡化
原始图像直方图结果:
预期直方图结果:
处理方法:统计各个灰度值点的个数------>求取每个像素点出现的概率------>计算出累积概率------>用累积概率与总的像素点范围相乘------>结果为新的灰度值,详见下表
def equalHistDemo(image):#直方图均衡化作用:增强图像的对比度,黑色背景大米的例子----自适应均衡化
gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)#直方图均衡化必须是针对灰度级的图像的,因此需转化图像的色彩空间
dst=cv.equalizeHist(gray)
cv.imshow("equalize",dst)
4、cv.createCLAHE()自适应直方图均衡化:对图像进行分块均衡化,以保留图像各个部分各自的特征
如下图,图像各个区域的差值明显,不适合做统一的均衡化
结果:
def claheDemo(image):#直方图部分均衡化,即对均衡化的参数可调节----自定义均衡化
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
clahe=cv.createCLAHE(clipLimit=3.0,tileGridSize=(8,8))#clipLimit该参数控制均衡化的程度
dst=clahe.apply(gray)
cv.imshow("clahe",dst)