灰度直方图
- 定义:遍历图像上的每一个像素点,并根据事先确定的灰度区间,统计每一个灰度区间的像素点数量,即为灰度直方图。
- 意义:清晰的图片一般灰度直方图会均匀分布,而那些像素点聚集在某个区域的图像往往会过暗或过亮。直方图均衡化的作用就在于使直方图趋向于均衡分布。
均衡化
1. 数学计算
(1)计算直方图每个方柱的百分率
(2)设灰度等级分为N级->计算百分率乘上(N-1)->进行累加->四舍五入将累加结果映射到新的灰度等级上->得到规则g
(3)将规则g应用到图像中,将图像的灰度值映射到新的值,得到新的图像,即为均衡化图像。
2.matlab源码实现
直方图均衡化实现函数
% 高斯低通滤波器
% img 传入图像
% N_size 定义的模板大小,需为奇数值
% sigma 标准差
function H = GaussianLowpass(img, N_size, sigma)
% 定义图像长宽
N_row = N_size;
N_col = N_size;
% 高斯滤波器模板
G_ry = zeros(N_row, N_col);
% 求图像中心点
center = (N_size + 1) / 2;
% 求解模板
for i=1 : N_row
for j=1 : N_col
distance_s = double((i-center-1)^2 + (j-center-1)^2);
G_ry(i,j)=exp((-1) * distance_s/(2*sigma^2))/(2*pi*(sigma^2));
end
end
% 图像滤波
H = imfilter(img,G_ry);
end
主函数
% 读入图像
p = imread("photo.jpeg");
% 获得输入图像尺寸
[M,N,K] = size(p);
if(K>1)
% 将RGB 图像或颜色图转换为灰度图
p = rgb2gray(p);
end
% 求直方图
hist_0 = GetInhist(p,256)';
% 求灰度分布概率
hist_1 = hist_0/(M*N);
% 求原图灰度累计分布
hp0 = cumsum(hist_1);
% 求关于原图的映射
hp1 = round(hp0*255);
G = zeros(M, N);
% 求出每一个像素点的灰度值F(i,j),赋给新图像的对应像素值G(i,j)
for i=1:M
for j=1:N
GrayScale = p(i,j); % 原图灰度值
NewGrayScale = hp1(GrayScale+1);
G(i,j) = NewGrayScale;
end
end
% 将计算得到的新图像矩阵中所有点的灰度值由double转换为uint8,输出图像
figure,imshow(uint8(p));title('原图');
figure,imshow(uint8(G));title('直方图均衡化后的图像');