天天看点

数字图像处理学习(一):直方图均衡化灰度直方图均衡化

灰度直方图

  • 定义:遍历图像上的每一个像素点,并根据事先确定的灰度区间,统计每一个灰度区间的像素点数量,即为灰度直方图。
  • 意义:清晰的图片一般灰度直方图会均匀分布,而那些像素点聚集在某个区域的图像往往会过暗或过亮。直方图均衡化的作用就在于使直方图趋向于均衡分布。

均衡化

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('直方图均衡化后的图像');
           

3.效果展示

数字图像处理学习(一):直方图均衡化灰度直方图均衡化

继续阅读