分享

MATLAB进行图像处理

 尉迟容若 2012-06-25
 
用MATLAB进行图像处理参考程序
2008年10月24日 星期五 20:05
一.计算图像统计参数:
最大值:扫描法:设第一个象素灰度级为最大值,然后与后一个象素灰度级比较,如果后面的大,则把后一象素值赋给最大值,依次逐一比较到图象最后的一个象素,找出最大值。
参考程序:
[A,map]=imread('E:\lena.bmp');        
%显示原图
imshow(A,map),                                    
title('原图');
image=double(A);
%求负片
k=image(1,1);
for i=1:256,
   for j=1:256,
      if k<image(i,j);
      k=image(i,j);end,
   end,
end,
k
%显示负片
figure,
imshow(rimage,map),
title('负片');

最小值:最大值求法类似,把第一个象素灰度级设为最小值,然后逐一比较。
参考程序:
[A,map]=imread('E:\lena.bmp');        
%显示原图
imshow(A,map),                                    
title('原图');
image=double(A);
%求负片
k=image(1,1);
for i=1:256,
   for j=1:256,
      if k>image(i,j);
      k=image(i,j);end,
   end,
end,
k
%显示负片
figure,
imshow(rimage,map),
title('负片');

均值:把图中的所有的象素值累加起来再除以图象的象素的个数。
参考程序:
[A,map]=imread('E:\lena.bmp');        
%显示原图
imshow(A,map),                                    
title('原图');
image=double(A);
%求负片
k=image(1,1);
for i=1:256,
   for j=1:256,
      if k>image(i,j);
      k=image(i,j);end,
   end,
end,
k
%显示负片
figure,
imshow(rimage,map),
title('负片');

直方图:把图中的不同灰度等级的象素分别累加起来,再分别除以图象象素的总数。即:p(sk)=nk/n。可以得到原图的灰度值分布图。
参考程序:
[A,map]=imread('e:\lena.bmp');        
imshow(A,map),                                    
title('原图');
image=double(A);
for i=1:256,
    a(i)=0;
end,
for i=1:256,
   for j=1:256,
       b=image(i,j)+1;    
       a(b)=a(b)+1;          
   end,
end,
for k=1:256,
    p(k)=a(k)/(256^2);
end,
figure,
stem(p);
title('直方图');




二.对比度增强:
直方图均衡:原始图的直方图变换为均匀分布的形式,这样就增加了象素灰度值的动态范围从而达到增强对比度的效果。
参考程序:
[A,map]=imread('e:\lena.bmp');        
imshow(A,map),                                    
title('原图');
image=double(A);
for i=1:256,
    n(i)=0;
end,
for i=1:256,
   for j=1:256,
       s=image(i,j)+1;    
       n(s)=n(s)+1;          
   end,
end,
for k=1:256,
    p(k)=n(k)/(256^2);
end,
figure,bar(p,'r');
title('直方图');
for k=1:256,
    q(k)=0;
end,
for k=1:256,    
    for j=1:k,
        q(k)=q(k)+p(j);
    end,
end,
figure,bar(q,'y');
title('累积直方图');
N=256;
for k=1:256,    
    o(k)=round((N-1)*q(k)+0.5);
end,
for i=1:256,
    for j=1:256,
        rimage(i,j)=o(image(i,j));
    end
end
figure,imshow(uint8(rimage));
title('均衡化后的图');
for i=1:256,
    n(i)=0;
end,
for i=1:256,
   for j=1:256,
       s=rimage(i,j)+1;    
       n(s)=n(s)+1;          
   end,
end,
for k=1:256,
    p(k)=n(k)/(256^2);
end,
figure,bar(p,'b');
title('均衡化的直方图');




三.图象平滑:
中值滤波:中值滤波属于非线性平滑滤波器,它可以消除噪声又能保护图象的细节。
参考程序:
figure,
[A,map]=imread('e:\lena.bmp');        
%显示原图
imshow(A,map),                                    
title('原图');
image=double(A);
u=zeros(1,9);
for i=2:255,
   for j=2:255,
      u(1)=image(i,j);u(2)=image(i,j+1);u(3)=image(i-1,j+1);
      u(4)=image(i-1,j);u(5)=image(i-1,j-1);u(6)=image(i,j-1);
      u(7)=image(i+1,j-1);u(8)=image(i+1,j);u(9)=image(i+1,j+1);
      for p=1:8,
           for q=1:8-p,
              if u(q)>u(q+1)
                  k=u(q);u(q)=u(q+1);u(q+1)=k;
              end,
          end,
      end,
      rimage(i,j)=u(5);
   end,
