刚开始学习数字图像处理,在这里把学习过程记录下来作为学习笔记与各位分享。
作为入门级处理,首先当论直方图均衡,在此主要关注于均衡算法的实现,具体的原理可以参阅任何一本数字图像处理的相关书籍都有说明。所有的算法我尽可能的不调用matlab的函数来进行实现。
下面为直方图均衡的matlab源代码,图像使用的是matlab自带的cameraman.tif(注明:我使用的matlab版本为2007b)。
sourcePic=imread('cameraman.tif'); %读取原图象
[m,n,o]=size(sourcePic);
figure(1)
imshow(sourcePic);
gp=zeros(1,256); %创建一个全零矩阵,1×256,计算各灰度出现的概率
for i=1:256
gp(i)=length(find(sourcePic == (i-1)))/(m*n);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%gp 1 2 3 ...................................256
%grayscale 0 1 2 ...................................255
%probability
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure,bar(0:255,gp);
title('原图像直方图');
xlabel('灰度值');
ylabel('出现概率');
newGp=zeros(1,256); %计算新的各灰度出现的概率
S1=zeros(1,256);
S2=zeros(1,256);
tmp=0;
for i=1:256
tmp=tmp+gp(i);
S1(i)=tmp; %各会灰度的累计概率
S2(i)=round(S1(i)*256); %将取整后的值存储在S2
end
%%%%%%%%%%%%%%%%%%%%%做显示用%%%%%%%%%%%%%%%%%%%%%%%
figure,bar(0:255,S1);
title('各点概率累计S1');
xlabel('灰度值');
ylabel('概率');
%%%%%%%%%%%%%%%%查看原灰度值与均衡后灰度值的对应关系%%%%%%%%%%%%%
figure,bar(0:255,S2);
title('均衡后的的灰度值S2');
xlabel('均衡后灰度值');
ylabel('原灰度值');
for i=1:256
newGp(i)=sum(gp(find(S2==i)));
%终于弄明白了由于S2进行了取整的操作,所以S2中的灰度值可能S2(j)=S2(i)(j!=i);
%所以要将gp中对应的灰度的值的概率对应过来然后求和
%即产生了如下的映射
%gp P1 P2 P3
%original grayscale i j k
% \ | /
% whatever
%newGp P1+P2+P3
end
figure,bar(0:255,newGp);
title('均衡化后的直方图');
xlabel('灰度值');
ylabel('出现概率');
newGrayPic=sourcePic; %填充各像素点新的灰度值
for i=1:256
newGrayPic(find(sourcePic==(i-1)))=S2(i); %用新的灰度填充以前旧的灰度值
end
figure,imshow(newGrayPic);
以上为实现的源代码,我在附件中上传*.m脚本。
实现效果可以参阅下附件中的图片
文章评论(0条评论)
登录后参与讨论