《MATLAB数字图像处理.doc》由会员分享,可在线阅读,更多相关《MATLAB数字图像处理.doc(34页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、MATLAB常用图像操作1. 转换图像类型 例1.对一幅图像进行二值化处理,代码及结果如下: load trees BW=im2bw(X,map,0.4); imshow(X,map) figure,imshow(BW) 将一幅索引色图像二值化的结果 例2.将索引色图像转化为灰度图像,其代码及结果如下: load trees I=ind2gray(X,map); imshow(X,map) figure,imshow(I)例3.将索引色图像转化为真彩色图像,其代码及结果如下:load treesRGB=ind2rgb(X,map);imshow(X,map)figure,imshow(RGB)
2、例4.用Sobel算子对图像滤波,将滤波后的数据矩阵转换为灰度图像,代码如下:I=imread(rice.tif)J=filter2(fspecial(soble),I); %产生soble算子,并用soble算子对图像I进行滤波K=mat2gray(J); %将数据矩阵转化为灰度图像Imshow(I)Figure,imshow(K)例5.将一副灰度图像转化为索引色图像,代码如下:I=imread(ndc4024m.tif);X=grayslice(I,16); %设定灰度级为16,将灰度图像转换为索引色图像Imshow(I)Figure,imshow(x,hot(16) %用hot(16)产
3、生调色板来显示索引色图像例6.将一幅真彩色图像转换为灰度图像,其代码及结果如下: load trees I=rgb2gray(RGB);%将真彩色图像RGB转换为灰度图像I imshow(RGB) newmap=rgb2gray(map);%将彩色调色板map转换成灰度调色板 figure,imshow(I)2. 图像文件的显示1) image是MATLAB本身提供的最原始的图像显示函数,其使用格式如下:image(X);colormap(map);例如:MATLAB预存的一组数据,包含图像矩阵X和调色板矩阵map,下面语句用来显示图,其结果如下图所示。load clownimage(X)co
4、lormap(map)axis equalaxis(off)2) imshow函数是最常用的显示各种图像的函数,其语法如下:imshow(I,n) 用于显示灰度图像,n为灰度级数目,默认值为256imshow(I,low high)imshow(BW) %用于显示二值图像。imshow(X,map) %用于显示索引色图像,X为数据图像矩阵,map为调色板。imshow(RGB) %用于显示真彩色图像。imshow(,disply_option)imshow(x,y,A,)imshow filename %可直接显示图像文件下面的语句用来输出一幅图像滤波后的结果,I=imread(race.ti
5、f)J=filiter2(1 2;-1 -2,I) %用模板1 2;-1 -2对图像滤波。imshow(I)figure,Imshow(J,) %由于滤波后图像灰度范围与滤波之前不同,所以用来作为参数。3) colorbar函数用于显示颜色调,并将图像中使用到的色彩排列在图像旁边,这样可以根据图像的色彩确定某个像素的值。colorbar函数语法格式如下:colorbar(vert)colorbar(horize)colorbar(h)colorbarh=colorbar()下面的例子用LoG算子对图像滤波,在输出图像上加颜色条,I=imread(saturn.tif);H=fspecial(l
6、og); %产生拉普拉斯高斯算子。I2=filiter2(H,I) %用LoG算子对图像进行滤波。Imshow(I2,),colormap(jet(64),colorbar %将颜色条放置在坐标轴上。4) montage例如读取多帧图像mir的第3帧,其代码如下:mri=uint8(zeros(128,128,1,27);for firm=1:27 mir(:,:,:,firm),map=imread(mir.tif,frm);endimshow(mir(:,:,:,3),map) 另外还可以同时显示多帧图像中的所有帧,这是由montage函数完成的,语法格式如下:montage(I) %拼接
7、灰度图像。montage(X,map) %拼接索引色图像。montage(RGB) %拼接真彩色图像。montage() %返回拼接后的图像句柄。下面例子将序列图像拼接显示,mri=uint8(zeros(128,128,1,27);for firm=1:27 mir(:,:,:,firm),map=imread(mir.tif,frm);endmontage(mir,map)5) immovie函数可以将多帧图像转换成MATLAB动画,其语法格式如下:mov=immovie(X,map)immovie只能使用索引色图像,在MATLAB中播放这个动画,首先要指定调色板。一般可以用下列语句放映动
8、画:colormap(map),movie(mov)例如:mri=uint8(zeros(128,128,1,27);for firm=1:27 mir(:,:,:,firm),map=imread(mir.tif,frm);endmov=immovie(mir,map);colormap(map)movie(mov)6) subimage函数可在一个图像窗口内使用多个调色板,使得各种图像能在同一图像窗口中显示。subimage函数的语法格式为:subimage(X,map) %在一个窗口显示多个索引色图像。subimage(I) %在一个窗口显示多个灰度图像。subimage(RGB) %在
9、一个窗口显示多个真彩色图像。subimage(X,Y,) %将图像按指定的坐标系(x,y)显示。h=subimage() %返回图像对象的句柄,其中输入图像可以是uint8或double类型。下面的例子将显示两幅具有不同调色板的图像,其结果如下图所示.load treesX2,map2=imread(forest.tif);subplot(1,2,1),subimage(X,map)subplot(1,2,2),subimage(X2,map2)7) zoom函数用于缩放图像。8) warp函数用于显示图像的纹理映射,语法格式为: warp(X,map) warp(I,n) warp(RGB)
10、 warp(z,) warp(x,y,z,) h=warp()下面例子将一幅图像映射到柱面上显示,结果如下:x,y,z=cylinder;I=imread(testpart1.tif);warp(x,y,z,I);3. 图像的几何操作例1:使用不同的插值方法对放大图像结果进行比较的效果图,其命令格式如下:load woman2imshow(X,map);X1=imresize(X,2,nearest);figure,imshow(X1,);X2=imresize(X,2,bilinear);figure,imshow(X2,);X3=imresize(X,2,bicubic);figure,i
11、mshow(X3,);3种不同的插值方法对图像放大的结果例2:将图像插值旋转,其代码及结果如下:I=imread(tire.tif);J=imrotate(I,35,bilinear);imshow(I)figure,imshow(J)对图像进行插值旋转的结果例3:从一幅图像中剪切一幅子图,坐标为(60,40)(100,90),结果如下图所示:I=imread(tire.tif);I2=imcrop(I,60 40 100 90); %对读入的图像指定切割范围60 40 100 90。imshow(I)figure,imshow(I2)从图像中剪切出一块子图像的结果4.图像领域和块操作例1:对
12、图像进行滑动平均,结果如下图所示;I=imread(tire.tif)I2=colfilt(I,5 5,sliding,mean);imshow(I)figure,imshow(I2,);对图像块进行滑动平均的结果例2:利用colfilt函数把输入图像的的图像块的均值赋予图像块中所有元素,得到的结果如下图所示:I=imread(tire.tif);imshow(I)f=inline(ones(64,1)*mean(x);I2=colfilt(I,8 8,distinct,f);figure,imshow(I2,)图像块操作求平均的结果例3:计算图像区域的标准差,结果如下图所示:I=imread
13、(tire.tif);f=inline(uint8(round(std2(x)*ones(size(x);I2=blkproc(I,8 8,f);imshow(I)figure,imshow(I2,);说明:图像块的标准差的计算公式为std2(x),结果为标量。但是为了使运算之后的图像与原图像大小相同,因此乘以一个与图像块大小相同的方阵ones(size(x),指定的函数就变为std2(x)*ones(size(x)。blkproc函数并不需要结果图像与原图像大小相同,但是如果希望结果与原图像大小相同,就必须定义合适的变换函数。计算图像快局部标准差的结果5.特定区域处理例1.根据指定的坐标选择
14、一个六边形区域,其结果如下:I=imread(eight.tif);c=222 272 300 270 221 194;r=21 21 75 121 121 75;BW=roipoly(I,c,r);imshow(I)figure,imshow(BW)根据指定的坐标选择六边形例2.按灰度分割图像中的目标,结果如下:I=imread(tire.tif);BW=roicolor(I,128,255) %选择图像灰度范围在128和255之间的像素。imshow(I)figure,imshow(BW)按指定的灰度范围选择图像区域结果例3.对指定区域进行锐化滤波,结果如下:I=imread(eight.
15、tif);C=121 272 300 20 21 194R=51 31 45 121 21 75BW=roipoly(I,c,r) %指定滤波区域为c和r确定的多边形。H=fspecial(unsharp) %指定滤波算子为unsharp。J=roifilt2(H,I,BW)subplot(1,2,1),imshow(I)subplot(1,2,2),imshow(J)对选定区域进行滤波的结果例4.填充指定的区域,结果如下:I=imread(tire.tif)C=52 72 300 270 221 194R=71 21 75 121 121 75J=roifill(I,c,r)subplot(
16、1,2,1),imshow(I)subplot(1,2,2),imshow(J)对指定区域进行填充的结果第六章 图像变换1. 傅里叶变换例1.计算图像的二维傅里叶变换,并显示其幅值的结果,其命令格式及结果如下:load imdemos saturn2imshow(saturn2)B=fftshift(fft2(saturn2)figure,imshow(log(abs(B),);colormap(jet(64),Colorbar原始图像及其傅里叶谱傅里叶变换的另一个重要特性是能够实现快速卷积。假设A为矩阵,B为矩阵,则快速计算卷积的方法如下:l 对A和B补0,使其大小都为。l 利用fft2的矩
17、阵A和B进行二维FFT变换。l 将两个FFT结果相乘,利用ifft2对得到的乘积进行傅里叶反变换。例如A=magic(3)A = 8 1 6 3 5 7 4 9 2B=ones(3)B = 1 1 1 1 1 1 1 1 1A(8,8)=0 %为了进行快速卷积,将矩阵A补零。B(8,8)=0 %为了进行快速卷积,将矩阵A补零。C=ifft2(fft2(A).*fft2(B)C=C(1:5,1:5)C=real(C)%得到的A与B的卷及结果为C = 8.0000 9.0000 15.0000 7.0000 6.0000 11.0000 17.0000 30.0000 19.0000 13.000
18、0 15.0000 30.0000 45.0000 30.0000 15.0000 7.0000 21.0000 30.0000 23.0000 9.00004.0000 13.0000 15.0000 11.0000 2.0000同时利用MATLAB提供的卷积函数conv2进行验证,可知结果正确。C=conv2(A,B)C=C(1:5,1:5)C = 8 9 15 7 6 11 17 30 19 13 15 30 45 30 15 7 21 30 23 9 4 13 15 11 22. 离散余弦变换例1.将一幅秋天的图像进行DCT变换,可以注意到图像能量的绝大部分位于变换矩阵的左上角,如下图
19、所示:RGB=imread(autumn.tif);I=rgb2gray(RGB); %将彩色图像转化为灰度图像,以便进行DCT变换。imshow(I);J=dct2(I);imshow(log(abs(J),),colormap(jet(64),colorbar;原始图像 图像DCT变换的二维显示例2.将DCT变换值小于10的系数设为0,然后利用idct2函数重构图像,结果如下图所示:J(abs(J)6*sigma;op=fspecial(log,fsize,sigma);%产生LOG滤波器。op=op-sum(op(:)/prod(size(op);%将LOG算子的滤波器均值变为0.b=f
20、ilter2(op,a);%利用LOG算子对图像滤波。thresh=.75*mean2(abs(b(rr,cc);%设置过零检测的门限。%寻找滤波后的过零点:+-和-+表示水平方向从左到右和从右到左过零。%+-和-+表示垂直方向从上到下和从下到上过零。%这里我们选择边缘点的值为负的点。 rx,cx=find(b(rr,cc)0. &abs(b(rr,cc)-b(rr,cc+1)thresh); %- +的情况 e(rx+1)+cx*m)=1; rx,cx=find(b(rr,cc-1)0&b(rr,cc)thresh); %+ -的情况 e(rx+1)+cx*m)=1; rx,cx=find(
21、b(rr,cc)0. &abs(b(rr,cc)-b(rr+1,cc)thresh); %- +的情况 e(rx+1)+cx*m)=1; rx,cx=find(b(rr-1,cc)0&b(rr,cc)thresh); %+ -的情况 e(rx+1)+cx*m)=1; %某些情况下LoG算子滤波结果可能正好为0,下面考虑这种情况: rz,cz)=find(b(rr,cc)=0); ifisempty(rz) %寻找滤波后的过零。 %+0-和-0+表水平方向从左到右和从右到左过零。 %+0-和-0+表示垂直方向上从上到下和从下到上过零。 %边缘正好位于滤波值为零点上。 zero=(rz+1)+cz
22、*m; %零点的线性坐标。 zz=find(b(zero-1)0. &abs(b(zero-1)-b(zero+1)2*thresh);%-0+情况 e(zero(zz)=1; zz=find(b(zero-1)0&b(zero+1)2*thresh);%+0-情况 e(zero(zz)=1; zz=find(b(zero-m)0. &abs(b(zero-m)-b(zero+m)2*thresh);%-0+情况 e(zero(zz)=1; zz=find(b(zero-m)0&b(zero+m)2*thresh);%-0+情况 e(zero(zz)=1; end 例4.下面的代码可以实现Ca
23、nny算子边缘检测的功能:function e=canny_edge(a,sigma)%该函数实现Canny算子边缘检测。%输入图像a,标准差sigam,输出边缘e。m,n=size(a);rr=2:m-1;cc=2:n-1;e=repmat(logical(uint8(0),m,n);%初始化边缘矩阵。GaussianDieOff=0.0001; %设定高斯函数消失门限。PercentOfPixelsNotEdges=0.7; %用于计算边缘门限。ThrseholdRatio=0.4; %设定两个门限的比例。%首先设计高斯滤波器和它的微分。pw=1:30;%设定滤波器宽度。ssq=sigma*sigma;%计算方差。width=max(find(exp(-(pw.*pw)/(2*ssq)GaussianDieOff);%计算滤波算子宽度。t=(-width:width);len=2*width+1;t3=t-.5;t+.5;%对每个像素各半个像素位置的值进行平均。gau=sum(exp(-(t3.*t3)/(2*ssq)./(6*pi*ssq);%一维高斯滤波器。dgau=(
限制150内