用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'); |
|