改变灰度图像直方图的均值和标准差
改变灰度图像直方图的均值和标准差
当我们有一张较暗淡的图像,我们想让图像变明亮;或者反过来,如果图像严重曝光,我们想让图像变暗。这时,我们可以采用什么方法呢?我们可以直接对图像的直方图进行操作,改变灰度图像直方图的均值和标准差。进而实现我们想要的效果。
算法如下式:其中m0和s0表示的是我们想要图像像素分布变成的均值和标准差,m和s是原图像的均值和标准差:
实验:通过上述算法实现对图像直方图的均值和标准差的改变
1 import cv2 2 import numpy as np 3 import matplotlib.pyplot as plt 4 5 # histogram manipulation 6 def hist_mani(img, m0=128, s0=52): 7 m = np.mean(img) 8 s = np.std(img) 9 10 out = img.copy() 11 12 # normalize 13 out = s0 / s * (out - m) + m0 14 out = np.clip(out,0,255) 15 out = out.astype(np.uint8) 16 17 return out 18 19 # Read image 20 img = cv2.imread("../head_g.jpg",0).astype(np.float) 21 out = hist_mani(img,m0=130,s0=60) 22 23 # Display histogram 24 plt.hist(out.ravel(), bins=255, rwidth=0.8, range=(0, 255)) 25 plt.savefig("out_his.png") 26 plt.show() 27 plt.hist(img.ravel(), bins=255, rwidth=0.8, range=(0, 255)) 28 plt.savefig("out_his_img.png") 29 plt.show() 30 # Save result 31 cv2.imshow("result", out) 32 cv2.imwrite("out.jpg", out) 33 34 cv2.waitKey(0) 35 cv2.destroyAllWindows()
实验结果:
可以看到,原图像是比较暗的,像素集中于靠近0的部分。我们通过增大图像直方图的均值和标准差,使得图像的像素值整体增大,由此增加了图像的亮度。如果你想要减小图像的亮度,则可以考虑采用与此相反的方法。
参考内容: