用MATLAB程序进行图像处理一.计算图像统计参数:最大值:扫描法:设第一个象素灰度级为最大值,然后与后一个象素灰度级比较,如果后面的大,则把后一象素值赋给最大值,依次逐一比较到图象最后的一个象素,找出最大值。
参考程序:[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));endendfigure,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,%dctrimage=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');参考程序:%idctfor 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');。