yⅡ r r a b xⅡ (x0, y0) (x1, y1) O 图2 旋转示意图
?x1??cosasina0??x0????????y1????sinacosa0??y0??1??0?01???????1?
式中,坐标系是以图像的中心为原点,向右为x轴正方向,向上为y轴正方向。它和以图像左上角为原点,向右为x轴正方向,向下为y轴正方向的坐标系之间的转换关系如图3所示
OⅠ (x, y) OⅡ yⅡ xⅠ
[5]
。
xⅡ
yⅠ
图3 两种坐标系间的转换关系图
设图像的宽度为w,高度为h,容易得到:
?x???100.5w??xⅡ???????y?0?10.5h??????yⅡ??1??00?1???????1?
逆变换为:
?xⅡ??10?0.5w??x?????????yⅡ???0?10.5h??y???1??00?1???????1?
有了以上公式,可以把变换分成三步: 第一步,将坐标系Ⅰ变成Ⅱ; 第二步,将该点顺时针旋转a角度; 第三步,将坐标系Ⅱ变回Ⅰ。
这样,我们就得到了变换矩阵,它是上面三个矩阵的级联。那么对于新图像中的每一点,就可以根据对应原图中的点,得到它的灰度。如果超出原图范围,则填成白色。要注意的是,由于有浮点运算,计算出来点的坐标可能不是整数,采用取整处理或插值来处理
[6]
。
1.3.4 镜像原理
图像的镜像变换是以图象垂直中轴线或水平中轴线交换图像的变换,分为垂直镜像变换和水平镜像变
3
换,两者的矩阵形式分别为
[7]
:
?x'???1 0 0 ??x??y'???0 ??y?1 0???????0 1??1?????? ?0 ?1? 0 ? ?x??x'??1 0?y'???0 -? ?y? 1 0 ??????? 1 ? 1??1?????? ?0 0?1.3.5 错切原理
变换前和变换后y坐标不变,而x坐标根据y坐标值作线性变换,变换前后点的坐标之间的关系为:
式中
shx?tan?为变换系数。若shx?0,沿X正方向错切;若shx?0,则沿着X负方向错切。
?1shx??SH(sh)?yx?01????
?x'?x?shxy?'?y?y
所以,错切矩阵为:
在X、Y平面上不考虑Z轴方向
[8]
。
4
第2章 图像几何设计实现
2.1 MATLAB GUI设计界面介绍
2.1.1 MATLAB GUI介绍
在Matlab中,图形用户界面(graphical user interface,GUI)是Matlab中一个专用于GUI程序设计的向导设计器,而GUI是由各种图形对象,如图形窗口、图轴、菜单、按钮、文本框等构建的用户界面,是人机交互的有效工具和方法。通过GUIDE可以很方便地设计出各种符合要求的图形用户界面。用户通过一定的方法(如鼠标或键盘)选择、激活这些图形对象,使计算机产生某种动作或变化,比如实现计算、绘图等。GUI设计既能以基本的Matlab程序设计为主,也能以鼠标为主,利用GUIDE工具进行设计,也可综合以上两种方法进行设计。GUIDE主要是一个界面设计工具集。Matlab将所有GUl支持的用户控件都集成在这个环境中并提供界面外观、属性和行为相应方式的设置方法。GUIDE将用户保存设计好的图形用户界面保存在一个FIG资源文件中,同时自动生成包含图形用户界面初始化和组件界面布局控制代码的M文件,这个M文件为实现回调函数的编写提供了一个参考框架。FIG文件是一个二进制文件,包含系列化的图形窗口对象。所有对象的属性都是用户创建图形窗口时保存的属性。该文件最主要的功能是对象句柄的保存。M文件包含GUI设计、控制函数及控件的回调函数,主要用来控制GUI展开时的各种特征。该文件基本上可以分为GUI初始化和回调函数2个部分,控件的回调函数可根据用户与GUI的具体交互行为分别调用
[9]
。
2.1.2本次研究中所使用的GUI设计界面本
下面我们以图4为例,说明界面设计的功能
[10]
。
图4 GUI设计界面实例
5
通过上图,我们看到本次设计基本上采用静态文本框、按钮、坐标轴和复选按钮。其功能介绍如下: 静态文本框:输入文字,将标注的信息显示出来。
按钮与复选按钮:通过点击,完成一次命令,可以使载入图像,也可以是返回主界面或者完成命令。 坐标轴:也是可视化窗口,将原图和所变换的图像通过两个坐标轴显示出来,以供比较。
2.2 图像几何变换核心程序简介
2.2.1图像平移
核心程序:
se=translate(strel(1),[40 -40]); b=imdilate(dai,se); 功能:
使用translate函数将图像进行搬移,其中第一个函数参数表示只对图像进行搬移而不改变图像本身,第二个参数则是平移的坐标,然后再通过imdilate函数将图像展现出来。
2.2.2图像缩放
核心程序(方法一):
g=imresize(dai,1); // 此函数为放大一倍,若将1改为0.5,则表示缩小一倍
axes(handles.axes2);
set(handles.axes2, 'Units', 'pixels'); [x,y]=size(g);
set(gca,'position',[350 237 y x]) 功能:
imresize函数作为图像缩放的主要函数,函数第一个参数为图像文件名,第二个参数为缩放倍数。缩放完成后设置坐标轴2。若不设置坐标轴,那么图像的大小将自动适应于新坐标,本程序为了比较明显的看出图像的缩放,则设置了坐标,用size函数测量了图像的宽和高,然后使得坐标的宽和高与图像相适应,而其他两个位置变量则固定不变。这样显示出来的图像就有了可比较的特点。
核心程序(方法二):
prompt=('缩放度数');
p=inputdlg(prompt,'input',1,defans); p1=str2num(p{1});
f=imresize(dai,p1,'nearest');
set(handles.axes2, 'Units', 'pixels'); [x,y]=size(f);
set(gca,'position',[350 277 y x]) 功能:
Inputdlg函数是用对话框的格式输入缩放的参数,prompt是对话框的文字提示,提示出要输入的参数
6
是什么,input指的是输入参数,1是指对话框的行数,defans是默认的初始值。同时用字符转换成数字来改变缩放参数,因为输入的只是一个字符型的参数要将其转换成数字才能应用,其余同方法一,坐标也要相应的适应新的图像。
2.2.3图像旋转
核心程序(方法一):
dai=imrotate(dai,45);//第二个参数则是旋转的度数 功能:
旋转的函数通过imrotate函数就能完成,第一个变量为图像名称,第二个变量则是旋转的度数。
核心程序(方法二):
prompt=('旋转角度'); defans={'0'};
p=inputdlg(prompt,'input',1,defans); p1=str2num(p{1});
f=imrotate(dai,p1,'nearest'); 功能:
Inputdlg函数是用对话框的格式输入缩放的参数,prompt是对话框的文字提示,提示出要输入的参数是什么,input指的是输入参数,1是指对话框的行数,defans是默认的初始值。同时用字符转换成数字来改变缩放参数,因为输入的只是一个字符型的参数要将其转换成数字才能应用,其余同方法一。此方法默认是最近邻方法,同时也可用双线性和双立方插值的方式对次图像进行处理。
2.2.4图像镜像
核心程序: k=fliplr(dai);
k=flipud(dai); 功能:
上述函数分别为水平镜像和垂直镜像,水平镜像是以y轴为对称轴,而垂直镜像则以x为对称轴。在函数中直接写入图像名称即可。
2.2.5图像错切
核心程序:
s=maketform('affine',[1 0.5 0;0 1 0;0 0 1]);
j=imtransform(dai,s); 功能:
通过使用maketform函数构造矩阵,affine表示为仿射变换,后面的参数表示的是位置矩阵,再由
7