最近这几问。。。无脑操作。
直方图平坦化
让直方图的平均值 m 0 = 128 m_0=128 m0=128,标准差 s 0 = 52 s_0=52 s0=52吧!
这里并不是变更直方图的动态范围,而是让直方图变得平坦。
可以使用下式将平均值为
m
m
m标准差为
s
s
s的直方图变成平均值为
m
0
m_0
m0标准差为
s
0
s_0
s0的直方图:
x
o
u
t
=
s
0
s
(
x
i
n
−
m
)
+
m
0
x_{out}=\frac{s_0}{s}\ (x_{in}-m)+m_0
xout=ss0 (xin−m)+m0
代码实现
import numpy as np
import matplotlib.pyplot as plt
from skimage.io import imread # 用来读取图片
%matplotlib inline
# 读取图片
path = 'C:/Users/86187/Desktop/image/'
file_in = path + 'cake.jpg'
img = imread(file_in)
plt.figure
imgshow = plt.imshow(img)
# 灰度化
# 灰度化函数
def BGR2GRAY(img):
# 获取图片尺寸
H, W, C = img.shape
# 灰度化
out = np.ones((H,W,3))
for i in range(H):
for j in range(W):
out[i,j,:] = 0.299*img[i,j,0] + 0.578*img[i,j,1] + 0.114*img[i,j,2]
out = out.astype(np.uint8)
return out
img = BGR2GRAY(img)
plt.figure
imgshow = plt.imshow(img)
img_ = img.copy()
img_ = img_.reshape(-1)
hist = plt.hist(img_, bins=255, rwidth=0.85, range=(0,255))
def evenHist(img,m0,s0):
m = img.mean()
s = np.sqrt(img.var())
img = (s0/s)*(img-m)+m0
img = img.astype(np.uint8)
return img
img2 = img.copy()
img2 = evenHist(img2,128,52)
imgshow = plt.imshow(img2)
plt.show()
hist1 = plt.hist(img2.reshape(-1),bins=255,rwidth=0.85,range=(0,255))