opencv 直方图/ 均衡化
Posted Aneverforget
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv 直方图/ 均衡化相关的知识,希望对你有一定的参考价值。
import cv2 import numpy as np import matplotlib.pyplot as plt #若是画图像plt是RGB的与cv2不同 img=cv2.imread(\'C:/Users/59925/Desktop/pytest/pics/eye.jpg\')#把图片读取成灰度图minions-s template=cv2.imread(\'C:/Users/59925/Desktop/pytest/pics/eye.jpg\')#把图片读取成灰度图 #统计直方图。通过012选择BGR通道,None,不选择图片掩码,横坐标bins(位数)为256组,[0,256]像素值范围 plt.hist(img.ravel(),256)#把3维原图降成一维 256表示直方图的箱数 #plt.title(\'img.ravel\') #plt.show() #生成BGR不同通道的直方图 color=[\'b\',\'g\',\'r\'] plt.figure() plt.xlim([0,256]) plt.title(\'gbr\') for i,col in enumerate(color): histo=cv2.calcHist([img],[i],None,[256],[0,256]) plt.plot(histo,color=col) #calcHist()的mask #创建mask mask=np.zeros(img.shape[:2],np.uint8) mask[50:100,100:150]=255 cv2.imshow(\'mask\',mask) cv2.waitKey(0) cv2.destroyAllWindows() img_masked=cv2.bitwise_and(img,img,mask=mask) cv2.imshow(\'img_masked\',img_masked) cv2.waitKey(0) cv2.destroyAllWindows() #对比有mask和没mask的直方图 plt.figure() plt.title(\'mask and not\') histo=cv2.calcHist([img],[0],mask,[256],[0,256]) plt.plot(histo) histo=cv2.calcHist([img_masked],[i],None,[256],[0,256]) plt.plot(histo)
三维原图降成一维后展开结果:
把不同通道计算直方图,并plot.
color=[\'b\',\'g\',\'r\']
plt.figure()
plt.xlim([0,256])
plt.title(\'gbr\')
for i,col in enumerate(color):
histo=cv2.calcHist([img],[i],None,[256],[0,256])
plt.plot(histo,color=col)
mask
x.flatten()#返回拷贝
x.ravel()#返回视图(散开)
直方图均衡化后
#直方图用于均衡化
#把瘦高直方图,转化成矮胖直方图。映射函数:取整(累计概率*255)为该灰度值累计概率的新的灰度值
import cv2 import numpy as np import matplotlib.pyplot as plt #若是画图像plt是RGB的与cv2不同 img=cv2.imread(\'C:/Users/59925/Desktop/pytest/pics/minions-s.jpg\',0)#把图片读取成灰度图minions-s equ=cv2.equalizeHist(img) plt.figure() plt.hist(equ.ravel(),color=\'r\') plt.hist(img.ravel(),color=\'g\') res=np.hstack((img,equ)) cv2.imshow(\'res\',res) cv2.waitKey(0) cv2.destroyAllWindows()
均衡化会更亮一些,但会丧失一些细节——采用局部(分格)均衡化的方法——但如果局部做,噪音产生的影响变大。而且格子之间的分解会很明显。
所以需要根据图片恒量。
opencv提供自适应均衡化,并对格子之间的边界做些优化处理。
以上是关于opencv 直方图/ 均衡化的主要内容,如果未能解决你的问题,请参考以下文章