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

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

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

        算法如下式:其中m0和s0表示的是我们想要图像像素分布变成的均值和标准差,m和s是原图像的均值和标准差:

改变图像直方图的均值和标准差公式 ↑


实验:通过上述算法实现对图像直方图的均值和标准差的改变

import cv2
import numpy as np
import matplotlib.pyplot as plt

# histogram manipulation
def hist_mani(img, m0=128, s0=52):
	m = np.mean(img)
	s = np.std(img)

	out = img.copy()

	# normalize
	out = s0 / s * (out - m) + m0
	out = np.clip(out,0,255)
	out = out.astype(np.uint8)

	return out

# Read image
img = cv2.imread("../head_g.jpg",0).astype(np.float)
out = hist_mani(img,m0=130,s0=60)

# Display histogram
plt.hist(out.ravel(), bins=255, rwidth=0.8, range=(0, 255))
plt.savefig("out_his.png")
plt.show()
plt.hist(img.ravel(), bins=255, rwidth=0.8, range=(0, 255))
plt.savefig("out_his_img.png")
plt.show()
# Save result
cv2.imshow("result", out)
cv2.imwrite("out.jpg", out)

cv2.waitKey(0)
cv2.destroyAllWindows()


实验结果:

原图像的像素分布 ↑

修改直方图的均值和标准差后图像的像素分布 ↑

 

原图 ↑

改变直方图均值和标准差之后的图像 ↑

        可以看到,原图像是比较暗的,像素集中于靠近0的部分。我们通过增大图像直方图的均值和标准差,使得图像的像素值整体增大,由此增加了图像的亮度。如果你想要减小图像的亮度,则可以考虑采用与此相反的方法。


参考内容:

        https://www.cnblogs.com/wojianxin/p/12509911.html

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

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值