最新Matlab图像处理命令和教程.ppt

上传人:本田雅阁 文档编号:2808117 上传时间:2019-05-20 格式:PPT 页数:377 大小:5.08MB
返回 下载 相关 举报
最新Matlab图像处理命令和教程.ppt_第1页
第1页 / 共377页
最新Matlab图像处理命令和教程.ppt_第2页
第2页 / 共377页
最新Matlab图像处理命令和教程.ppt_第3页
第3页 / 共377页
最新Matlab图像处理命令和教程.ppt_第4页
第4页 / 共377页
最新Matlab图像处理命令和教程.ppt_第5页
第5页 / 共377页
点击查看更多>>
资源描述

《最新Matlab图像处理命令和教程.ppt》由会员分享,可在线阅读,更多相关《最新Matlab图像处理命令和教程.ppt(377页珍藏版)》请在三一文库上搜索。

1、图 像 处 理,2010. 9,课程介绍 MATLAB工具介绍 图像处理的内容 复习总结,2019/5/20,图像处理的研究内容 学习目的与学习方法 教材与参考书,课程介绍,1.图像 2.图像几何操作 3.图像代数运算与逻辑运算 4.图像变换 5.图像分析 6.图像应用研究,2019/5/20,4,图像处理的研究内容,2019/5/20,5,学习目的: 使用MATLAB这个工具学习图像处理技术。 了解图像的计算机表示方法,掌握图像的各种加减乘除运算 及一些经典的处理方法,例如:各种图像变换、图像逻辑运算、数学形态学运算、图像编码与压缩、四叉树分解、纹理分析以及视频图像等内容。 通过学习使学生能

2、够对图像有比较全面深刻的了解,为以后从事图像方面的研究作好准备。 学习方法: 听教师讲解,把思考与上机操作结合起来,其中上机操作 很重要。,学习目的与学习方法,2019/5/20,6,基于Matlab的图像处理 清华大学出版社 2008年,教材与参考书,2019/5/20,7,第一章 图像,1.1 Matlab的命令使用与程序设计 1.2 图像表示方法 1.3 基于图像的动画制作,2019/5/20,8,1.1 Matlab的命令使用与程序设计,命令窗口的使用 许多简单的计算工作都可以在命令窗口中完成,例如:数的运算,向量与矩阵计算,符号运算等。 在命令窗口中执行命令语句可以一句一句执行,清晰

3、方便。但是,有很多复杂的工作还是需要进行程序设计。,2019/5/20,9,M-File程序设计,使用菜单项中的文件选项,选择FilenewM-File菜单,在弹出的窗口中编辑与运行程序。 运行程序使用Debug菜单中的Run命令,或者直接点击工具条中的按钮(Save and Run)。程序的运行结果显示在命令窗口中图形输出在图形窗口中。 程序中的变量以及变量的维数等信息可以在命令窗口左上部的workspace中找到。,2019/5/20,10,【例1-2】 使用程序,绘制颜色渐变的图形(图像)。 使用下面程序段,绘制出图1-1(a)所示图形。 for i=1:20 for j=1:30 a(

4、i,j)=i end end image(a) 在程序的循环过程中,数组a中的第一行所有列的元素的值都设为1,第二行所有列的元素的值都设为2,第二十行所有列的元素都设为20。所以图1-1(a)呈现出行渐变的效果。,图1-1(a),使用下面程序段,绘制出图1-1(b)所示图形。 for j=1:30 for i=1:20 a(i,j)=j end end image(a) 在程序的循环过程中,数组a中的第一列所有行的元素的值都设为1,第二列所有行的元素的值都设为2,第三十列所有行的元素都设为30。所以图1-1(b)呈现出列渐变的效果。 函数image(a)是利用矩阵(二维数组)a中的数值绘制图像

