一. 直方图均衡化:
直方图均衡化是使图像直方图变得平坦的操作。直方图均衡化能够有效地解决图像整体过暗、过亮的问题,增加图像的清晰度。
具体流程如下所示。其中S是总的像素数,Zmax是像素的最大取值(8位灰度图像为255),h(i)为图像像素取值为 i 及 小于 i 的像素的总数。
直方图均衡化算法 ↑
二. python实现直方图均衡化操作
import cv2
import numpy as np
import matplotlib.pyplot as plt
# histogram equalization
def hist_equal(img, z_max=255):
H, W = img.shape
S = H * W * 1.
out = img.copy()
sum_h = 0.
for i in range(1, 255):
ind = np.where(img == i)
sum_h += len(img[ind])
z_prime = z_max / S * sum_h
out[ind] = z_prime
out = out.astype(np.uint8)
return out
# Read image
img = cv2.imread("../head_g_n.jpg",0).astype(np.float)
# histogram normalization
out = hist_equal(img)
# Display histogram
plt.hist(out.ravel(), bins=255, rwidth=0.8, range=(0, 255))
plt.show()
plt.savefig("out_his.png")
# Save result
cv2.imshow("result", out)
cv2.imwrite("out.jpg", out)
cv2.waitKey(0)
cv2.destroyAllWindows()
三. 实验结果:
原图 ↑
原图的像素分布直方图 ↑
直方图均衡化后图像 ↑
均衡化后图像的直方图 ↑
可以看到,直方图均衡化后的图像看起来比原来的图像更加清晰。对于图像亮度整体偏暗或者偏亮的图像,我们可以采用直方图均衡化的方法处理图像,使得它们看上去更加清晰。
四. matlab 实现图像直方图均衡化:
五. 参考内容: