




已阅读5页,还剩372页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
图 像 处 理,2010. 9,课程介绍 MATLAB工具介绍 图像处理的内容 复习总结,2019/9/4,图像处理的研究内容 学习目的与学习方法 教材与参考书,课程介绍,1.图像 2.图像几何操作 3.图像代数运算与逻辑运算 4.图像变换 5.图像分析 6.图像应用研究,2019/9/4,4,图像处理的研究内容,2019/9/4,5,学习目的: 使用MATLAB这个工具学习图像处理技术。 了解图像的计算机表示方法,掌握图像的各种加减乘除运算 及一些经典的处理方法,例如:各种图像变换、图像逻辑运算、数学形态学运算、图像编码与压缩、四叉树分解、纹理分析以及视频图像等内容。 通过学习使学生能够对图像有比较全面深刻的了解,为以后从事图像方面的研究作好准备。 学习方法: 听教师讲解,把思考与上机操作结合起来,其中上机操作 很重要。,学习目的与学习方法,2019/9/4,6,基于Matlab的图像处理 清华大学出版社 2008年,教材与参考书,2019/9/4,7,第一章 图像,1.1 Matlab的命令使用与程序设计 1.2 图像表示方法 1.3 基于图像的动画制作,2019/9/4,8,1.1 Matlab的命令使用与程序设计,命令窗口的使用 许多简单的计算工作都可以在命令窗口中完成,例如:数的运算,向量与矩阵计算,符号运算等。 在命令窗口中执行命令语句可以一句一句执行,清晰方便。但是,有很多复杂的工作还是需要进行程序设计。,2019/9/4,9,M-File程序设计,使用菜单项中的文件选项,选择FilenewM-File菜单,在弹出的窗口中编辑与运行程序。 运行程序使用Debug菜单中的Run命令,或者直接点击工具条中的按钮(Save and Run)。程序的运行结果显示在命令窗口中图形输出在图形窗口中。 程序中的变量以及变量的维数等信息可以在命令窗口左上部的workspace中找到。,2019/9/4,10,【例1-2】 使用程序,绘制颜色渐变的图形(图像)。 使用下面程序段,绘制出图1-1(a)所示图形。 for i=1:20 for j=1:30 a(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中的数值绘制图像,数值越大,对应点的颜色越亮;数值越小,对应点的颜色越暗。,图1-1(b),2019/9/4,12,Figure窗口的图形操作功能,Figure窗口主要功能是输出图形或显示图像。 Figure窗口的菜单包括:File菜单,Edit菜单,Insert菜单,Tools菜单,View菜单。 Figure窗口的工具条与菜单的一些常用功能对应。,2019/9/4,13,单元数组与结构体,单元数组中的每个元素称为单元(cell),单元可以包含任何类型的数据。可以使用两种方法创建一个单元数组,一个是通过赋值语句直接创建;一个是利用cell函数先为单元数组开辟一个内存空间,然后再给各个单元赋值。 结构体与单元数组非常相似,与单元数组不同的是,结构体的组成成员称为字段(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/9/4,15,上述命令创建了一个结构体并且赋值。下面是对结构体成员的调用: 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(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-y2; 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/9/4,20,Matlab的矩阵操作,Matlab提供了许多函数用来生成工具矩阵。 【例1-6】 使用函数生成工具矩阵,并把这些矩阵绘制成图形。 a(1,:,:)=zeros(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/9/4,21,程序中的image函数是用来根据矩阵绘制图像的,该函数把二维矩阵绘制成为灰度图像,默认时要求参数矩阵的值位于0到255之间,值越大,颜色越接近白色。矩阵b的值是0到1之间的数,乘以255后,变成了0到255之间的数。,(1) zeros,(2) eye,(3) rand,(4) randn,(5) hilb,常用的矩阵操作函数 矩阵翻转函数 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.3932 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 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),按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。 【思考题】 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 图像与数据,实际上,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到255种颜色表示),7表示页数。 序列图像是有联系的一些图像的集合。从上面例题可以初步得到结论:序列图像对应着4维数组。,1.2 图像表示方法,图像的数字化 图像:每个图像本质上是一个非常复杂的数学函数,这个数学函数一般是不能用解析式子表示的。图像具有不规则性、自然性、复杂性。 图像的数字化:随着数字摄像技术的诞生,数字图像成为科学研究及应用领域的研究重点。在计算机中,图象被看作是一些数字矩阵。,图像的读取与显示,图像的读取:函数imread()用来读取图像,把图像数据读出以后,可以赋给一个变量。 图像数据的调用:既然图像数据是存储在数组中,那么调用图像数据就变成了操作数组元素。 图像的显示:函数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显示图像,函数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.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); 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中 还有其他很多操作文件的命令函数,可以参考相关资料。,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)=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.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)=getframe; 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的第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=imread(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-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=imread(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(:,:)-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-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函数就使用这三种插值方法。,图像的旋转,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函数调用的一般形式为:imrotate(A, Angle, Method, Bbox) 其中参数Method为插值方法,调用函数时,如果需要指定插值方式的话,在参数Method的位置上注明nearest、bilinear或者bicubic。 参数Bbox为loose时,旋转图形如2-4(c)所示,底板扩大,为默认形式;参数Bbox为crop时,旋转图形如2-4(b)所示,底板不变,图像可能被切割。 【思考题】修改命令,把图像顺时针旋转90度。,2.2 图像的几何变换,图像的几何变换是指图像几何操作后,内部结构比例 等发生变化,但整体布局与形状没有改变。包括图像扭 曲、图像二维空间变换、距离变换等内容。 画图软件中的图像扭曲 在图像处理软件中,都提供了图像扭曲的功能。例如 , Windows中简单的画图软件:打开拉伸扭曲窗口,在 扭曲组合框中修改水平参数为20,那么点击确定后,白 色画板上的图像就会水平扭曲20度。,图像二维空间变换 图像二维仿射变换 Matlab使用imtransform函数完成图像空间变换。imtransform函数的调用形式为:imtransform(I,T),其中参数I是要变换的图像,T是由maketform函数产生的变换结构。 在函数maketform(P,)中,参数P可以是以下形式: affine 仿射变换形式 projective 投影变换形式 custom 自定义函数进行变换 box 依靠函数中的另外参数产生仿射变换结构 composite 该参数实现多次调用tformfwd功能,函数maketform就是利用给定的参数建立变换结构,然后把该变换结构赋给结构体变量(例如赋给T)。根据得到的结构体变量T,调用函数imtransform(I,T)进行变换。 图像二维投影变换 二维变换投影可以把一幅图像按照近大远小的规律投影到一个平面上,产生立体的效果。运用好函数maketform中的两个向量,能够绘制出很多特殊效果的图形。 【思考题】根据给定的函数maketform中的两个向量求变换矩阵。,2.3 图像的邻域操作,邻域操作 图像小狮子的颜色数据详见课教材, 由于图像很小,所以可以把数 据显示在一起,以便进行比较。 小狮子图像是方形的,高与宽都为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); 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); 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中,一共调用了滑动块矩阵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)元素的值。程序中使用的语句为: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-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函数对图像进行均值平滑邻域操作。 把例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块的均值。 图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函数在处理图像时,先把滑动块遮住的图像部分(与滑动块同样大小)排成一列,处理之后再恢复原来大小。一般说来,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(colfilt(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-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函数选取近似的曲边区域。,【例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=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=floor(20*sin(C1); BW=roipoly(A,C1,C2); B=double(BW)*256; AB=(A+B); subplot(1,2,2) imshow(AB),程序的运行结果是图2-19。,语句C1=10:pi:180是相当于求横坐标值赋给变量C1,pi 是Matlab默认的圆周率。语句C2=floor(20*sin(C1)是求对应的函数值。AB是A与B的和。(C1, C2)对应元素组成的点构成了一个正弦曲线,如图2-19(b)所示。仿照例2-18可以定义并选取其他形状的曲线围成的区域。,(a) (b) 图2-19 曲线围成的图像块选取,2.5 图像增强,图像增强是对图像进行操作,得到视觉效果更好或者更有 用的新图像。图像增强是在原有图像的基础上进行的,狭义 上的图像增强就是加强或减弱灰度图像的明暗对比度,广义 上的图像增强除了对灰度图像进行增强外,还包括彩色图像 增强等。在这一节中,简单介绍广义的图像增强。 灰度调整:增加灰度图像的明暗对比度,灰度图像就 变得更加清楚。增加明暗对比度的一种常用方法是灰度 调整方法。灰度调整方法是基于灰度直方图的一种图像 增强方法。,根据图像pout.tif颜色分布情况调整图像灰度值,增强该图像的明暗对比度。,2019/9/4,76,灰度调整函数 imadjust,【例2-22】使用函数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),2019/9/4,77,(a) pout.tif (b)灰度调整后 (c)cameraman.tif (d)灰度调整后 图2-23 使用imadjust函数对图像进行灰度调整,程序中语句B1=imadjust(A1,0.2 0.5,0,1)的第1个参数是要处理的矩阵,第2个参数用来限制输入范围,如果原来图像的颜色值是0至255,那么把小于255*0.2的颜色值置为0,把大于255*0.5的值置为255,再把其他介于中间的值映射到第3个参数决定的区间。这个语句的第3个参数为0 1,那么该例题就映射到0至255。,函数stretchlim(A)是用来计算灰度矩阵A的最佳输入区间 函数histeq能够自动完成图像灰度调整,一般用来增强图像的灰度对比度。 函数brighten增加灰度图像的亮度,彩色图像增强,【例2-26】使用函数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),(a) flowers.tif (b) 颜色调整后 图2-30 imadjust函数对RGB彩色图像的颜色进行调整,2019/9/4,80,程序运行结果如图2-30所示。 图像文件flowers.tif存储着一幅彩色图像,把该文件读入后使用imadjust函数进行调整。 调整后的范围是默认的范围0 0 0; 1 1 1,也就是把0.2 0.6之间的红色映射到0 1之间;把0.3 0.7之间的绿色映射到0 1之间;把0 1之间的蓝色映射到0 1之间。 映射后的结果为图2-30(b),从图形的效果上看,红色与黄色成分有所增强,而蓝色成分没有变。,【例2-27】使用函数imadjust对HSV彩色图像进行颜色调整。 设计下面程序: RGB1 = imread(flowers.tif); HSV1 = rgb2hsv(RGB1); HSV2 = imadjust(HSV1, .2 .3 0; .6 .7 1, 0 0 0; 1 1 0); HSV3 = imadjust(HSV1, .2 .3 0; .6 .7 1, 0 0 0; 1 0 1); HSV4 = imadjust(HSV1, .2 .3 0; .6 .7 1, 0 0 0; 0 1 1); subplot(2,2,1); imshow(HSV1) subplot(2,2,2); imshow(HSV2) subplot(2,2,3); imshow(HSV3) subplot(2,2,4); imshow(HSV4) 程序运行结果为图2-32所示,HSV 彩色图像增强,(1),(2),(3),(4),2.6 图像滤波,滤波是一种应用广泛的图像处理技术,可以通过滤波来强调或删除图像的某些特征。滤波是一种邻域操作,即处理后的图像每个象素值是原来该象素周围的颜色值经过某种计算得到的。2.3节介绍的图像邻域操作就是一种图像滤波。,滤波函数imfilter 滤波器的定义,滤波函数imfilter,函数imfilter是Matlab中使用较多的滤波函数,基本调用形式为: B = IMFILTER(A,H,OPTION) 其中A为要进行滤波的图像矩阵,可以为多维的彩色图像矩阵(数组);H是已经定义的滤波算子。这个函数本身也是基于邻域滑动设计实现的,所以也涉及到边界如何填补的问题,参数OPTION可以选择边界填补参数symmetric、replicate、circular等。 【例2-27】使用函数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),【例2-28】使用函数imfilter对图像进行滤波,分析几个滤波器的区别。 设计下面程序,程序运行结果显示在图2-34中。 rgb = imread(D:003.bmp); h1 = 0 0 0.0000 0.0021 0.0042 0.19
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 健身器材合同标准文本
- 低价原木转让合同标准文本
- 股权质押反担保合同格式模板
- 合伙开公司要签订5个协议
- 抵押借款简单合同书
- 汽车钣金喷漆修理厂转让协议二零二五年
- 自愿放弃缴纳社保协议书
- 二零二五房屋出租代理委托书
- 汽车居间服务协议二零二五年
- 上海景观园林养护合同样本
- 2025陕西核工业工程勘察院有限公司招聘21人笔试参考题库附带答案详解
- 2024中国核工业集团公司招聘(300人)笔试参考题库附带答案详解
- 常见恶性心律失常的护理
- 2025年1月浙江省高考物理试卷(含答案)
- 【公开课】同一直线上二力的合成+课件+2024-2025学年+人教版(2024)初中物理八年级下册+
- DL∕T 5161.8-2018 电气装置安装工程质量检验及评定规程 第8部分:盘、柜及二次回路接线施工质量检验
- (正式版)HGT 22820-2024 化工安全仪表系统工程设计规范
- (2024年)桥梁施工质量控制要点
- 2024年全国初中数学联赛试题及答案(修正版)
- NB-T 47013.15-2021 承压设备无损检测 第15部分:相控阵超声检测
- 引水工程压力管道水压试验施工方案
评论
0/150
提交评论