提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
概念理解
直方图均衡化的目的:直方图均衡技术将原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
1、直方图:这里只灰度直方图,就是不同灰度级(0-255)在整个图像中出现的频数,进而绘制的统计直方图。
2、均衡化:改变灰度直方图的数据分布,使整体的分布更加平滑,均衡
计算步骤
1、计算当前图片的灰度直方图(使用256的一维数组记录不同灰度的频数)
2、计算灰度图像的累计分布函数c(f)
其中Pf(t)为概率分布函数,nt表示所有灰度为t的像素点的数量,n表示所有像素点的总数量。
3、将c(f)乘上灰度级(通常为255),再四舍五入,得到更新后的灰度直方图。
这一步比较难以理解,也是体现均衡化的关键所在。c(f)为一个累计的概率分布函数。随着灰度份数的增加,需要根据原有的权重比例来对新加入的灰度权重重新进行全新权重计算。
理解示例:分别有1岁(灰度频数),2岁,3岁的三个(灰度等级)儿童,来切分一个蛋糕(灰度值为255),吃饭量1岁1份,2岁2份,3岁3份。那么一开始只有2个小朋友的时候,
4、最后将对应像素位置的灰度值用全新的灰度值进行替代。
代码
代码如下(示例):
import cv2
import numpy as np
img = cv2.imread('Histogram_Equalization/source/jetplane.png')#读图
########## Begin ##########
def pix_gray (img):
h = img.shape[0] ###获取长和宽
w = img.shape[1]
###新建数组统计灰度值得频数
gray_level = np.zeros(256)
gray_level2 = np.zeros(256)
for i in range (1,h-1):
for j in range(1,w-1):
gray_level[img[i,j]] += 1 #统计在图像i,j处的灰度值的个数
for i in range(1,256):
gray_level2[i] = gray_level2[i-1] + gray_level[i] #统计灰度级小于img_gray[i,j]的个数,(公式中的求和部分,频数的求和)
return gray_level2
def hist_gray(img):
h = img.shape[0]
w = img.shape[1]
gray_level2 = pix_gray(img) ##获取图像的直方小于个数
lut = np.zeros(256) ###初始化256灰度的表
for i in range(256): ###按照灰度进行遍历
lut[i] = 255.0/(h*w)*gray_level2[i] #通过均值化得到新的灰度级,p*gray
for h1 in range(h):
for w1 in range(w):
img[h1,w1] = lut[img[h1,w1]] ###更新灰度像素值
return img
out = hist_gray(img)
########## End ##########
cv2.imwrite('Histogram_Equalization/result/out.png', out)
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())