end,
figure,
imshow(rimage,map),
title('中值滤波');





四.图象锐化:
Sobel算子:是一种空域微分算子,可以通过它锐化图象。
参考程序:
[A,map]=imread('e:\lena.bmp');        
image=double(A);
u=zeros(1,9);
k=zeros(1,9);
for i=2:255,
   for j=2:255,
      u(1)=0*image(i,j);u(2)=2*image(i,j+1);u(3)=1*image(i-1,j+1);
      u(4)=0*image(i-1,j);u(5)=-1*image(i-1,j-1);u(6)=-2*image(i,j-1);
      u(7)=-1*image(i+1,j-1);u(8)=0*image(i+1,j);u(9)=1*image(i+1,j+1);
      rimage1(i,j)=abs(sum(u));
      k(1)=0*image(i,j);k(2)=0*image(i,j+1);k(3)=1*image(i-1,j+1);
      k(4)=2*image(i-1,j);k(5)=1*image(i-1,j-1);k(6)=0*image(i,j-1);
      k(7)=-1*image(i+1,j-1);k(8)=-2*image(i+1,j);k(9)=-1*image(i+1,j+1);
      rimage2(i,j)=abs(sum(k));
      xuhua(i,j)=rimage1(i,j)+rimage2(i,j);
   end,
end,
figure,
imshow(xuhua,map),
title('Sobel锐化');




五.图象变换:
将图象分块(8*8),作DCT变换,并作IDCT:DCT是一种可分离图象变换,用来图象压缩编码,IDCT用来解压缩。
参考程序:
[A,map]=imread('e:\lena.bmp');        
%显示原图
imshow(A,map),                                    
title('原图');
image=double(A);
N=8;
for x=1,
    a(x)=sqrt(1/N);
end,
for x=2:8,
    a(x)=sqrt(2/N);
end,
%dct
rimage=zeros(8,8);
for x=1:32,
    for y=1:32,        
for u=1:N,
    for v=1:N,
        for i=1:N,
            for j=1:N,
                rimage(i,j)=image(i+(x-1)*8,j+(y-1)*8);
                b(i,j)=rimage(i,j).*cos((2*(i-1)+1)*(u-1)*pi/(2*N)).*cos((2*(j-1)+1)*(v-1)*pi/(2*N));
            end,
        end,
        d(u,v)=sum(sum(b,1),2);
        C(u,v)=a(u).*a(v).*d(u,v);
    end,
end,
xhimage{x,y}=C;
end,
end,
aa=zeros(8,8);
b1=zeros(256,256);
for x=1:32,
    for y=1:32,
        aa=xhimage{x,y};
        for i=1:8,
            for j=1:8,
                b1(i+(x-1)*8,j+(y-1)*8)=aa(i,j);
            end,
        end,
    end,
end,
figure,imshow(uint8(b1));title('DCT');

参考程序:
%idct
for x=1:32,
    for y=1:32,        
for i=1:N,
    for j=1:N,
        C=xhimage{x,y};
        for u=1:N,
            for v=1:N,                
            h(u,v)=a(u).*a(v).*C(u,v).*cos((2*(i-1)+1)*(u-1)*pi/(2*N)).*cos((2*(j-1)+1)*(v-1)*pi/(2*N));
            end,
        end,
        ic(i,j)=sum(sum(h,1),2);
    end,
end,
reimage{x,y}=ic;
end,
end,
aa=zeros(8,8);
b2=zeros(256,256);
for x=1:32,
    for y=1:32,
        aa=reimage{x,y};
        for i=1:8,
            for j=1:8,
                b2(i+(x-1)*8,j+(y-1)*8)=aa(i,j);
            end,
        end,
    end,
end,
figure,imshow(uint8(b2));title('IDCT');

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多