5、,数值越大,对应点的颜色越亮;数值越小,对应点的颜色越暗。,图1-1(b),2019/5/20,12,Figure窗口的图形操作功能,Figure窗口主要功能是输出图形或显示图像。 Figure窗口的菜单包括:File菜单,Edit菜单,Insert菜单,Tools菜单,View菜单。 Figure窗口的工具条与菜单的一些常用功能对应。,2019/5/20,13,单元数组与结构体,单元数组中的每个元素称为单元(cell),单元可以包含任何类型的数据。可以使用两种方法创建一个单元数组,一个是通过赋值语句直接创建;一个是利用cell函数先为单元数组开辟一个内存空间,然后再给各个单元赋值。 结构体与

6、单元数组非常相似,与单元数组不同的是,结构体的组成成员称为字段(fields),结构体采用点号来调用(访问)字段中的数据。,【例1-4】 结构体的创建、显示与调用。 circle1.r=0:0.1:1; circle1.center=rand(2,11); circle1.color=red,green,yellow circle1 = r: 0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 0.7000 0.8000 0.9000 1 center: 2x11 double color: red green yellow,2019/5/20,15,上述命

7、令创建了一个结构体并且赋值。下面是对结构体成员的调用: circle1.center ans = 0.7919 0.7382 0.4057 0.9169 0.8936 0.3529 0.0099 0.2028 0.6038 0.1988 0.7468 0.9218 0.1763 0.9355 0.4103 0.0579 0.8132 0.1389 0.1987 0.2722 0.0153 0.4451, circle1.color(1) ans = red circle1.center(5,8) ? Index exceeds matrix dimensions. circle1.center

8、(2,8) ans = 0.1987,自定义函数,Matlab拥有大量的库函数,也允许用户自己定义函数。 与其他语言一样,Matlab中的函数具有通用性,给定参数就能输出函数值,或者执行一定的工作; 函数具有重用价值,有些经常使用的程序段都可以作成函数,以备调用。与有些语言不同,Matlab中函数的制作与调用更加简单。,【例1-5】修改函数polt2D,使其能够输入参数控制曲线的绘制区间,然后使用subplot命令在一个图形窗口中绘制多条曲线。 修改polt2D如下: function plot2Dnew(a,b) x=a:0.1:b; y1=sin(x); y2=cos(x); y=y1-y

9、2; plot(x,y) 保存这个函数名为plot2Dnew。在调用这个函数的时候可以利用a,b的值控制曲线的绘制区间。,编写如下程序: subplot(1,4,1);plot2Dnew(2,7) subplot(1,4,2);plot2Dnew(2,6) subplot(1,4,3);plot2Dnew(-10,10) subplot(1,4,4);plot2Dnew(5,7) 该程序段绘制出的图象如下图所示。,2019/5/20,20,Matlab的矩阵操作,Matlab提供了许多函数用来生成工具矩阵。 【例1-6】 使用函数生成工具矩阵,并把这些矩阵绘制成图形。 a(1,:,:)=zer

10、os(64); a(2,:,:)=eye(64); a(3,:,:)=rand(64); a(4,:,:)=randn(64); a(5,:,:)=hilb(64); for i=1:5 subplot(1,5,i) b=a(i) image(b*255) end,2019/5/20,21,程序中的image函数是用来根据矩阵绘制图像的,该函数把二维矩阵绘制成为灰度图像,默认时要求参数矩阵的值位于0到255之间,值越大,颜色越接近白色。矩阵b的值是0到1之间的数,乘以255后,变成了0到255之间的数。,(1) zeros,(2) eye,(3) rand,(4) randn,(5) hilb

11、,常用的矩阵操作函数 矩阵翻转函数 Fliplr()是矩阵左右翻转函数,flipud() 是矩阵上下翻转函数,rot90()是把矩阵逆时针旋转90度。 求矩阵的最值与均值 Max()取最大分量,min()取最小分量,mean()求均值,median()求中值。 矩阵元素的选取 用a(i, j)可以实现数组元素的调用,除了这种基本的调用外,Matlab还提供了“:”方法。 reshape函数、repmat函数与cat函数,【例1-9】计算矩阵的最值与均值。 在命令窗口输入h=rand(6),按Enter键,得到矩阵入下: h = 0.1210 0.8656 0.0498 0.1708 0.393

