改變灰度圖像直方圖的均值和標准差


改變灰度圖像直方圖的均值和標准差

        當我們有一張較暗淡的圖像,我們想讓圖像變明亮;或者反過來,如果圖像嚴重曝光,我們想讓圖像變暗。這時,我們可以采用什么方法呢?我們可以直接對圖像的直方圖進行操作,改變灰度圖像直方圖的均值和標准差。進而實現我們想要的效果。

        算法如下式:其中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的部分。我們通過增大圖像直方圖的均值和標准差,使得圖像的像素值整體增大,由此增加了圖像的亮度。如果你想要減小圖像的亮度,則可以考慮采用與此相反的方法。


參考內容:

  https://www.jianshu.com/p/eae053c19f96


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM