直方图均衡化 Matlab 实现(编写 histeq 函数)
function img= myHisteq(img,k)%k表示灰度级数目
% 自定义histeq
map=zeros(k,1);%一数组三用(统计灰度分布,灰度分布归一化,映射关系)
[m,n]=size(img);
%统计
for i=1:m
for j=1:n
t=fix(img(i,j)/(256/k));
map(t)=map(t)+1;
end
end
%归一化
for i=1:k
map(i)=map(i)/(m*n);
end
%生成映射关系
sum=0;new_sum=1;
for i=1:k
sum=sum+map(i);
while sum>new_sum/k
new_sum=new_sum+1;
end
map(i)=new_sum;
end
%映射新图像
for i=1:m
for j=1:n
t=fix(img(i,j)/(256/k));
img(i,j)=map(t)*256/k;
end
end
效果对比:


figure1是matlab自带函数的效果,figure2是上述自定义函数的效果。
可以看出我的方法还保留了灰度直方图的形状,只是将其均匀分布到了整个区间;而matlab并不是简单的映射,灰度分布更加均匀。
浙公网安备 33010602011771号