OpenCV学习-P29-P32 Opencv直方图均衡化及掩膜
1 直方图
直方图原理:统计图像各个灰度区间的像素数
cv2.calcHist([img],[0],None,[256],[0,256])
[0]表示通道,[256]表示bin个数,[0,256]表示灰度值取值范围,参数需要加[]
img= cv2.imread(r'.\\20220822162647.jpg',0)
histr=cv2.calcHist([img],[0],None,[256],[0,256])
plt.figure(figsize=(10,6),dpi=100)
plt.plot(histr)
plt.show()
如果需要提取图像某部分直方图,可以给calcHist添加掩膜
img= cv2.imread(r'.\\20220822162647.jpg',0)
mask=np.zeros(img.shape[:2],np.uint8)
mask[200:250,100:300]=255
masked_img=cv2.bitwise_and(img,img,mask=mask)
histr=cv2.calcHist([img],[0],None,[6],[0,256])
fig,axes=plt.subplots(nrows=2,ncols=2,figsize=(10,8))
axes[0,0].imshow(img)
axes[0,0].set_title("原图")
axes[0,1].imshow(mask)
axes[0,1].set_title("蒙版数据")
axes[1,0].imshow(masked_img)
axes[1,0].set_title("掩膜后数据")
axes[1,1].plot(histr)
axes[1,1].set_title("灰度直方图")
axes[1,1].grid()
plt.rcParams['font.sans-serif']=['SimHei']
plt.show()
2 直方图均衡化
直方图均衡化可提高图像整体对比度,在曝光过度或不足的图像中可以更好的突出细节
3 直方图自适应均衡化
dst=cv.equalizeHist(img)
自适应直方图均衡化:全局直方图均衡化后,可能会丢失部分细节信息,如下图人脸原来是清晰的,均衡化后太亮就不清晰了,所以需要将图像分为很多小块(称为tiles,在opencv中默认为8*8),对每个小块进行直方图均衡化,