基于MATLAB图像处理(第2版)讲稿.ppt
基于MATLAB的图像处理,于万波,关于图像等,图像研究有着重要的实际应用价值与理论研究价值图像的研究正在继续,国际上有很多有关图像研究的期刊、专著;各种图像相关的产品不断问世本书使用MATLAB作为工具讲解图像处理的基本原理与基本方法学习时要坚持上机操作,坚持思考,第1章 图像,1.1 Matlab的命令使用与程序设计 1.1.2 M-File程序设计 1.1.3 Figure窗口的图形操作功能 1.1.4 自定义函数 1.1.5 Matlab的矩阵操作 1.1.6 多维数组与图像矩阵,1.2 图像的表示方法1.2.1 图像的数字化 1.2.2 图像的读取与显示 1.2.3 图像的分类,2.图像的数字化 在计算机中,图像被看作是一些数值构成的矩阵。例如图1-7所示数据就代表着图像,s=size(A),则有s=22 22 3说明图像的长为22、宽为22,由3种颜色迭加而成。下面是其红色阵的数据(1到15列),2.图像数据的调用既然图像数据是存储在数组中,那么调用图像数据就变成了操作数组元素。例如:B=A(1:5,1:9,1)B=221 221 221 221 221 221 221 221 221 221 234 234 234 234 234 234 234 234 221 234 234 234 234 234 234 234 234 221 234 234 234 234 234 4 4 4 221 234 234 234 234 4 0 0 0调用红色阵的1到5行,1到9列,函数imshow()可以把任意的二维数组(矩阵)显示成为图像。另外,函数imview()、image()、imagesc()也可以用来显示图像。,1.基于颜色表示的图像分类(1)灰度图像灰度图像对应着一个数据矩阵(二维数组),数组元素的值表示图像在该位置上的亮度值。一般常用数值0表示黑色,255表示白色,用0到255之间的数表示灰(亮)度。,下面程序使用getframe函数装载这几幅图像,使用movie函数播放这几幅图像就是完成了一个动画制作。for i=1:3k=int2str(i);k1=strcat(e:,k,.jpg);a1=imread(k1);image(a1);m(:,i)=getframe;endmovie(m,10),第2章 图像几何操作与代数运算,2.1 图像的缩放旋转与裁剪 2.2 图像的几何变换 2.3 图像的加减乘除运算 2.4 图像的特征值与奇异值 2.5 图像逻辑运算,2.1 图像的缩放旋转与裁剪,2.1.1 图像的裁剪 2.1.2 图像的缩放 2.1.3 图像的旋转,1.imcrop函数该函数有两个参数,一个用来指定裁剪图像,一个用来定义裁剪矩形。【例2-1】使用imcrop函数对图像进行裁剪。编写如下程序:A=imread(D:imageprocessIMG_7354.jpg);A1=imcrop(A,190,100,290,220);subplot(1,2,1),imshow(A);subplot(1,2,2),imshow(A1)程序运行结果如图2-1所示。imcrop 函数中的参数190,100,290,220的含义是以图像上的(190,100)点为裁剪矩形的左上角坐标,裁剪矩形的宽为290,高为220。,3.Matlab函数roipolyMatlab中提供了定义多边形区域的函数roipoly,可以使用该函数定义多边形区域,然后实行裁剪操作。【例2-2】使用roipoly函数选取图像块。I=imread(D:125.jpg);subplot(1,2,1)imshow(I)C1=10 30 80;C2=20 100 68;BW=roipoly(I,C1,C2);subplot(1,2,2)imshow(BW)程序运行结果如图2-3所示。,2.1.2 图像的缩放 图像的缩放也是经常使用的一种操作。在图像缩放过程中,涉及到图像数据的删除与增加。特别是图像放大的时候,需要考虑如何在扩大后的空隙中加入新的图像颜色数据。增加颜色数据的主要方法是根据周围相近象素的颜色值进行插值计算。,1.imresize函数缩放图像【例2-5】使用imresize函数缩小或放大图像。下面程序把图像缩小到原来的0.5倍。c=imread(D:earth.jpg);c2=imresize(c,0.5);imshow(c2)下面程序把原图像变成100行100列图像,行数增加,使用插值函数完成颜色的填补。c=imread(D:earth.jpg);c2=imresize(c,100,100);imshow(c2),2.三种插值方法图像放大后,需要增加像素,计算新增加的像素颜色值一般使用插值的方法。常用的插值方法有:最近邻插值方法、双线性插值方法、双立方插值方法等。Imresize函数就使用这三种插值方法。,2.1.3 图像的旋转Matlab使用imrotate函数旋转图像。例如,使用下面命令段可以把图像逆时针旋转30度。B=imread(saturn.tif);imshow(B)figure imrotate(B,30,crop)这几句命令绘制出图2-7(a)与(b)图。参数crop是旋转的时候图像底板大小保持不变,图像大小也保持不变,【例2-10】使用imrotate函数旋转图像,制作动画效果。编写如下程序,可以制作出动画效果。I=imread(D:imageprocessLenaCircle.PNG);for i=1:10 imrotate(I,36*i,crop);end随着i的每次增加,图像依次逆时针旋转36度、72度、直到300度。旋转时的中间结果如图2-8所示。,2.2 图像的几何变换,2.2.1 画图软件中的图像扭曲 2.2.2 图像二维空间变换,【例2-11】使用imtransform函数实现图像平面扭曲功能。T=maketform(affine,.5 0 0;.5 1 0;0 0 1);I=imread(cameraman.tif);I2=imtransform(I,T);subplot(1,2,1)imshow(I)subplot(1,2,2)imshow(I2)程序的运行结果如图2-10所示。,2.3 图像的加减乘除运算,2.3.1 图像加减运算 2.3.2 图像的乘除运算,【例2-14】设计矩阵进行图像加减运算。A=imread(D:0045.jpg);s=size(A);%s(1),s(2)B=double(A);%Q1=zeros(s(1),s(2);%Q1大小与A一致Q2=zeros(s(1),s(2);for m=s(1):-1:1%从s(1)到1,每次减1 for n=s(2):-1:1 Q1(m,n)=m;Q2(m,n)=n;endend C(:,:,1)=B(:,:,1);C(:,:,2)=B(:,:,2)-Q2;C(:,:,3)=B(:,:,3)+Q1/3;,【例2-17】观察分析图像矩阵乘以或除以常数后图像亮度的改变。设计下面程序,程序运行结果是图2-18。A=imread(D:0010.jpg);A1=double(A);A2=A1*1.5;A3=A1/1.5;A2=uint8(A2);A3=uint8(A3);subplot(1,3,1);imshow(A)subplot(1,3,2);imshow(A2)subplot(1,3,3);imshow(A3),图像矩阵与图像矩阵进行逐元素对应乘除运算【例2-18】利用矩阵对应相乘把两个图像合成在一起。A=imread(D:0045.jpg);B=imread(D:0041.jpg);s=size(A);m=s(1),n=s(2);B1=imresize(B,m n);A=double(A);C=double(B1);D=A.*C/128;D=uint8(D);subplot(1,3,1);imshow(uint8(A)subplot(1,3,2);imshow(B)subplot(1,3,3);imshow(D),两个图像矩阵按照数学上定义的乘法进行运算,2.4 图像的特征值与奇异值,2.4.1 图像矩阵的特征值 2.4.2 图像矩阵的奇异值,1 图像矩阵特征值 矩阵特征值是这样定义的:设A是n n矩阵,如果数与n维非零向量X 满足方程 则称数为矩阵A的特征值,称非零向量X为矩阵A的特征向量。在计算数学中,一般用迭代的方法求取矩阵的特征值。Matlab提供了求取特征值的函数eig(A),其中A是参数,是要求取特征值的矩阵。,设计下面程序段:A=imread(D:shizi1.bmp);A1=rgb2gray(A);A2=double(A1);T=eig(A2);T运行程序后,得到灰度矩阵A1的特征值数据:,使用下面程序可以求出并且在命令窗口显示出图像的特征向量。A=imread(D:shizi1.bmp);A1=rgb2gray(A);A2=double(A1);G T=eig(A2);G变量G中存储的就是灰度图像A1的特征向量。,【例2-23】求图像矩阵的奇异值。下面程序是求图像shizi1.bmp的灰度矩阵的奇异值。A=imread(D:shizi1.bmp);A1=rgb2gray(A);A2=double(A1);T=svd(A2);T,2.5 图像逻辑运算,2.5.1 二值图像逻辑运算,【例2-27】对二值图像实施与、或、非、异或运算。A1=imread(D:1.bmp);A2=imread(D:11.bmp);A3=imread(D:0.bmp);A4=imread(D:00.bmp);B1=im2bw(A1);B2=im2bw(A2);B3=im2bw(A3);B4=im2bw(A4);C1=B1imshow(C4)程序运行结果如图2-28所示。,第3章 图像空间域处理与邻域操作,3.1 图像增强 3.2 图像的邻域操作 3.3 图像滤波函数及工作原理 3.4 图像膨胀与腐蚀,3.1 图像增强,3.1.1 灰度调整 3.1.2 灰度调整函数 3.1.3 彩色图像增强,统计每个颜色值的点的个数,即直方图统计的目的是为了确定增强的参数设置A=imread(pout.tif);A1=floor(double(A);s=size(A1);N=zeros(256);for i=1:s(1)for j=1:s(2)k=A1(i,j);N(k+1)=N(k+1)+1;endendbar(N),事实上,Matlab提供了函数imadjust、histeq、adapthiteq、brighten等进行灰度调整。可以在以后的研究工作中直接使用Matlab中这些函数调整图像灰度(颜色)对比度。,1.imadjust函数函数imadjust可以将图像的灰度值调整到一个指定的范围,实现类似例3-3的功能,以增强图像的明暗对比。【例3-4】使用函数imadjust对图像进行灰度调整。编写如下程序:A1=imread(pout.tif);B1=imadjust(A1,0.2 0.5,0,1);A2=imread(cameraman.tif);B2=imadjust(A2,0,0.2,0.5,1);subplot(1,4,1);imshow(A1)subplot(1,4,2);imshow(B1)subplot(1,4,3);imshow(A2)subplot(1,4,4);imshow(B2)程序的运行结果如图3-4所示。,2.stretchlim函数 函数stretchlim(A)是用来计算灰度矩阵A的最佳输入区间,即imadjust(I,LOW_IN HIGH_IN,LOW_OUT HIGH_OUT)中的第2个参数LOW_IN HIGH_IN。所谓最佳是指按照这个区间输入的话,图像的灰度对比度最大。例如,使用该函数计算例3-3中使用的图像的最佳输入区间为0.3059 0.6314;cameraman.tif的最佳输入区间为0.0353 0.8039。而下面例题3-5中的图像D:imageprocessIMG_7420.jpg的最佳截取输入区间为0.1608 0.6941。,3.histeq函数函数histeq能够自动完成图像灰度调整,一般用来增强图像的灰度对比度。【例3-6】使用函数histeq增强图像灰度对比度。使用下面程序能够得到图3-9所示效果。I=imread(tire.tif);J=histeq(I);subplot(1,2,1);imshow(I)subplot(1,2,2);imshow(J),4.brighten函数【例3-7】使用函数brighten增加灰度图像的亮度。设计下面程序:J=imread(D:imageprocessIMG_5943.jpg);A=rgb2gray(J);imshow(A)figure,imshow(A)brighten(0.6)figure,imshow(A)brighten(-0.6),RGB彩色图像增强【例3-8】使用函数imadjust对RGB彩色图像进行颜色调整。RGB1=imread(flowers.tif);RGB2=imadjust(RGB1,.2.3 0;.6.7 1);subplot(1,2,1)imshow(RGB1)subplot(1,2,2)imshow(RGB2),3.2 图像的邻域操作,3.2.1 邻域操作 3.2.2 Matlab邻域操作函数,邻域操作指在图像处理时,输入要处理像素的某邻域内各个像素值,输出要处理的像素的新值。邻域操作是图象处理(例如图像增强、图像滤波)时经常用到的方法。使用该方法处理图像时一般使用算子模板逐行(或逐列)在图像上滑动,滑动的时候对模板经过区域进行运算,把计算的结果作为区域中心像素的新值,所以有时也称为滑动邻域操作。,邻域操作方法充分地利用了图像相邻像素间的颜色关系,利用相邻像素间的颜色分布对图像进行平滑、增强、边缘提取、滤波、恢复等,图像的腐蚀与膨胀操作也可以看作是邻域操作的一种。,【例3-11】对小狮子图像进行邻域操作,使小狮子图像的轮廓变得清晰。编写如下程序,绘制出图3-15(c)所示图形。A1=imread(D:shizi1.bmp);A2=double(A1);A3=floor(A2(:,:,1)+A2(:,:,2)+A2(:,:,3)/3);C=-1-1-1-1 8-1-1-1-1;for i=2:15 for j=2:15 L=A3(i-1:i+1,j-1:j+1).*C;A4(i,j)=sum(sum(L);end endA4imshow(A4),1.nlfilter函数在Matlab中,nlfilter函数是最基本的邻域操作函数。该函数被调用的一般形式为:B=nlfilter(A,M N,FUN),其中A是被处理的图像,M N表示滑动块的高为M、宽为N。FUN是要对滑动覆盖区域进行操作的函数名,该函数可以是各种滤波算子,可以是任意定义的运算。,【例3-12】使用nlfilter函数进行图像邻域操作。编写下面程序,得到的结果显示在图3-17中。A=imread(D:shizi.bmp);A1=rgb2gray(A);subplot(1,2,1);imshow(A1);fun=inline(median(x(:);B=nlfilter(A1,3 3,fun);subplot(1,2,2);imshow(B),colfilt函数与nlfilter函数的另一个重要区别是colfilt函数在移动的时候可以在sliding与distinct两者中进行选择,而nlfilter函数只是执行sliding操作。colfilt函数在选择distinct时,滑动块不再逐象素滑动,而是逐块移动。看下面例题:【例3-15】使用colfilt函数进行图像邻域distinct操作。编写如下程序:A=imread(D:shizi1.bmp);A1=rgb2gray(A);A2=double(A1);f=inline(ones(16,1)*mean(x);B=floor(colfilt(A2,4 4,distinct,f),程序中distinct操作每次从前一个4 4图像块移动到下一个4 4图像块,移动时不互相重叠。一共移动了16次,如图3-20所示。,图3-20 使用colfilt函数distinct操作示意图,3.3 图像滤波函数及工作原理,3.3.1 滤波函数imfilter 3.3.2 滤波器的定义,函数imfilter是Matlab中使用较多的滤波函数,基本调用形式为:B=IMFILTER(A,H,OPTION)其中A为要进行滤波的图像矩阵,可以为多维的彩色图像矩阵(数组);H是已经定义的滤波算子。,【例3-17】使用函数imfilter对图像进行滤波,同时研究该函数的边界参数的意义。rgb=imread(D:125.jpg);h=ones(5,5)/25;rgb1=imfilter(rgb,h);rgb2=imfilter(rgb1,h,replicate);subplot(1,3,1),imshow(rgb),title(Original)subplot(1,3,2),imshow(rgb1),title(Filtered)subplot(1,3,3),imshow(rgb2),title(boundary replication),【例3-18】使用函数imfilter对图像进行滤波,观察滤波结果,分析几个滤波器的区别。rgb=imread(D:003.bmp);h1=0 0 0.0000 0.0021 0.0042 0.1958 0.1979 0.2000 0.1979 0.1958 0.0042 0.0021 0.0000 0 0;h2=1 2 1;0 0 0;-1-2-1;h3=0.1667 0.6667 0.1667 0.6667-3.3333 0.6667 0.1667 0.6667 0.1667;,rgb1=imfilter(rgb,h1);rgb2=imfilter(rgb,h2);rgb3=imfilter(rgb,h3);subplot(2,2,1),imshow(rgb),title(原图像)subplot(2,2,2),imshow(rgb1),title(运动滤波)subplot(2,2,3),imshow(rgb2),title(水平边缘增强)subplot(2,2,4),imshow(rgb3),title(拉普拉斯滤波),可以使用Matlab中的函数fspecial(T,P)产生一个由T指定的二维线性滤波器。参数T可以在下面选项中选取。average 均值滤波器 disk 圆形均值滤波器 gaussian 高斯低通滤波器 laplacian 二维拉普拉斯滤波器 log 高斯拉普拉斯滤波器 motion 运动滤波器 prewitt Prewitt水平边缘增强滤波器 sobel Sobel水平边缘增强滤波器,3.4 图像膨胀与腐蚀,3.4.1 二值图像的膨胀与腐蚀运算 3.4.2 灰度图像的膨胀与腐蚀 3.4.3 开运算与闭运算,图像膨胀与腐蚀也叫做数学形态学运算。一般来说对于二值图像,膨胀运算后图像中物体“加长”或“变粗”;腐蚀运算后图像中物体“收缩”或“细化”。下面先通过一些例题观察分析膨胀与腐蚀后的效果,【例3-22】对二值图像实施膨胀运算。A=imread(C:MATLAB6p5workbc.bmp);B=A;M=1;1;1;N=1 1 0;P=0 0 1;0 1 0;0 0 0;Q=0 0 1;0 0 0;1 0 0;C1=imdilate(B,M);C2=imdilate(B,N);C3=imdilate(B,P);C4=imdilate(B,Q);subplot(1,5,1);imshow(B)subplot(1,5,2);imshow(C1)subplot(1,5,3);imshow(C2)subplot(1,5,4);imshow(C3)subplot(1,5,5);imshow(C4),【例3-24】对二值图像实施腐蚀运算,并且与膨胀运算进行比较。A=imread(0370.bmp);B=im2bw(A);B=B;M=strel(diamond,3);C1=imerode(B,M);C2=imdilate(B,M);subplot(1,3,1);imshow(B)subplot(1,3,2);imshow(C1)subplot(1,3,3);imshow(C2),第4章 图像变换,4.1 图像Radon变换 4.2 Hadamard变换,4.1 图像Radon变换,4.1.1 函数Radon 4.1.2 函数Iradon,Matlab中提供了函数radon用来完成图像Radon变换,该变换实质上是计算指定方向上图像矩阵的投影。【例4-1】图像Radon变换。A=imread(D:0371.bmp);C,x1=radon(A,0);D,x2=radon(A,30);subplot(1,3,1);imshow(A)subplot(1,3,2);plot(x1,C)subplot(1,3,3);plot(x2,D)读入图像,然后调用radon函数,变换后绘制出图4-1(a)-(c)所示图形,为了更好地进行观察,绘制了二值图像0372.bmp,如图4-1(d)所示。使用上面程序,对0372.bmp进行变换,把程序中文件0371.bmp改为0372.bmp即可。得到的结果如图4-1(e)、(f)所示。从这个结果能进一步直观的理解Radon变换。,上面是课后习题8中给出的关于radon变换的定义,从这个定义进一步理解radon变换。,Matlab也提供了函数iradon用来进行逆Radon变换。例4-2先利用函数Radon计算一组旋转角度下的Radon变换C,C是二维数组,记载着对应于每个角度的变换后的数据。然后利用C及旋转角度,使用函数Iradon重建图像。见下一页,【例4-2】利用逆Radon变换复原图像。设计如下程序B=imread(D:0371.bmp);T=0:10:180;C,x=radon(B,T);%进行了19次若当变换D=iradon(C,T);subplot(1,3,1);imshow(B)subplot(1,3,2);imagesc(T,x,C)subplot(1,3,3);image(D)程序运行结果见下页图4-2,4.3 离散余弦变换,4.3.1 离散余弦变换函数 4.3.2 离散余弦变换的数学表达 4.3.3 离散余弦变换矩阵与基函数,离散余弦变换(DCT)将图像表示为具有不同振幅和频率的离散的余弦曲线或曲面的和。Matlab提供了函数dct2来计算图像的二维离散余弦变换。一幅图像的大部分可视特征信息都可以用少量的DCT系数来表示,图像的jpg压缩格式主要是基于离散余弦变换方法。,函数Dct2【例4-5】利用函数dct2对图像进行离散余弦变换。A=imread(D:6.bmp);B=imread(D:7.bmp);C=imread(D:a.jpg);C1=im2bw(C);A1=dct2(A);B1=dct2(B);C2=dct2(C1);subplot(1,6,1);imshow(A)subplot(1,6,2);imshow(A1)subplot(1,6,3);imshow(B)subplot(1,6,4);imshow(B1)subplot(1,6,5);imshow(C1)subplot(1,6,6);imshow(C2),几个复杂图像,【例4-7】利用函数idct2对图像进行逆离散余弦变换。D=imread(D:0066.jpg);D1=rgb2gray(D);s=size(D1);D2=dct2(D1);D3=idct2(D2);P=zeros(s);P1=P;P2=P;P3=P;P1(1:10,1:10)=D2(1:10,1:10);P2(1:30,1:30)=D2(1:30,1:30);P3(1:60,1:60)=D2(1:60,1:60);E1=idct2(P1);E2=idct2(P2);E3=idct2(P3);subplot(2,3,1);imshow(D1);subplot(2,3,2);imshow(D2);subplot(2,3,3);image(D3)subplot(2,3,4);image(E1);subplot(2,3,5);image(E2);subplot(2,3,6);image(E3)图形见下页:,【例4-10】设计程序,使其能够实现函数dct2的功能。A=imread(D:6.bmp);s=size(A);M=s(1);N=s(2);ap0=sqrt(1/M);ap=sqrt(2/M);aq0=sqrt(1/N);aq=sqrt(2/N);for p=1:M-1 for q=1:N-1 k=0;for m=0:M-1 for n=0:N-1 k=A(m+1,n+1)*cos(pi*(2*m+1)*p/(2*M)*cos(pi*(2*n+1)*q/(2*N)+k;end end B(p+1,q+1)=ap*aq*k;endend,【例4-11】设计程序生成离散余弦变换的变换矩阵。设计下面程序:M=14;for i=2:M for j=1:M P(i,j)=sqrt(2/M)*cos(i-1)*(2*j-1)*pi)/(2*M);endendP(1,:)=sqrt(1/M);P14=P运行程序能够得到14 14大小的变换矩阵P14。如何使用矩阵形式编写程序实现离散余弦变换?,【例4-12】编制程序实现逆离散余弦变换。程序较长,参考教材:程序的难点在于循环语句嵌套在一起,中间又有分支语句。分支语句是为了解决分别有两个值的问题。程序利用分支语句把各种情况都考虑进来,把第一行第一列都计算出来,是一个比较完整的程序。,1.离散余弦变换矩阵生成函数dctmtxMatlab提供了函数dctmtx来生成离散余弦变换矩阵,相当于例4-11实现的功能。【例4-13】利用函数dctmtx生成离散余弦变换矩阵,然后使用该变换矩阵对图像进行离散余弦变换。A0=imread(D:a.jpg);A=im2bw(A0);s=size(A);M=s(1);N=s(2);P=dctmtx(M);Q=dctmtx(N);B=P*A*Q;实验结果显示与例4-5中得到的C2结果相同。(即语句C2=dct2(C1);得到的结果一样),3.离散余弦变换基函数基函数是数学上一个非常重要的概念。1、x、x2、x3乘以系数加到一起能够组合成任意的多项式,1、x、x2、x3就是一组基函数。简单有规律的基函数可以构造出一个函数集合或者函数空间。离散余弦变换可以用它的基函数组合而成。下面4-4式就表示离散余弦变换的基函数,一共M*N个。,下面是用图像显示的8*8的离散余弦变换的基函数:,上机或者课后作业:1修改例4-10中的程序,使其也能够计算出变换后第一行与第一列的值。2修改例4-11中的程序,把该程序修改成为函数,使其输入参数M,就能够计算出M阶的离散余弦变换的变换矩阵。,第5章 图像分析,5.1 图像的灰度统计特性 5.2 图像的轮廓提取与区域分割 5.3 图像的四叉树分解 5.4 图像的纹理分析 5.5 图像的图形化 5.6 视频图像,5.1 图像的灰度统计特性,5.1.1 图像的象素操作 5.1.2 图像的区域属性度量 5.1.3 图像的颜色直方图 5.1.4 图像的方差及相关系数,其实对图像进行的最基本操作是对图像进行像素操作。在目前的计算方式下,对图像进行的一切操作本质上都是从像素开始的。与很多语言一样,Matlab也提供了图像(图形)像素操作功能。Matlab的像素操作函数有pixval与impixel等。,1.pixval函数pixval函数可以交互显示图像上像素的颜色值。该函数还可以显示两个像素点之间的欧氏距离。【例5-1】pixval函数的使用。A=imread(D:0059.jpg);A1=rgb2gray(A);A2=dct2(A1);A3=fft2(A1);subplot(1,4,1);imshow(A)subplot(1,4,2);imshow(A1)subplot(1,4,3);imshow(A2)subplot(1,4,4);imshow(A3)pixval;交互取点情况见下图,【例5-2】impixel函数的使用。A=imread(D:0059.jpg);A1=rgb2gray(A);A2=dct2(A1);A3=fft2(A1);subplot(1,4,1);imshow(A);x1,y1,B1=impixelsubplot(1,4,2);imshow(A1);x2,y2,B2=impixelsubplot(1,4,3);imshow(A2)subplot(1,4,4);imshow(A3)程序运行后,先显示第一个子图,然后等待选取。单击要选取的位置,再右击,该位置的坐标以及该点的颜色值被存储在x1,y1,B1中。同时,第二个子图出现,同样操作后,坐标以及颜色值被存储在x2,y2,B2中。,图像的区域属性有面积值、图像中的洞孔数目、图像的质心等。本节先分别使用函数bwarea()与bweuler()计算二值图像的前景面积与图像中的洞孔数目。然后自编程序计算图像质心,接着介绍Matlab的特征计算函数imfeature()。最后使用这些函数编写几个程序解决实际问题。,1.区域面积【例5-4】使用bwarea函数计算二值图像的前景面积。A=imread(D:6.bmp);%A、B、C、D都是二值图像B=imread(D:0.bmp);C=imread(D:shouxieshuzi.bmp);D=imread(D:0371.bmp);E0=imread(D:0059.jpg);E=im2bw(E0);k(1)=bwarea(A);k(2)=bwarea(B);k(3)=bwarea(C);k(4)=bwarea(D);k(5)=bwarea(E);subplot(1,5,1);imshow(A)subplot(1,5,2);imshow(B)subplot(1,5,3);imshow(C)subplot(1,5,4);imshow(D)subplot(1,5,5);imshow(E)k%图在下面,k=1.0e+005*0.0076 0.0254 0.1487 0.1669 1.8463因为图像大小不同,在Matlab的subplot中显示为一样大小。但实际上数据是准确的。,【例5-5】使用bweuler函数计算二值图像的欧拉数。设计下面程序:A=imread(D:shouxieshuzi.bmp);A1=A;B=imread(D:003.bmp);B=im2bw(B);B1=B;ka=bweuler(A1)kb=bweuler(B1)subplot(1,2,1);imshow(A1)subplot(1,2,2);imshow(B1)程序的运行结果是:ka=9,kb=-2。,【例5-8】函数imfeature的调用方法。A=imread(D:8.bmp);L=bwlabel(A);sta=imfeature(L,Area,Centroid)程序运行结果是:sta=Area:3155 Centroid:37.6019 67.2447在使用函数imfeature(L,P)时,可以在参数P的位置写入Area、Centroid、BoundingBox等,能够直接计算出相应的特性。图像8.bmp只有一个连通区域,所以只计算出一个面积,一个质心。,5.图像区域特性计算应用实例【例5-10】计算数字的欧拉数识别数字8。使用Windows的画图书写印刷体数字如图5-8所示,以二值方式存储在D盘,文件名为shibie8yi.bmp。编写下面程序:A=imread(D:shibie8yi.bmp);L=bwlabel(A);e=imfeature(L,EulerNumber);for i=1:25 e(i)endimshow(A)欧拉数为-1的就是数字8。,下面是一个完整的程序,能够计算出图5-8中图像的8在第几个区域。A=imread(D:shibie8yi.bmp);L=bwlabel(A);e=imfeature(L,EulerNumber);imshow(A)for i=1:25 if e(i).EulerNumber=-1 i endend计算结果是打印出8、16、19。即第8个、第16个、第19个数字。,1.灰度图像直方图【例5-12】求灰度图像直方图。A=imread(D:0067.jpg);B0=rgb2gray(A);B=double(B0);s=size(B);h=zeros(1,256);for i=1:s(1)for j=1:s(2)k=B(i,j);k=floor(k);h(k+1)=h(k+1)+1;endendsubplot(1,3,1);imshow(B0)subplot(1,3,2);imhist(B0)subplot(1,3,3);plot(h)程序的运行结果如图5-9所示。,(a)原图像(b)imhist函数绘制的直方图(c)自编程序语句绘制的直方图 图5-9 计算并绘制图像的直方图,【例5-15】使用函数mean2计算图像的均值。下面两条语句构成的程序就可以计算图像的均值。A=imread(D:6781.bmp);m=mean2(A),【例5-16】计算向量的标准偏差。设计下面程序:A=1 2 5 6 8 9;m=mean(A);s0=0;for i=1:6 s0=s0+(A(i)-m)2;ends1=s0/5;s=sqrt(s1)该程序计算向量A的标准偏差,计算的结果是:3.1885,【例5-19】使用函数corrcoef计算几个图像的相关系数。for i=1:5 k=int2str(i);k1=strcat(D:,k,a.bmp);B1(i,:,:)=imread(k1);k2=strcat(D:,k,b.bmp);B1(i+5,:,:)=imread(k2);subplot(2,5,i),C(:,:)=B1(i,:,:);imshow(C);subplot(2,5,i+5),C(:,:)=B1(i+5,:,:);imshow(C);endC1(:,:)=B1(1,:,:);C2(:,:)=B1(2,:,:);C3(:,:)=B1(3,:,:);C4(:,:)=B1(4,:,:);C5(:,:)=B1(5,:,:);C6(:,:)=B1(6,:,:);C7(:,:)=B1(7,:,:);C8(:,:)=B1(8,:,:);C9(:,:)=B1(9,:,:);C10(:,:)=B1(10,:,:);M=corrcoef(double(C1),double(C2)%图像在下页,(a)1a(b)2a(c)3a(d)4a(e)5a,(f)1b(g)2b(h)3b(i)4b(j)5b,5.2 图像的轮廓提取与区域分割,5.2.1 图像的轮廓提取 5.2.2 图像的边缘轮廓提取方法分析 5.2.3 图像的区域分割,图像的轮廓提取主要依据图像本身的颜色分布。例如提取二值图像轮廓可以查找某个非零像素点临近是否有0点,0元素是如何分布的;提取灰度图像轮廓可以凭借灰度分布的梯度(导数),梯度变化比较大的地方就是轮廓;提取彩色图像轮廓时,可以把图像化为灰度图像,然后进行提取,也可以根据某个彩色分量矩阵直接提取图像轮廓。,Matlab提供了二值图像轮廓提取函数bwperim。【例5-20】使用函数bwperim提取二值图像的轮廓。设计下面程序:A=imread(D:6782.bmp);EA=bwperim(A);subplot(1,2,1)imshow(A)subplot(1,2,2)imshow(EA)该程序的运行结果如图5-15所示。,【例5-22】使用函数imcont