zoukankan      html  css  js  c++  java
  • 改变灰度图像直方图的均值和标准差

    改变灰度图像直方图的均值和标准差

            当我们有一张较暗淡的图像,我们想让图像变明亮;或者反过来,如果图像严重曝光,我们想让图像变暗。这时,我们可以采用什么方法呢?我们可以直接对图像的直方图进行操作,改变灰度图像直方图的均值和标准差。进而实现我们想要的效果。

            算法如下式:其中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

  • 相关阅读:
    聊天ListView
    Android笔试题三
    java内存分配与垃圾回收
    Activity切换的时候生命周期的变化
    二分查找
    如何用报表工具实现树状层级结构的填报表
    报表数据填报中的自动计算
    报表数据填报中的合法性校验
    tab 页形式展现多张报表
    报表工具之数据校验竟可以如此简单
  • 原文地址:https://www.cnblogs.com/wojianxin/p/12509911.html
Copyright © 2011-2022 走看看