MATLAB在数字图像处理中的应用课件.ppt
MATLAB在数字图像处理中的应用,MATLAB中,一幅图像可能包含一个数据矩阵,也可能包含一个颜色映射表矩阵。,MATLAB中有4种基本的图像类型:,(1)索引图像;,(2)灰度图像;,(3)RGB图像,(4)二值图像,1、索引图像,索引图像包括一个数据矩阵X,一个颜色映像矩阵map。,其中map是一个包含三列和若干行的数据矩阵,其每一个元素的值均为【0,1】之间的双精度浮点型数据。,map矩阵的每一列分别表示红色、绿色和蓝色的颜色值。,在MATLAB中,索引图像是从像素值到颜色映射表值的“直接映射”。,像素颜色由数据矩阵X作为索引指向矩阵map进行索引。,例如,值1指向矩阵map中的第一行,2指向第二行,依次类推。,.4 15 6 8.2 8 3 79.,0 0 00.2946 0.1234 0.23450.3245 0.2589 0.3689,X,map=imread(trees.tif)image(X)colormap(map),显示结果如图6.4.1所示:,2、灰度图像,MATLAB中,一幅灰度图像是一个数据矩阵I,其中I中的数据均代表了在一定范围内的颜色灰度值。,MATLAB把灰度图像存储为一个数据矩阵,该数据矩阵中的的元素分别代表了图像中的像素。,在MATLAB中,要显示一幅灰度图像,需要调用函数imagesc(即image scale,图像缩放函数)。,例6.4.2 用imagesc函数显示一幅灰度图像。,x=imread(trees.tif);,imagesc(x);,colormap(gray),显示结果如图6.4.2所示:,3、RGB图像,RGB图像,即真彩图像,在MATLAB中存储为nm3的数据矩阵。,数组中的元素定义了图像中每一个像素的红、绿、蓝颜色值。,像素的颜色由保存在像素位置上的红、绿、蓝的灰度值的组合来确定。,图形文件格式把RGB图像存储为24位的图像,红、绿、蓝分别占8位。,例6.4.3 调用image函数显示RGB图像。,RGB=imread(flowers.tif);,image(RGB),显示结果如图6.4.3所示:,4、二值图像,与灰度图像相同,二值图像只需要一个数据矩阵,每个像素只取两个灰度值。,例:用imshow函数显示一个二值图像。,imshow circles.tif,显示结果如图6.4.4所示:,5、在一个图形窗口中显示多幅图像,为了便于在多幅图像之间进行比较,需要将这些要比较的图像显示在一个图形窗口中,用subimage函数。,subimage(X,map),subimage(I),subimage(RGB)分别用于显示索引色、灰度及真彩色图像。,subimage(x,y,)表示将图像按指定的坐标系(x,y)显示。,RGB1=imread(football.jpg);,RGB2=imread(greens.jpg);,I1=imread(rice.tif);,I2=imread(testpat1.tif);,subplot(2,2,1);,subimage(0,500,0,500,RGB1);,subplot(2,2,2);,subimage(0,500,0,500,RGB2);,subplot(2,2,3);,subimage(0,500,0,500,I1);,subplot(2,2,4);,subimage(0,500,0,500,I2);,6、增强对比度,X1=imread(pout.tif);figure,imshow(X1)f0=0;g0=0;f1=70;g1=30;f2=180;g2=230;f3=255;g3=255;figure,plot(f0,f1,f2,f3,g0,g1,g2,g3),axis tight,xlabel(f),ylabel(g)title(intensity transformation)r1=(g1-g0)/(f1-f0);b1=g0-r1*f0;r2=(g2-g1)/(f2-f1);b2=g1-r2*f1;r3=(g3-g2)/(f3-f2);b3=g2-r3*f2;,m,n=size(X1);X2=double(X1);for i=1:mfor j=1:n f=X2(i,j);g(i,j)=0;if(f=0),elseif(f=f1)end endendfigure,imshow(mat2gray(g),原图像、变换曲线和处理后的图像如下:,7、利用MATLAB工具箱中的函数imadjust()增强对比度。,代码如下:X1=imread(pout.tif);figure,imshow(X1)J=imadjust(X1,0.25 0.6,1.2322);figure,imshow(J),J=adjust(I,low high,bottom top,gamma)表示返回图像I经调整后的图像J。low high为原图像中要变换的灰度范围,bottom top指定了变换后的灰度范围,其中low,high,bottom,top的取值范围都使01,并且lowhigh,bottomtop,这是因为在MATLAB中将0255的灰度范围影射到01的范围内。,gamma为矫正量,它指定了变换曲线的形状,描述了I和J的值之间的关系;通常当gamma大于1时,图像变暗,而当gamma 小于1时,图像变亮。,8、采用对数形式的变换函数进行动态范围压缩。g=c*log(1+f)其中,c是比例尺常数,运行如下代码段实现对数变换:,X1=imread(circuit.tif);figure,imshow(X1)m,n=size(X1);X2=double(X1);for i=1:m,for j=1:n g(i,j)=c*log(X2(i,j)+1);endendfigure,imshow(mat2gray(g);,9 图像二值化处理。,X1=imread(pout.tif);figure,imshow(X1)f1=100;figure,plot(0,f1,f1,255,0,0,255,255,)axis tight,xlabel(f),ylabel(g)title(intensity transformation)m,n=size(X1)X2=double(X1);,for i=1:m for j=1:n f=X2(i,j);g(i,j)=0;if(f=0),end endendfigure,imshow(mat2gray(g),变换曲线和变换结果分别如下图:,10、实现直方图均衡化,用J=histeq(I,n)函数来完成这项工作,其中I是原始图像矩阵,J是变换后所得的图像矩阵。,实现代码如下:,I=imread(tire.tif);J=histeq(I);imshow(I)figure,imshow(J)figure,imhist(I,64)figure,imhist(J,64),原始图像 原始直方图,直方图均衡化所得图像 直方图均衡化后的直方图,11、实现直方图规定化,I=imread(tire.tif);hgram=0:225 J=histeq(I,hgram);imshow(I)figure,imshow(J)figure,imhist(J,64),J=histeq(I,hgram)可实现直方图规定化,其中hgram是由用户指定的矢量,规定将原始图像I的直方图近似变换成hgram。,使用直方图均衡化得到的结果在一些较暗的区域有些细节仍不太清楚;规定化所得的结果比均衡化更亮,对应于均衡化图像中较暗区域的一些细节更清晰。从直方图上看,灰度值高的一边更为密集。,二、图像间的代数运算,代数运算是指对两幅图像进行点对点的加、减、乘、除计算而的到输出图像的运算。,1.图像相减运算,设有图像f(x,y)和h(x,y),它们的差为:,g(x,y)=f(x,y)h(x,y),图像相减可以用于去除一幅图像中所不需要的加性图案,加性图案可能是缓慢变化的背景阴影、周期性的噪声,或在图像上每个象素处均已知的附加污染等。,减法也可以用于检测同一场景的两幅图像之间的变化。,例如通过对一场景的序列图像的减运算可检测运动。在计算用于确定物体边界位置的梯度时,也要用到图像减运算。,例1 显示采用离散余弦变换压缩的图像与原图像的差别。,用原图像与压缩后的图像相减,实现代码如下:,I=imread(cameraman.tif);I=double(I)/255;T=dctmtx(8);B=blkproc(I,8 8,P1*x*P2,T,T);,mask=1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;,B2=blkproc(B,8 8,P1.*x,mask);I2=blkproc(B2,8 8,P1*x*P2,T,T);imshow(I),figure,imshow(I2)M=I2-I;figure,imshow(mat2gray(M),原始图像 经压缩、解压后的图像,相减所得图像,2.图像相加运算,设有图像f(x,y)和h(x,y),它们的和为 g(x,y)=f(x,y)+h(x,y),图像相加的一个重要应用是对同一场景的多幅图像求平均值。这种方法经常用来有效地降低加性随机躁声的影响。图像相加也可以用来将一幅图像的内容叠加到另一幅图像上去,以达到二次暴光的效果。,例1 实现图像相加。,I=imread(saturn.tif);figure,imshow(I),m,n=size(I);J(m,n)=0;for i=1:3 X=imnoise(I,gaussian);figure,imshow(X)Y=double(X);J=J+Y/3;endfigure,imshow(mat2gray(J),图6.4.1 索引图像,图6.4.2 灰度图像,图6.4.3 真彩图像,图6.4.4 二值图像,三.边缘检测,常用的边缘检测算子有Robert算子、Sobel算子、Prewitt算子、LOG算子、Canny算子,以下分别进行介绍。,1.Robert算子,Robert算子是一种利用局部差分算子寻找边缘的算子,其模板如图所示。,Robert算子,在MATLAB中可以由函数实现,语法格式如下:,BW=edge(I,roberts),BW=edge(I,roberts,thresh),BW=edge(I,roberts)自动选择阈值用Robert算子进行边缘检测。,BW=edge(I,roberts,thresh)根据所指定的敏感度阈值thresh用Robert算子进行边缘检测,它忽略了所有小于阈值的边缘。当thresh为空()时,自动选择阈值。,2.Sobel算子,Sobel算子的两个卷积计算核如图所示,图像中的每个点都用这两个核做卷积,第一个核对水平边缘响应最大,第二个核对垂直边缘响应最大。,edge函数实现的语法格式如下:,BW=edge(I,sobel),BW=edge(I,sobel,thresh),BW=edge(I,sobel,thresh,direction),BW=edge(I,sobel)自动选择阈值用Sobel算子进行边缘检测。,BW=edge(I,sobel,thresh)根据所指定的敏感度阈值thresh用Soble算子进行边缘检测,它忽略了所有小于阈值的边缘。当thresh为空()时,自动选择阈值。,BW=edge(I,sobel,thresh,direction)根据所指定的敏感度阈值thresh,在所指定的方向direction上,用Sobel算子进行边缘检测。direction可取的字符串值为horizontal(水平方向)、vertial(垂直方向)或both(两个方向)。,3.Prewitt算子,Prewitt算子的两个卷积计算核如图所示。,edge函数实现的语法格式如下:,BW=edge(I,prewitt),BW=edge(I,prewitt,thresh),BW=edge(I,prewitt,thresh,direction),BW=edge(I,prewitt)自动选择阈值用Prewitt算子进行边缘检测。,BW=edge(I,prewitt,thresh)根据所指定的敏感度阈值thresh用Prewitt算子进行边缘检测,它忽略了所有小于阈值的边缘。当thresh为空()时,自动选择阈值。,BW=edge(I,prewitt,thresh,direction)根据所指定的敏感度阈值thresh,在所指定的方向direction上,用Prewitt算子进行边缘检测。direction可取的字符串值为horizontal(水平方向)、vertial(垂直方向)或both(两个方向)。,4.LOG算子,LOG算子先用高斯低通滤波器将图像进行预先平滑,然后用拉普拉斯算子找出图像中的陡峭边缘,最后用零灰度值进行二值化产生闭合的、连通的轮廓,消除了所有内部点。,edge函数实现的语法格式如下:,BW=edge(I,log)BW=edge(I,log,thresh)BW=edge(I,log,thresh,sigma),BW=edge(I,log,thresh,sigma)根据所指定的敏感度阈值thresh和标准偏差sigma,用LOG算子进行边缘检测,默认时sigma等于2。,I=imread(rice.tif);BW1=edge(I,sobel);BW2=edge(I,roberts);BW3=edge(I,prewitt);BW4=edge(I,log);BW5=edge(I,canny);h=fspecial(gaussian,5);,BW6=edge(I,zerocross,h);subplot(2,3,1),imshow(BW1)title(sobel算子)subplot(2,3,2),imshow(BW2)title(roberts算子)subplot(2,3,3),imshow(BW3)title(prewitt算子)subplot(2,3,4),imshow(BW4)title(log算子)subplot(2,3,5),imshow(BW5)title(canny算子),subplot(2,3,6),imshow(BW6)title(zerocross算子),四图像的几何处理,图象的几何处理包括:图像的旋转、图像的剪切、图像的缩放和基于区域的图像处理。,1、图象的旋转,函数imrotate()可以通过一种特定的插补方法来改变显示图象的角度,其语法格式如下:B=imrotate(A,angle,method)B=imrotate(A,angle,method,crop),其中A是图象的数据矩阵,angle是图象的旋转角度,method可以是nearest、bilinearh或bicubic,它们分别近邻插补方法、双线性插补方法和双立方插补方法,参数corp表示剪切。,例如1.用双线性插补方法改变图象logo.tif显示的角度,A=imread(logo.tif);J=imrotate(A,30,bilinear,crop);subplot(1,2,1);imshow(A);,title(原始图象);subplot(1,2,2);imshow(J);title(旋转30后的图象),2、图象的剪切 函数imcrop()可以实现图象的剪切,其语法格式有如下几种:X2=imcrop(X,map):对索引图象进行交互式的剪切。I2=imcrop(I):对灰度图象进行交互式的剪切。,RGB=imcrop(RGB):对RGB图象进行交互式的剪切。RGB2=imcrop(RGB,RECT):对RGB图象进行非交互式的剪切。,例2.对RGB图象lily.tif按给定的矩形区域100 100 70 80进行剪切。rgb=imread(lily.tif);subplot(1,2,1);subimage(rgb);,title(原始图象);subplot(1,2,2);rgb2=imcrop(rgb,100 100 70 80);subimage(rgb2);title(剪切后的图象);,3、图象的缩放函数imresize()可以通过一种特定的插补方法来调整图象的大小,其语法格式如下:,B=imresize(A,mrows ncols,method):用method指定的插补方法返回大小为mrows*ncols的图象。B=imresize(A,m,method):用method指定的插补方法返回大小等于A的m倍的图象B。,例如3.对图像的大小进行调整。A=imread(ic.tif);imshow(A);title(原始图象);,figure;subplot(1,2,1);B1=imresize(A,2,bilinear);imshow(B1);title(用bilinear法放大2倍后的图象);subplot(1,2,2);B2=imresize(A,0.5,nearest);,imshow(B2);title(用nearest法缩小0.5倍后的图象);,五、平滑滤波器,1.线性平滑滤波器,线性低通滤波器是最常用的线性平滑滤波器。,这种滤波器的所有系数都是正的。对33的模板来说,最简单的操作是取所有系数都为1。,为保证输出图像仍在原来的灰度范围内,在计算出R后要将其除以9再进行赋值。这种方法称为邻域平均法。,例1 以saturn.tif为例,加入椒盐噪声,并在MATLAB中调用Bfilter2(h,A)实现均值过滤器,实现代码如下:,I=imread(saturn.tif)J=imnoise(I,salt,K3=filter2(fspecial(average,7),J)/255;figure,imshow(K1)figure,imshow(K2)figure,imshow(K3),比较以上采用不同尺寸的均值滤波器进行低通滤波处理的结果可知,当所用的平滑模板的尺寸增大时,消除噪声的效果增强,但同时所得的图像变得更模糊。,2、高斯滤波器,高斯滤波器在空域中也是具有平滑性能的低通滤波器,可通过调用h=fspecial(gaussian)函数实现高斯滤波器。,例1 实现高斯滤波器,代码如下:I=imread(saturn.tif);J=imnoise(I,gaussian,0,0.005);figure,imshow(J)h=fspecial(gaussian);,K=filter2(h,J)/255;figure,imshow(K),2.非线性平滑滤波器,(1)中值滤波器,可以调用B=medfilt2(A,m,n)来实现中值过滤器,函数K=medfilt2(A,m,n)使用mn的模板来完成中值滤波,默认模板是33的。,例1 以saturen.tif为例,加入椒盐噪声,并采用中值 过滤器,实现代码如下:,I=imread(saturn.tif);J=imnoise(I,salt figure,imshow(K1),