数字图像的基本变换程序设计几何变换.docx
《数字图像的基本变换程序设计几何变换.docx》由会员分享,可在线阅读,更多相关《数字图像的基本变换程序设计几何变换.docx(20页珍藏版)》请在冰点文库上搜索。
![数字图像的基本变换程序设计几何变换.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/09f597e3-f9e7-4002-b180-81a0e2a9b656/09f597e3-f9e7-4002-b180-81a0e2a9b6561.gif)
数字图像的基本变换程序设计几何变换
摘要
数字图像几何变换是计算机图像处理领域中的一个重要组成部分,也是值得探讨的一个重要课题在图像几何变换中主要包括图像的缩放、图像的旋转、图像的移动、图像的剪取等内容。
文章主要探讨了数字图像的几何变换(包括图像的平移、图像的裁剪、图像的缩放、图像的旋转以及扭曲变换和镜像变换)理论,并在此基础上以MATLAB为工具,以最近邻插法、双线性插值法和双三次插值法三种常用数字图像差值算法为基础,实现了数字图像的一系列几何变换。
几何变换是将几何图形按照某种法则或规律变成另一种几何图形的过程,它对于几何学的研究有重要作用。
几何变换还在绘图、力学、机械结构的设计、航空摄影测量、电路网络等方面有广泛的应用。
关键词:
图像几何变换;缩放;旋转;扭曲变换;镜像变换
数字图像的基本变换程序设计-几何变换
1设计目的与要求
近几年来,由于大规模集成电路技术和计算机技术的迅猛发展、离散数学理论的创立和完善,数字图像处理技术正逐渐成为其他科学技术领域中不可缺少的一项重要工具
。
数字图像技术也从空间探索到微观研究、从军事领域到农业生产、从科学教育到娱乐游戏等越来越多的领域得到广泛应用。
无形之中成为了现代不可或缺的处理技术
。
通过课程设计实现对其的认知度以及更深入的学习和运用它。
1.1设计的目的
数字图像处理课程设计过程中,通过查阅资料、总体设计、模块设计、程序设计、集成调试等环节,完成一个基于Matlab编程语言,涉及多种典型应用,并具有综合功能的数字图像处理系统设计。
使学生能够将课堂上学到的理论知识与实践应用结合起来,对数字图像处理基础理论、程序逻辑分析、算法设计等方面的知识进一步加深认识,同时在软件编程、调试、工程合作开发等方面得到较全的锻炼和提高。
1.2设计的要求
利用Matlab软件对图像进行不同的效果处理,查阅相关资料并自主调试相关的程序,反复调试并达到数字图像的比例缩放、旋转、剪取、镜像、扭曲、平移等一系列几何变换要求的图像效果,使其达到简单美观及实用的效果,能过正常演示并能实现其图像处理的要求,最后完成实验设计的相关报告,总结实验心得体会。
2系统设计原理
2.1数字图像几何变换及原理
(1)平移和裁剪:
平移是日常生活中最普遍的运动方式,而图像的平移是几何变换这中最简单的变换之一
。
菜单中使用translate函数和movesult对图像进行平移,通过改变程序中的参数可以控制平移的方式,视需求而定。
在实际应用或科研领域,很多时候要对图像进行裁剪操作。
图像裁剪就是在原图像或者大图中裁剪出图像块来,这个图像一般是多边形形状的。
图像裁剪是几何处理中的一种基本操作。
利用imcrop函数调用可以是现期裁剪功能,格式为imcrop(I,rect);其中rect是一个四元向量[xminyminwidthheight],分别表示矩形的左上角的坐标,宽度和高度;
(2)扭曲变换:
MATLAB使用imtransform函数来实现图像空间变换,imtransform函数的调用格式为imtransform(I,T),其中I是要变换的图像,T是maketform函数产生的变换结果。
Maketform函数就是利用给定的参量建立变换结构,然后把该变换结构赋给结构体变换,根据得到的结构体变量T,调用imtransform函数进行变换
;
(3)镜像变换:
实现水平,垂直,对角镜像处理,双精度取点后调用函数实现。
(4)缩放与旋转变换:
利用'nearest','bilinear','bicubic'三个函数实现图片的三种缩放与旋转处理
。
利用imresize和imrotate两个函数实现缩放及旋转功能。
3设计方案
3.1设计思想
综合运用MATLAB实现图像处理的程序设计,根据需求进行程序的功能分析和界面设计,并实现对图像的平移,裁剪,扭曲,镜像,缩放,旋转等变换,按照要求增加变换的效果与其他的几何变换。
变换的操作直接调用Matlab中自带的函数,部分模块采用用户提示对话框,用来提示用户输入参数,以实现模块的动态操作,另外,需要同一模块需要将不同结果进行比对。
整个系统系统框图如图3.1示:
图3.1系统框图
3.2设计流程
3.2.1平移和裁剪
平移和裁剪流程图如图3.2所示。
N
Y
Y
图3.2平移和裁剪流程图
3.2.2扭曲变换
扭曲变换流程图如图3.3所示。
N
Y
图3.3扭曲变换流程图
3.2.3镜像变换
镜像变换流程图如图3.4所示。
N
Y
图3.4镜像变换流程图
3.2.4缩放和旋转变换
缩放与旋转流程图如图3.5所示。
N
Y
图3.5缩放与旋转流程图
4代码实现
4.1Matlab程序实现代码
4.1.1平移和裁剪变换
用函数translate()实现对输入的图像平移的功能;用函数imcrop()实现对图像的裁剪功能,其核心程序如下:
1)平移:
i=imread('D:
\1.jpg');%读取图片信息
prompt={'输入参数:
'};
defans={'2'};%获取图像信息
p=inputdlg(prompt,'input',1,defans);%创建数据输入窗口
p1=str2num(p{1});
se=translate(strel
(2),p1);%对图像进行平移
J=imdilate(i,se);
subplot(1,2,1),imshow(i),title('原图')
subplot(1,2,2),imshow(J),title('平移后图像')%显示操作结果
2)裁剪:
i=imread('D:
\1.jpg');%读取图片信息
%从坐标(0,0)开始,从原图上剪取一个长度为200,宽度为200的矩形部分
j=imcrop(i,[00200200]);
figure,subplot(1,2,1),imshow(i),title('原图')
%创建图像窗口
subplot(1,2,2),imshow(j),title('截取后图像')
%以坐标(50,50)开始,剪取长度为200,宽度为200的矩形部分,并与以坐标(0,0)开始,剪取同样大小的图像相比较
k=imcrop(i,[5050200200]);
figure,
subplot(1,2,1),imshow(j),title('以坐标(0,0)开始')
subplot(1,2,2),imshow(k),title('以坐标(50,50)开始')
4.1.2扭曲变换
用函数maketform()实现对图像的扭曲变换的功能,其核心程序如下:
i=imread('D:
\1.jpg')
%扭曲一
T1=maketform('affine',[0.500;0.510;001]);
I1=imtransform(i,T1);%二维变换
%扭曲二
T2=maketform('affine',[0.51;01;10],[0.20.6;0.50.3;0.50.9]);
I2=imtransform(i,T2);%二维变换
%原图,扭曲一,扭曲二显示比较
figure,subplot(1,3,1),imshow(i),title('原图')
subplot(1,3,2),imshow(I1),title('扭曲1')
subplot(1,3,3),imshow(I2),title('扭曲2')
4.1.3镜像变换
函数A2(1:
H
(1),1:
H
(2),1:
H(3))=A1(1:
H
(1),H
(2):
-1:
1,1:
H(3))表示对图像实现镜像变换的功能,其中(1:
H
(1))表示从1到H
(1)的整数,其核心程序如下:
i=imread('D:
\1.jpg');
figure,
subplot(2,2,1),imshow(i),title('原图')
A1=double(i);%定义为双精度型
H=size(A1);%定义尺寸
%水平镜像
A2(1:
H
(1),1:
H
(2),1:
H(3))=A1(1:
H
(1),H
(2):
-1:
1,1:
H(3));
%显示结果
subplot(2,2,2),imshow(uint8(A2)),title('水平镜像');
%垂直镜像
A3(1:
H
(1),1:
H
(2),1:
H(3))=A1(H
(1):
-1:
1,1:
H
(2),1:
H(3));
subplot(2,2,3),imshow(uint8(A3)),title('垂直镜像');
%对角镜像
A4(1:
H
(1),1:
H
(2),1:
H(3))=A1(H
(1):
-1:
1,H
(2):
-1:
1,1:
H(3));
subplot(2,2,4),imshow(uint8(A4)),title('对角镜像');
4.1.4缩放和旋转变换
函数Imresize()表示对图像实现放大和缩小的功能;函数imrotate()表示对图像实现旋转的功能,其核心程序如下:
1)缩放:
%用最近邻插法将图像按原比例放大1.5倍,语句如下:
i=imread('D:
\1.jpg');
a=1.5
j=imresize(i,a);%默认的为nearest,表示最近邻法
imshow(i),title('原图')
figure,imshow(j),title('近邻插法放大1.5倍')
%用双线性插值法和双三次插值法将图像按原比例放大1.5倍
k=imresize(i,a,'bilinear');%bilinear表示双线性插值
l=imresize(i,a,'bicubic');%bicubic表示双三次插值
figure,imshow(k),title('双线性插值法放大1.5倍')
figure,imshow(l),title('双三次插值法放大1.5倍')
%用双线性插值法将图像按原比例缩小为0.1倍
m=imresize(i,0.1,'bilinear');
figure,imshow(m),title('双线性插值法放大0.1倍')
2)旋转:
%用双线性插值法将原图像旋转45度,不裁去超出原图的部分
i=imread('D:
\1.jpg');
a=45
j=imrotate(i,a,'bilinear');
%函数imrotate对图像进行旋转,参数method用于指定插值的方法,可选的值为nearest(最近邻法),bilinear(双线形插值)及bicubic(双三次插值),默认值为nearest。
一般来说,旋转后的图像会比原图大,超出原图像的部分值为0。
figure,subplot(1,3,1),imshow(i),title('原图')
subplot(1,3,2),imshow(j),
title('双线性插值旋转45度,不裁')
prompt={'输入参数:
'};%提示对话框
defans={'2'};
p=inputdlg(prompt,'input',1,defans);%创建数据输入窗口
p1=str2num(p{1});%读取输入值
k=imrotate(i,p1,'bilinear');
subplot(1,3,3),imshow(k),
title('自定义度数,不裁去超出部分')
%用双线性插值法将原图像旋转45度,裁去超出原图的部分,并与未裁去超出部分的做比较
j=imrotate(i,a,'bilinear');%未裁去超出部分
k=imrotate(i,a,'bilinear','crop');%裁去超出原图的部分
figure,subplot(1,2,1),imshow(j),
title('双线性插值法旋转45度,不裁去超出部分')
subplot(1,2,2),imshow(k),
title('双线性插值法旋转45度,裁去超出部分')
5系统仿真与结果分析
5.1系统仿真
输入图像为一个慵懒的猫洗脸的图像,在Matlab代码中先用函数imread()先对图像进行读取和解析。
图5.1输入图像
在把程序在Matlab软件中打开后,点击运行后,出现如图5.2所示界面,然后输入参数即可。
图5.2平移变换输入参数
再输入平移变换参数后,函数translate()对图像做按照参数进行平移的变换,subplot(x,y,z)是显示图片变换后在界面上的坐标,原图及平移后的结果图如图5.3所示。
图5.3平移变换结果
读取图片后,函数imcrop(i,[00200200])表示,从图片坐标(0,0)开始,从原图剪取一个长度为200,宽度为200的矩形部分。
裁剪结果如图5.4所示。
图5.4裁剪变换结果一
在上图以(0,0)点开始剪取和从(50,50)开始剪取作比较,如图5.5所示。
图5.5裁剪变换结果二
首先函数imread()对图像进行读取后,用函数maketform()对图像进行扭曲变换,结果如图5.6所示。
图5.6扭曲变换结果
图5.7扭曲变换结果
镜像变换中(1:
H
(1))表示从1到H
(1)的整数,变换后的图像如5.8,图5.9和图5.10所示。
图5.8水平镜像变换结果
图5.9垂直镜像变换结果
图5.10对角镜像变换结果
用最近邻插法将图像按原比例放大1.5倍,函数j=imresize(i,a)表示,返回的图像j的长宽是图像A的长宽的m倍,即缩放图像。
m大于1,则放大图像;m小于1,缩小图像。
缩放变换结果如图5.11所示。
图5.11缩放变换结果一
用双线性插值法和双三次插值法将图像按原比例放大1.5倍,还是用函数imresize(),对图像作放大处理,处理结果如图5.12和图5.13所示。
图5.12缩放变换结果二
图5.13缩放变换结果三
图5.14所示为函数imresize()变换后放大0.1倍所示的结果图。
图5.14缩放变换结果四
用双线性插值法将原图像旋转45度,读取图像后,函数j=imrotate()表示对图像旋转。
inputdlg()表示创建参数输入窗口,如图5.15所示。
图5.15旋转变换输入参数
旋转变换结果如图5.16和5.17所示:
图5.16旋转变换结果一
图5.17旋转变换结果二
5.2结果分析
从结果图可以看出,预期的功能基本实现,并且比较全面,符合设计要求。
(1)平移变换中,采用了提示对话框,提示用户输入平移参数。
以左上角为原点(0,0),输入参数(150,150),原图像向右下平移分别沿x轴和y轴平移150个像素点。
(2)裁剪变换中,分别以(0,0)和从坐标(50,50)开始,从原图上剪取一个长度为200,宽度为200的矩形部分。
(3)扭曲变换采用了两个变换矩阵对图像进行了扭曲变换。
(4)镜像变换实现了垂直镜像,水平镜像和对角镜像。
(5)缩放变换采用了近邻插法,双线性插值法和双三次插值法将图像按原比例放大1.5倍,图像色调一次变淡,用双线性插值法将图像按原比例缩小为0.1倍。
(6)旋转变换采用了提示对话框,提示用户输入旋转角度。
第一个figure中依次显示了原图,程序设定的旋转45度图和根据用户输入的度数旋转后的图,都没有裁剪超出部分;第二个figure中显示了旋转45度后没有裁去超出部分的图像和裁去超出部分的图像。
结论
本设计采用了MATLAB作为工具,以最近邻域插法、双线性插值法和双三次插值法三种常用数字图像插值算法为基础,实现了数字图像的比例缩放、旋转和剪取等一系列几何变换。
通过实践可以有以下成果:
(1)插值算法的选取直接影响到数字图像在经过几何变换之后的质量。
(2)最近邻插法质量最差,但是算法简单,速度快;
(3)双三次插值法质量好,但是需要较大的计算量才能完成;
(4)双线性插值法无论在质量上还是速度上,都介于两者之间。
(5)插值技术的提高是以数学方法的改进和提高为前提的。
运用到现实中,还应结合硬件处理速度选择合适的算法,硬件处理速度的提高也是实现复杂算法的前提。
随着数学的发展和计算机硬件水平的提高,将会有更优秀的插值算法运用到实际当中,数字图像几何变换的质量和速度将得到很大程度上的提高。
整个系统各个模块都基本实现,实现了平移、裁剪、扭曲、镜像、缩放和旋转变换功能,比较全面地完成了数字图像几何变换这一任务。
不足的是没有完成提高部分,没有深入的研究其他几何变换。
参考文献
[1]章毓晋.图像工程上册——图像处理和分析[M].北京:
清华大学出版社,1999.3:
3-5.
[2]图像工程下册——图像理解与计算机视觉[M].北京:
清华大学出版社,2000.8:
12-14.
[3]陈桂明,张明照,戚红雨.应用MATLAB语言处理数字信号与数字图像[M].北京:
科学出版社,2000.1:
56-57.
[4]张兆礼,赵春晖,梅晓丹.现代图像处理技术[M].北京:
人民邮电出版社,2001.1l:
30-32.
[5]阮秋琦.数字图像处理学[M].北京:
电子工业出版社,2001:
112-115.
[6]龚声蓉,刘纯平,王强等.数字图像处理与分析[M].北京:
清华大学出版社,2006:
85-86.
[7]贾永红.计算机图像处理与分析[M].武汉:
武汉大学出版社,2001:
98-99.
[8]陈桂明.应用MATLAB语言处理数字信号与图像处理[M].北京:
科学出版社,2000:
134-135.
[9]夏德深,傅德胜.计算机图像处理及应用[M].南京:
东南大学出版社,2004:
42-45.
[10]姚敏.计算机图像处理[M].北京:
机械工业出版社,2006:
156-157.