就是把各个像素值所含有的个数统计出来,然后画图表示。可以看到在当前图像中,哪个像素值的个数最多。同时,可以看当前图像总体的像素值大小在哪些范围。。靠近0的话,说明图像偏暗。靠近255,说明图像偏亮。
importcv2importnumpyasnpimportmatplotlib.pyplotaspltimportmath##绘制灰度直方图defcalcGrayHist(image):'''统计像素值:paramimage::return:'''#灰度图像的高,宽rows,cols=image.shape#存储灰度直方图grayHist=np.zeros([256],np.uint64)forrinrange(rows):forcinrange(cols):grayHist[image[r][c]]+=1returngrayHistimage=cv2.imread('p2.jpg',cv2.IMREAD_GRAYSCALE)grayHist=calcGrayHist(image)#采用matplotlib进行画图x_range=range(256)plt.plot(x_range,grayHist,'r',linewidth=2,c='black')plt.show()输出结果:
总的来说,还是偏暗。像素值几种在40到50之间。
Python实现
#通过线性变化增强对比度in_image=cv2.imread('p2.jpg',cv2.IMREAD_GRAYSCALE)a=2out_image=float(a)*in_image#进行数据截断,大于255的值要截断为255out_image[out_image>255]=255#数据类型转化out_image=np.round(out_image)out_image=out_image.astype(np.uint8)#显示原图像和线性变化后的结果cv2.imshow('IN',in_image)cv2.imshow('OUT',out_image)cv2.waitKey(0)cv2.destroyAllWindows()输出结果:
Python代码实现:
#通过直方图正规化增强对比度in_image=cv2.imread('p2.jpg',cv2.IMREAD_GRAYSCALE)#求输入图片像素最大值和最小值Imax=np.max(in_image)Imin=np.min(in_image)#要输出的最小灰度级和最大灰度级Omin,Omax=0,255#计算a和b的值a=float(Omax-Omin)/(Imax-Imin)b=Omin-a*Imin#矩阵的线性变化out_image=a*in_image+b#数据类型的转化out_image=out_image.astype(np.uint8)#显示原图和直方图正规化的效果cv2.imshow('IN',in_image)cv2.imshow('OUT',out_image)cv2.waitKey(0)cv2.destroyAllWindows()输出结果:
python实现:
#伽马变换增强对比度in_image=cv2.imread('p2.jpg',cv2.IMREAD_GRAYSCALE)#图像归一化fI=in_image/255.0#伽马变化gamma=0.5out_image=np.power(fI,gamma)#显示原图和伽马变化后的效果cv2.imshow('IN',in_image)cv2.imshow('OUT',out_image)cv2.waitKey(0)cv2.destroyAllWindows()结果输出:
Python代码:
#限制对比度的自适应直方图均衡化image=cv2.imread('p2.jpg',cv2.IMREAD_GRAYSCALE)#创建ClAHE对象clahe=cv2.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))#限制对比度的自适应阈值均衡化dst=clahe.apply(image)#显示cv2.imshow('src',image)cv2.imshow('dst',dst)cv2.waitKey(0)cv2.destroyAllWindows()