原创 数字图像处理的matlab实现(一)——直方图均衡

2010-10-12 10:39 4882 13 13 分类: MCU/ 嵌入式

       刚开始学习数字图像处理,在这里把学习过程记录下来作为学习笔记与各位分享。


       作为入门级处理,首先当论直方图均衡,在此主要关注于均衡算法的实现,具体的原理可以参阅任何一本数字图像处理的相关书籍都有说明。所有的算法我尽可能的不调用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条评论)

登录后参与讨论
我要评论
0
13
关闭 站长推荐上一条 /2 下一条