图像的位置变换是指图像的大小和形状不发生变换,只是将图像进行平移,镜像和旋转的变换等,主要用于图像目标识别的目标配准。
一、图像旋转变换
旋转。一般图像的旋转是以图像的中心为原点,旋转一定的角度,也就是将图像上的所有像素都旋转一个相同的角度。旋转后图像的的大小一般会改变,即可以把转出显示区域的图像截去,或者扩大图像范围来显示所有的图像。图像的旋转变换也可以用矩阵变换来表示。设点P0(x0,y0)逆时针旋转角后的对应点为
P(x,y)。那么,旋转前后点P0(x0,y0)、P(x,y)的坐标分别是:
x0rcos y0rcosxrcos()rcoscosrsinsinx0cosy0sin yrsin()rsincosrcossinxsinycos00写成矩阵表达式为
xcosysin10sincos00x0y00 11其逆运算为
xcosysin10sincos00x0y00 (3-9) 11利用上述方法进行图像旋转时需要注意如下两点:
(1)图像旋转之前,为了避免信息的丢失,一定要有坐标平移。
(2)图像旋转之后,会出现许多空洞点。对这些空洞点必须进行填充处理,否则画面效果不好,一般也称这种操作为插值处理。
以上所讨论的旋转是绕坐标轴原点(0,0)进行的。如果图像旋转是绕一个指定点(a,b)旋转,则先要将坐标系平移到该点,再进行旋转,然后将旋转后的图象平移回原来的坐标原点,这实际上是图像的复合变换。如将一幅图像绕点(a,b)逆时针旋转度,首先将原点平移到(a,b),即
10a A01b001然后旋转
cosBsin0sincos000 0然后再平移回来
10a C01b001综上所述,变换矩阵为TCBA。
在旋转变换的Callback函数下添加代码如下:
function xuanzhuanbianhuan_Callback(hObject, eventdata, handles) % hObject handle to xuanzhuanbianhuan (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) axes(handles.axes_2); prompt={'Input Angle'}; title='Input Angle'; def={'0'};
x=inputdlg(prompt,title,2,def); y=str2num(char(x));
img_1=getappdata(handles.figure_by_me,'img_1'); img_2=imrotate(img_1,y,'nearest'); imshow(uint8(img_2));
二、图像平移变换
平移变换是几何变换中最简单的一种变换,是将一幅图像上的所有点都按照给定的偏移量在水平方向沿x轴、在垂直方向沿y轴移动。设图像中点P0(x0,y0)进行平移后已到P(x,y),其中x方向的平移量为Δx,y方向的平移量为Δy。那么,点P(x,y)的坐标为:
x=x0+Δx
y=y0+Δy
利用齐次坐标系,变换前后图像上的点P0(x0,y0)和P(x,y)之间的关系可以用如下的矩阵变换表示为:
x10xx0y=01y×y0 10011利用坐标变换原理我们进行编程。首先要设计一个GUI界面方便我们进行图像处理。
首先读入图片,并将其显示在第一个坐标轴上,处理后的图像显示在第二个坐标轴上,形成对比。Matlab中读入函数imread,打开对话框函数为uigetfile。
在打开菜单的Callback函数下添加函数激活打开命令。
function dakai_Callback(hObject, eventdata, handles) [filename,pathname]=uigetfile(...
{'*.bmp;*.png;*.jpeg;*.jpg','Image Files(*.bmp,*.jpg,*.png,*.jpeg)';... '*.*', 'All Files(*.*)'},... 'Pick an image');
if isequal(filename,0)||isequal(pathname,0) return; end
fpath=[pathname filename]; img_1=imread(fpath); imshow(img_1); title('');
setappdata(handles.figure_by_me,'img_1',img_1);
获得图片后,接下来就是对其进行处理,以实现图像几何变换菜单下的平移变换。在平移变换的Callback函数下添加如下代码:
function pingyibianhuan_Callback(hObject, eventdata, handles) % hObject handle to pingyibianhuan (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) prompt={'X(0-166)','Y(0-166)'}; title='pingyibianhuan' defaults={'0','0'};
xy_cells=str2num(char(inputdlg(prompt,title,1,defaults))); if isempty(xy_cells)
msgbox('为您执行平移操作,'提示,'help'); else
x=xy_cells(1);y=xy_cells(2); axes(handles.axes_2);
img_1=getappdata(handles.figure_by_me,'img_1');
img_2=double(img_1); img_2_M=zeros(size(img_2)); H=size(img_2); move_x=x; move_y=y;
if(size(img_2,3)~=1)
img_2_M(round(move_x)+1:round(H(1)),round(move_y)+1:round(H(2)),1:round(H(3)))=img_2(1:round(H(1))-round(move_x),1:round(H(2))-round(move_y),1:round(H(3)));
%此处利用矩阵直接进行图像平移操作,其中move_x为在x方向平移尺度大小,move_y为在y轴方向平移的尺度大小H(1)为图像的行数,H(2)为图像的列数,H(3)为图像维数,函数round为取整操作。
else
img_2_M(round(move_x)+1:round(H(1)),round(move_y)+1:round(H(2)))=img_2(1:round(H(1))-round(move_x),1:round(H(2))-round(move_y));%此处为利用矩阵直接进行灰度图像的平移的操作,其中move_x为在x方向平移尺度的大小,move_y为在y轴方向平移的尺度大小,H(1)为图像的行数,H(2)为图像的列数,函数round为取整操作。
end
imshow(uint8(img_2_M)); end;
当选择“平移变换”菜单时,则弹出如图所示对画框。设定水平平移30个
像素,垂直平移65个像素,单击OK,处理结果如下:
三、图像镜像变换
1、图像水平镜像
图像的水平镜像操作是将图像的左半部分和又半部分以图像垂直中线为中心进行镜像对换。设点P0(x0,y0)进行镜像后的对应点为P(x,y),图像高度为fH,宽度为fW,原图像中P0(x0,y0)经过水平镜像后坐标将变为(fW-x0,y0),其代数表达式为:
y=y0 x=fW-x0
矩阵表达式为:
x-10fWx0y=010×y0 10011
在水平镜像的Callback函数下添加如下代码:
function shuipingjingxiang_Callback(hObject, eventdata, handles) % hObject handle to shuipingjingxiang (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) axes(handles.axes_2);
img_1=getappdata(handles.figure_by_me,'img_1'); img_1=double(img_1); H=size(img_1);
img_2(1:H(1,1),1:H(1,2))=img_1(1:H(1,1),H(1,2):-1:1); imshow(uint8(img_2));
点击菜单栏中图像几何处理中的平移变换,结果如下图所示:
2、图像垂直镜像
图像的垂直镜像操作是将图像上半部分和下半部分以图像水平中轴线为中心进行的镜像变换。设点P0(x0,y0)进行镜像后的对应点为P(x,y),图像高度为fH,宽度为fW,,原图像中P0(x0,y0)经过垂直镜像后坐标将变为(x0,fH-y0),其代数表达式为:
x=x0 y=fH-y0
矩阵表达式为:
x100x0=0-1fH×y0 y 10011 在图像垂直镜像的Callback函数下添加代码如下:
function chuizhijingxaing_Callback(hObject, eventdata, handles) % hObject handle to Untitled_3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) axes(handles.axes_2);
img_1=getappdata(handles.figure_by_me,'img_1'); img_1=double(img_1); H=size(img_1);
img_2(1:H(1,1),1:H(1,2))=img_1(H(1,1):-1:1,1:H(1,2)); imshow(uint8(img_2));
点击菜单栏图像几何处理中的垂直镜像,结果如下图所示:
3、图像对角镜像
图像对角镜像是将图像以图像水平中轴线和垂直中轴线的交点为中心进行镜像对换。相当于将图像先后进行水平镜像和垂直镜像。设点P0(x0,y0)进行镜像变换后的对应点为P(x,y),图像高度为fH,宽度为fW,原图像中P0(x0,y0)经过对角镜像后坐标将变成(fW-x0,fH-y0),其代数表达式为:
x=fW-x0 y=fH-y0 矩阵表达式为:
x10y0-1100fWx0y0 fH×11在图像对角镜像的Callback函数下添加代码如下:
function duijiaojingxiang_Callback(hObject, eventdata, handles) % hObject handle to duijiaojingxiang (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) axes(handles.axes_2);
img_1=getappdata(handles.figure_by_me,'img_1'); img_1=double(img_1); H=size(img_1);
img_2(1:H(1),1:H(2))=img_1(H(1):-1:1,H(2):-1:1); imshow(uint8(img_2));
点击菜单栏中图像几何处理中的镜像变换,结果如下图所示:
四、总结
几何变换是最常见的图像处理手段,通过对变形的图像进行几何校正,可以得出准确的图像。常用的几何变换功能包括图像的平移、图像的镜像变换、图像的转置、图像的缩放、图像的旋转等等。目前数字图像处理的应用越来越广泛,已经渗透到工业、航空航天、军事等各个领域,在国民经济中发挥越来越大的作用。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuowenda.com 版权所有 湘ICP备2023022495号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务