opencv 直方图/ 均衡化

发布时间 2023-06-17 20:40:06作者: Aneverforget
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()