12、2 0.9342 0.4508 0.2324 0.0784 0.9943 0.5915 0.2644 0.7159 0.8049 0.6408 0.4398 0.1197 0.1603 0.8928 0.9084 0.1909 0.3400 0.0381 0.8729 0.2731 0.2319 0.8439 0.3142 0.4586 0.2379 0.2548 0.2393 0.1739 0.3651 0.8699 0.6458 输入m,i=max(h),按Enter键,有结果: m = 0.8928 0.9084 0.8439 0.9943 0.8699 0.9342 i = 4 4 5

13、 2 6 1 返回的结果是每列最大值以及最大值所在的行标。,输入m1,j=max(m),按Enter键,有结果 m1 = 0.9943 j = 4 上面结果说明矩阵h的最大值在第2行,第4列。 求一个矩阵的最值,一般都是使用两次max(或min)函数。很多矩阵操作函数都是先对每列操作,然后再对行操作,例如: 对于函数表达式k=mean(h),返回值是每列的平均值。,【例1-10】使用“:”调用数组元素。 还使用上面的数组a,输入命令b=a(3, :),按Enter键,有结果 b = 3 4 5 语句b=a(3, :)的功能是把数组a的第三行所有元素调用出来赋给数组b。如果输入命令b=a(:,3

14、),按Enter键,有结果 b = 3 4 5 6 7 语句b=a(:, 3)的作用是把数组a的第三列所有元素赋给数组b,b是5行1列的数组。,“:”在Matlab中的作用就是从到,例如for i=1:6,这里面的“:”就是从1到6的意思。 b=a(:,3)中的“:”也是从到的意思,只有一个冒号,省略了冒号前后的数,含义是从矩阵的第1行到最后一行的意思。既在上面的实验中b=a(:, 3)与b=a(1:5, 3)结果是一样的。 如果输入命令b=a(1:2,3); b,按Enter键,则有结果 b = 3 4 语句b=a(1:2,3)的含义是取第1行到第2行,并且在第3列上的所有元素赋给数组b。

15、【思考题】 b=a(1:2,2:3)能够得到一个什么样的矩阵?,多维数组与图象矩阵,多维数组 :可以用工具矩阵创建多维数组可以利用索引方法生成多维数组,可以利用函数reshape生成多维数组。 图象矩阵:图象在计算机中就可以看作是以矩阵的方式存储与操作的,【例1-11】使用imread( )函数读取序列图像。,在命令窗口中输入语句A=imread(d:12.gif),执行后在命令窗口显示出图象12.gif的数据(如图1-7所示)。 图象文件12.gif存储在D盘根目录下,图象12.gif是宽高均为20的彩色图象,是QQ中的表情:。 从读出的数据分布能够看出眼睛与嘴的位置。,图1-7 图像与数据

