挑战图像处理100问(22)——直方图平坦化
最近这几问。。。无脑操作。
直方图平坦化
让直方图的平均值,标准差吧!
这里并不是变更直方图的动态范围,而是让直方图变得平坦。
可以使用下式将平均值为标准差为的直方图变成平均值为标准差为的直方图:
代码实现
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))