【数字图像处理】MATLAB实现直方图均衡化

直方图均衡化的MATLAB实现


1、回顾----直方图均衡化

  • 基本原理
    直方图均衡化方法的基本思想是:
    对在图像中像素个数多的灰度级进行展宽,而对像素个数少的灰度级进行缩减,从而达到清晰图像的目的
    因为灰度分布可在直方图中描述,所以该图像增强方法是基于图像的灰度直方图。
  • 直方图均衡化的处理步骤
    ①求待处理图像的直方图h
    ②计算原图的灰度分布概率hs →  h s ( i ) = h ( i ) / N f hs(i)=h(i)/N_f hs(i)=h(i)/Nf     N f = m ∗ n N_f=m*n Nf=mn
       Nf--图像f的总体像素个数 (m,n分别为图像的长和宽)
       hs--每个灰度级的分布概率,即每个像素在整个图像中所占的比例 (i=0,1,…,255)
    ③计算原图灰度的累计分布hp →  h p ( i ) = ∑ k = 0 i h s ( k ) h_p(i)=\displaystyle\sum_{k=0}^{i}h_s(k) hp(i)=k=0ihs(k)
       (i=0,1,…,255)
    ④计算原、新图灰度值的影射关系
    ⑤原、新图灰度直方图比较


2、代码实现


实现程序如下图所示:

直方图均衡化函数:

% 直方图均衡化
% 相比于非线性动态范围调整,效果好,不需要参数
% F = 'img\pict1.png';
% [G] = dip(F);
% function [G] = imhisteq(F)
function [G] = dip(F)
F = imread(F);        % 读入图像,存放在图像矩阵F中
[M,N,K] = size(F);    % 获得输入图像尺寸
if(K>1)
    F = rgb2gray(F);  % 将RGB 图像或颜色图转换为灰度图
end
F = double(F);
hist_0 = GetImHist0(F,256)';  % 求直方图
hist_1 = hist_0/(M*N);        % 求灰度分布概率
hp0 = cumsum(hist_1);         % 求原图灰度累计分布 MATLAB中cumsum可用于求累计和
hp1 = round(hp0*255);         % 原新图的映射  round函数:四舍五入
hp1(1) = 0;                   %1个元素强制设为0
% 求出每一个像素点的灰度值F(i,j),赋给新图像的对应像素值G(i,j)
for i=1:M
    for j=1:N
        GrayScale = F(i,j);   % 原图灰度值
        NewGrayScale = hp1(GrayScale+1);
        G(i,j) = NewGrayScale;
    end
end
% 将计算得到的新图像矩阵中所有点的灰度值由double转换为uint8,输出图像
figure,imshow(uint8(F));title('原图');
figure,imshow(uint8(G));title('直方图均衡化后的图像');
end

直方图函数:

% 求直方图--要求输入灰度图,单颜色通道
function counts = GetImHist0(Im,nbins) 
% nbins箱子 区间的个数
[row,col,cChannel] = size(Im); 
% cChannel颜色通道
counts = zeros(nbins,1);
minV = 0;
maxV = 255;
if(cChannel>1)
    disp('Input error');
else
    Im = double(Im);
    Im2 = reshape(Im,row*col,1);
    delta = (maxV-minV)/nbins;
    splitVs = 0:nbins;
    splitVs = splitVs*delta; 
    i=1;
    ind = find(Im2>=splitVs(i) & Im2<=splitVs(i+1));
    counts(i) = length(ind);
    for i = 2:nbins
        ind = find(Im2>splitVs(i) & Im2<=splitVs(i+1));
        counts(i) = length(ind);
    end
end
end

命令行窗口输入如下代码:

F = 'img\pict1.png';[G] = dip(F);

代码执行结果:
在这里插入图片描述

  • 8
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值