16、,实际上,12.gif是个序列图象,可是用imread(d:12.gif)函数只是返回了一个静态的图象的数据。12.gif是一个小动画,一共有7幅图片(象)组成,使用下面的程序段可以把这个序列图像都读出来,变成一个4维数组。 m=uint8(zeros(20,20,1,7); for i=1:7 m(:,:,:,i),map=imread(d:12.gif,i); end 这个程序段得到了4维数组m,一共7页,第一页就是图1-7中显示的矩阵。4维数组m表示图象的大小是(20,20,1,7),20、20表示图像的宽与高,1表示用一组(0到255的)数表示颜色(而不是象RGB图象那样用三组0到25

17、5种颜色表示),7表示页数。 序列图像是有联系的一些图像的集合。从上面例题可以初步得到结论:序列图像对应着4维数组。,1.2 图像表示方法,图像的数字化 图像:每个图像本质上是一个非常复杂的数学函数,这个数学函数一般是不能用解析式子表示的。图像具有不规则性、自然性、复杂性。 图像的数字化:随着数字摄像技术的诞生,数字图像成为科学研究及应用领域的研究重点。在计算机中,图象被看作是一些数字矩阵。,图像的读取与显示,图像的读取:函数imread()用来读取图像,把图像数据读出以后,可以赋给一个变量。 图像数据的调用:既然图像数据是存储在数组中,那么调用图像数据就变成了操作数组元素。 图像的显示:函数

18、imshow( )用来显示图像,函数imview( )、image( )、imagesc( )也可以用来显示图像。函数montage( )用来在一个窗口中显示多帧图像。,M=uint8(zeros(128,128,1,27); for i=1:27 M(:,:,:,i),map=imread(D:Program FilesMATLAB71toolboximagesimdemosmri.tif,i); end montage(M, map),【例1-12】函数montage( )的使用方法。 使用下面程序可以读出mri图像数据并且绘制出图1-12所示图形。,图1-12 使用函数montage显示

19、图像,函数montage(M, map)在一个图形窗口中显示M内的多帧索引图像。如果不是索引图像,去掉参数map就可以了。 索引图像mri.tif颜色表实际上只有89种颜色,颜色强度都已经转化为0到1之间。,下面5行3列数据是颜色表的前5种颜色: 0 0 0 0.0078 0.0078 0.0078 0.0196 0.0196 0.0196 0.0314 0.0314 0.0314 0.0431 0.0431 0.0431,下面5行3列数据是颜色表的最后5种颜色: 0.9569 0.9569 0.9569 0.9686 0.9686 0.9686 0.9804 0.9804 0.9804 0.

20、9922 0.9922 0.9922 1.0000 1.0000 1.0000,下面数据截取自M中的一帧,从数据可以看到数值都介于0到88之间。,这些数值分别映射到颜色表中,对应着颜色表中的颜色。例如数值是88的像素颜色值为1.0000 1.0000 1.0000,数值是85的像素颜色值为0.9569 0.9569 0.9569。,图像的分类,图像的分类: 灰度图像,二值图像,RGB图像,HSV图像,索引图像 【例1-14】HSV图像的3个分量显示。 设计下面程序,显示一幅图像的H、S、V分量。 B=imread(D:117.jpg); B2=rgb2hsv(B); B11=B2(:,:,1)

21、; B12=B2(:,:,2); B13=B2(:,:,3); subplot(1,4,1); imshow(B) subplot(1,4,2); imshow(B11) subplot(1,4,3); imshow(B12) subplot(1,4,4); imshow(B13) 程序运行结果如图1-16所示。,原图像 (b) H阵 (c) S阵 (d) V阵 图像类型的转换: Matlab提供了图像类型转换函数,可以完成图像在各个类型之 间的转换。 Matlab的数据文件: save函数,load函数,exist命令与delete命令,另外,Matlab中 还有其他很多操作文件的命令函数,

22、可以参考相关资料。,1.3 基于图像的动画制作,序列图像 序列图像,JPG图像格式,GIF图像(静态 GIF和动画GIF),MPEG图像(包括 MPEG-1 、 MPEG-2 、 MPEG-4 、MPEG-7等 ),图1-19 逐幅显示的GIF图像,【例1-15】读取GIF动画图像并逐幅显示出来。 GIF动画图像lanqiu.gif存储在D盘根目录下,编写如下程序,读取该图像并逐幅显示,显示的结果在图1-19中。 m=uint8(zeros(127,91,4); for fr=1:4 m(:, :, fr),map=imread(d:lanqiu.gif,fr); m1(:, :, :, fr

23、)=ind2rgb(m(:, :, fr),map); subplot(1,4,fr) imshow(m1(:, :, :, fr) axis off end,该程序首先使用uint8(zeros(127,91,1,4)创建了一个四维全零数组,数据类型为无符号整型,数组名为m。 在编写程序前,事先查看图像lanqiu.gif的属性,得知该图像的高为127,宽为91,一共四幅,所以创建的数组大小为(127,91,4)。 在循环语句中,顺序读出四幅图像的数据,然后使用subplot(1,4,fr) 把四幅图像显示在一个图形窗口中。 语句m(:, :, fr),map=imread(d:lanqiu

24、.gif,fr)读出每一幅图像的数据矩阵与映射矩阵。 语句m1(:, :, :, fr)=ind2rgb(m(:, :, fr),map)是把读出的索引图像变为RGB彩色图像。 axis off是不显示坐标轴。,图像播放,使用图像显示函数播放图像 使用pause函数与image函数等顺次播放图像。 使用movie函数播放图像 【例1-17】使用movie函数播放图像。 编写如下程序,能够实现图像播放 for i=1:4 k=int2str(i); k1=strcat(e:ziranjingguan,k,.bmp); a1=imread(k1); image(a1); m(:,i)=getfra

25、me; end movie(m,15),在这个程序中,使用了图像播放函数movie(m,15),该函数能够按照固定时间间隔播放存储在多维数组m中的图像。 k=int2str(i)是把i从数值形式变成字符形式,然后赋给变量k; k1=strcat(e:ziranjingguan,k,.bmp)是把字符串e:ziranjingguan 与k连接后再连接.bmp,得到了图像文件存储的位置; a1=imread(k1)是读入图像数据赋给数组变量a1; 然后在图形窗口中使用image(a1)显示数组a1所代表的图像; m(:,i)=getframe是从图形窗口上取当前图形(图像),把数据赋给数组变量m的

26、第i页。 movie(m,15)是连续播放15次。 上面例1-17程序中的语句image(a1)是不可缺少的,因为getframe需要从图形窗口中获得图像数据。,基于图像的动画制作,绘制图像制作动画: 【例1-18】绘制序列图像制作动画。 下面图1-20中的3个图象是用画图工具绘制出来的,分 别命名为1.jpg、2.jpg与3.jpg,存储在E盘根目录下。,图1-20 制作动画的三幅图像,下面程序使用getframe函数装载这几幅图像,使用movie函数播放这几幅图像就是完成了一个动画制作。 for i=1:3 k=int2str(i); k1=strcat(e:,k,.jpg); a1=im

27、read(k1); image(a1); m(:,i)=getframe; end movie(m,10) 目前一些动画制作就是使用这种方式,先手动绘制大量的具有连续内容的图片,然后扫描(或利用其他输入方式)输入到机器中,最后把这些图像组织到一起,进行播放。,切割图像制作动画: Matlab提供了函数imcrop(A,i,j,m,n)用来对图像进行切割,其中参数A是被切割图像矩阵,(i,j)表示被切割区域的左上角顶点,(m,n)表示被切割区域的右下角顶点。 【例1-19】使用切割图像函数制作动画。,A=imread(D:111.jpg); a=50; b=50; for i=1:50 a=a-

28、1; b=b+1; A1=imcrop(A,a,a,b,b); imshow(A1) end,右面程序使用imcrop函数,利用一幅图像制作出了动画效果。 程序运行后,先从图像中间开始显示小块,逐渐向四周扩大显示范围,连续起来形成了动画。,完整的图像如图1-21(a)所示。 图1-21(b)是当i=5时切割出来的图像 (c)是当i=15时切割出来的图像 (d)是当i=30时切割出来的图像 (e)是当i=50时切割出来的图像。,(a),(b),(c),(d),(e),利用图像颜色与亮度变化制作动画: 【例1-21】逐渐减少RGB图像的绿色成分,完成一个颜色渐变的动画。 编写程序如下: I=imr

29、ead(D:114.jpg); I1=I(:,:,2); s=size(I1); a=ones(s(1),s(2); I2=double(I1); for i=1:50 I2(:,:)=I2(:,:)-a*i; I(:,:,2)=I2(:,:); imshow(I) end,程序的运行结果是一 个颜色渐变的动画。,为了把颜色渐变情况在一个窗口中展示出来,下面程序绘制出一些中间帧,如图1-23所示。 I=imread(D:111.jpg); I1=I(:,:,2); s=size(I1); a=ones(s(1),s(2); I2=double(I1); for i=1:8 I2(:,:)=I2

30、(:,:)-a*i*5; subplot(2,4,i) I(:,:,2)=I2(:,:); imshow(I) end,图1-23 图像的绿色成分逐渐减少,第2章 图像几何操作,2.1 图像的缩放旋转与裁剪 2.2 图像的几何变换,2.1 图像的缩放旋转与裁剪,图像的裁剪 imcrop函数:该函数有两个参数,一个用来指定裁剪图像,一个用来定义裁剪矩形。 自定义区域对图像进行裁剪:Matlab中提供了定义多边形区域的函数roipoly,可以使用该函数定义多边形区域,然后实行裁剪操作。直接调用roipoly函数可以交互实现任意多边形的区域选取。,图像的缩放,imresize函数缩放图像: 【例2-

31、2】使用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) 【思考题】把图像放大到原来的3倍,如何修改程序?,三种插值方法 最近邻插值方法:最近邻插值方法是imresize函数默认的插值方法。 双线性插值方法 双立方插值方法 Imresize函数就使用这三种插值方法。,

32、图像的旋转,Matlab使用imrotate函数旋转图像。例如,使用下面命 令段可以把图像逆时针旋转30度。 B=imread(ic.tif); imshow(B) figure imrotate(B,30, crop) 这几句命令绘制出图2-4(a)与(b)图。,(a)原图像,(b)逆时针旋转30度,(c)逆时针旋转30度,调用语句imrotate时,如果不写参数crop,写为imrotate(B,30),那么旋转后的图像大小不变,而图像的底板一般会变大,如图2-4(c)所示。 与图像缩放一样,这里的插值也是三种形式,最近邻插值、双线性插值与双三次插值,默认为最近邻插值。 Imrotate函

33、数调用的一般形式为:imrotate(A, Angle, Method, Bbox) 其中参数Method为插值方法,调用函数时,如果需要指定插值方式的话,在参数Method的位置上注明nearest、bilinear或者bicubic。 参数Bbox为loose时,旋转图形如2-4(c)所示,底板扩大,为默认形式;参数Bbox为crop时,旋转图形如2-4(b)所示,底板不变,图像可能被切割。 【思考题】修改命令,把图像顺时针旋转90度。,2.2 图像的几何变换,图像的几何变换是指图像几何操作后,内部结构比例 等发生变化,但整体布局与形状没有改变。包括图像扭 曲、图像二维空间变换、距离变换等

34、内容。 画图软件中的图像扭曲 在图像处理软件中,都提供了图像扭曲的功能。例如 , Windows中简单的画图软件:打开拉伸扭曲窗口,在 扭曲组合框中修改水平参数为20,那么点击确定后,白 色画板上的图像就会水平扭曲20度。,图像二维空间变换 图像二维仿射变换 Matlab使用imtransform函数完成图像空间变换。imtransform函数的调用形式为:imtransform(I,T),其中参数I是要变换的图像,T是由maketform函数产生的变换结构。 在函数maketform(P,)中,参数P可以是以下形式: affine 仿射变换形式 projective 投影变换形式 custo

35、m 自定义函数进行变换 box 依靠函数中的另外参数产生仿射变换结构 composite 该参数实现多次调用tformfwd功能,函数maketform就是利用给定的参数建立变换结构,然后把该变换结构赋给结构体变量(例如赋给T)。根据得到的结构体变量T,调用函数imtransform(I,T)进行变换。 图像二维投影变换 二维变换投影可以把一幅图像按照近大远小的规律投影到一个平面上,产生立体的效果。运用好函数maketform中的两个向量,能够绘制出很多特殊效果的图形。 【思考题】根据给定的函数maketform中的两个向量求变换矩阵。,2.3 图像的邻域操作,邻域操作 图像小狮子的颜色数据详

36、见课教材, 由于图像很小,所以可以把数 据显示在一起,以便进行比较。 小狮子图像是方形的,高与宽都为16。A1(:,:,1) 、A1(:,:,2) 与 A1(:,:,3)分别代表图像的红色(R)、绿色(G)与蓝色阵(B)。这个小图像 是使用RGB颜色形式表示颜色的。三个颜色矩阵合在一起形成了各种 颜色,例如:A1(:,:,1) 、A1(:,:,2) 与A1(:,:,3)的左上角的数据都是 255,所以合在一起左上角呈白色。 教材中的数据是使用语句A1=imread(D:shizi1.bmp)读入的 ,使 用下面程序段能够把小狮子图像化为灰度图像。A1=imread(D:shizi1.bmp);

37、 A2=double(A1); A3=floor(A2(:,:,1)+A2(:,:,2)+A2(:,:,3)/3),【例2-10】对小狮子图像进行邻域操作,使小狮子图像的轮廓变得清晰。 编写如右面的程序,绘制出图2-10(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);

38、 end end A4 imshow(A4),图2-10 对小狮子图像进行邻域操作后的结果,(a) (b) (c) (d),该程序中,首先把图像读入,然后使用语句A2=double(A1)把图像数据变为浮点型数据。再通过语句A3=floor(A2(:,:,1)+A2(:,:,2)+A2(:,:,3)/3)把彩色图像变为灰度图像。变为灰度图像的方法就是把三种颜色值加在一起然后除以3。floor函数用来实现取整功能。A3为二维数组,此时A3中存储着灰度图像数据。 程序中定义了行数列数都为3的矩阵C,该矩阵称为滑动块矩阵,也叫做掩膜矩阵,很多书上都称之为滤波器。 在例题2-10中,一共调用了滑动块矩

39、阵C (15-2+1)*(15-2+1)=196次,总计得到了矩阵A4的196个元素。为了计算方便,i、j都是从2开始循环,所以矩阵A4的第一行元素与第一列元素都默认为0,图2-10(c)有黑色的左边框与上边框。,下面利用图2-11进一步讲解邻域操作的过程。,图2-11,运行例2-10中程序后,在矩阵C上进行滑动的时候,首先从图2-11左上角开始,修改的是原图像的(2,2)元素,修改该元素的方法是: 1使用滑动块矩阵C= 与 (即以 原图像的(2,2)元素为中心的3*3邻域矩阵)对应元素相乘,得到了新的3*3矩阵D= 2把新得到的矩阵D的所有元素相加,和作为新图像的(2,2)元素的值。程序中使

40、用的语句为:A4(i,j)=sum(sum(L)。该例子中,新图像的(2,2)元素的值为0。,例题2-10修改的第2个元素是(2,3),然后是(2,4),(2,15)。(2,16)没有修改。接着修改第3行(3,2)到(3,15)元素,如此下去,最后一行没有修改。实际上就是图像最外面一圈元素没有修改,共记60个元素没有修改。 使用语言编写程序对图像进行邻域操作时,主要是利用多重循环语句实现。 【注】1. 语句A3(i-1:i+1,j-1:j+1).*C中乘法是两个大小一样的矩阵对应元素相乘。 2. 例题2-10得到的新矩阵A4有很多负值,使用imshow函数能够自动对矩阵数据按比例进行调整。图2

41、-10 (d)是在原程序语句A3=floor(A2(:,:,1)+A2(:,:,2)+A2(:,:,3)/3);后面加上语句A4=A3;(其他语句不变),运行后得到的结果。 【思考题】观察图2-10(c)与图2-10(d)的区别,分析产生差别的原因。,Matlab邻域操作函数,nlfilter函数: 该函数被调用的一般形式为:B =nlfilter(A,M N,FUN),其中A 是被处理的图像,M N表示滑动块的高为M、宽为N。FUN是要对滑动 覆盖区域进行操作的函数名,该函数可以是各种滤波算子,可以是任 意定义的矩阵。 【例2-12】使用nlfilter函数对图像进行均值平滑邻域操作。 把例

42、2-11程序改写如下: A=imread(D:shizi.bmp); A1=rgb2gray(A); subplot(1,2,1); imshow(A1); fun = inline(mean(mean(x); B = nlfilter(A1,3 3,fun); subplot(1,2,2); image(B); axis off,程序的运行结果如图2-13所示。在这个程序中,修改了操作函数,把中值操作改为求3 3块的均值。与max函数等一样,当x是矩阵时,函数mean(x)是求矩阵每列的平均值,得到一个(均值)行向量,所以两次调用函数mean,即使用mean(mean(x)来求3 3块的均值

43、。 图2-13(b)边框变成深色,是由于边界补0造成的。在调用函数nlfilter时,如果使用3 3大小的滑动块操作,需要在图像边界外添加一行与一列,默认情况下添加0。 调用函数nlfilter时,如果参数FUN 有参数,那么需要使用下面格式:B = NLFILTER(A,M N,FUN,P1,P2,.)进行调用。P1,P2,.为函数FUN的实参,把值传入函数体中。,(a),(b),原灰度图像 均值操作后图像 图2-13 使用nlfilter函数进行均值邻域操作,colfilt函数:colfilt函数与nlfilter函数是有区别的,colfilt函数在处理图像时,先把滑动块遮住的图像部分(与

44、滑动块同样大小)排成一列,处理之后再恢复原来大小。一般说来,colfilt函数处理图象的速度要快,但是要占用较多的内存空间。 colfilt函数与nlfilter函数的另一个重要区别是colfilt函数在移动的时候可以在sliding与distinct两者中进行选择,而nlfilter函数只是执行sliding操作。colfilt函数在选择distinct时,滑动块不再逐象素滑动,而是逐块移动。 【例2-13】使用colfilt函数进行图像邻域操作。 设计下面程序 A=imread(D:qizhong.gif); subplot(1,2,1); imshow(A); B=uint8(colfi

45、lt(A,5 5,sliding,mean); subplot(1,2,2); imshow(B),原图像 邻域均值操作后 图2-14 使用colfilt函数进行图像邻域均值平滑操作,(a),(b),blkproc函数是专门进行分离块操作的函数。 【例2-15】使用blkproc函数进行图像分离块操作。 I = imread(D:shizi.bmp); I1=rgb2gray(I); fun = dct2; J = blkproc(I1,8 8,fun); imagesc(J),图2-16 使用blkproc函数进行图像分离块DCT操作,blkproc函数是专门进行分离块操作的函数。 【例2-

46、15】使用blkproc函数进行图像分离块操作。 I = imread(D:shizi.bmp); I1=rgb2gray(I); fun = dct2; J = blkproc(I1,8 8,fun); imagesc(J),该程序中,使用语句fun = dct2调用了函数dct2,这个函数是计算矩阵的离散余弦变换,每个8 8的分离块都进行离散余弦变换。,2.4 图像区域选取,块选取函数 Matlab还提供了一个区域选取函数roipoly( ),可以完成各种多边形块的选取功能。 曲线围成的区域 在计算机中没有严格的连续曲线,所有的曲线都是多边形。所以可以用roipoly函数选取近似的曲边区域

47、。,【例2-17】图像块选取后进行加运算,完成图像块的标注。 设计右面程序: 在程序中,使用了C1与C2定义了一个三角形,然后使用语句BW=roipoly(I3,C1,C2)得到了一个二值图像矩阵BW。因为矩阵BW是0-1矩阵,所以为了实现相加把矩阵BW扩大256倍后变为矩阵B,然后使用语句AB=(I3+B)把原图像I3与(遮罩矩阵)B加在一起,最后得到合成矩阵AB。,I1,m=imread(D:125.jpg); I2=rgb2gray(I1); I3=double(I2); subplot(1,2,1) imshow(I3,m) C1=10 30 80; C2=20 100 68 ; BW

48、=roipoly(I3,C1,C2); B=double(BW)*256; AB=(I3+B); subplot(1,2,2) imshow(AB,m),因为图像D:125.jpg是以索引方式存储的,程序中语句I1,m=imread(D:125.jpg)与imshow(AB,m)都是用来读取、显示索引图像的。 另外,直接调用roipoly函数,不使用参数,可以在命令执行后交互绘制区域。 BW(图像)中,选择区域的颜色为白,其他位置都是黑色。得到了矩阵BW后,可以根据BW的信息对选取的区域进行处理。,(a) 灰度图像 (b) 选择区域 图2-18 图像的块操作后加运算,【例2-18】使用正弦曲线围成图像块。 设计下面程序: A=imread(D:1250.jpg); subplot(1,2,1) imshow(A,m) C1=10:pi:180; C2=flo

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1