几何变换与图像配准一--点变换

来源:互联网 发布:中日经济数据 编辑:程序博客网 时间:2024/06/08 13:49

几何变换改变了图像中像素间的空间关系。可以使图像放大或者缩小,可以旋转、移动或用各种方法进行其他扩展。几何变换可用于创建小场景,使之适应从某个重放分辨率到另一个分辨率的数字视频,校正由观察几何变化导致的失真,以及排列有相同场景和目标的多幅图像。

几何坐标变换可以定义为从输入空间点到输出空间点的映射。如果这种从输入到输出的变换有逆,那么可以逆映射输出空间点到输入空间点。

图像的几何变换被定义为按照几何坐标的变换。在图像处理工具箱中采用所谓的tform结构来描述几何坐标变换,tform结构由函数maketform创建。
举个例子,我们创建两个描述不同空间坐标变换的tform结构。第一个变换用因数3水平地放大,用因数2垂直地放大。
首先,我们创建了正向函数,语法是:

xy=fwd_function(wz,tdata)

其中,wz是包含了两列的矩阵,在wz平面中每一行包含一个点;xy是另一个包含两列的矩阵,其中的行是包含在xy中的点

>> forward_fcn=@(wz,tdata) [3*wz(:,1),2*wz(:,2)]forward_fcn =  包含以下值的 function_handle:    @(wz,tdata)[3*wz(:,1),2*wz(:,2)]

接下来,我们创建具有语法wz=inverse_fcn(xy,tdata)的反函数:

>> inverse_fcn=@(xy,tdata) [xy(:,1)/3,xy(:,2)/2]inverse_fcn =  包含以下值的 function_handle:    @(xy,tdata)[xy(:,1)/3,xy(:,2)/2]

现在我们可以构建我们的第一个tform结构:

>>tform1=maketform('custom',2,2,forward_fcn,inverse_fcn,[])tform1 =   包含以下字段的 struct:       ndims_in: 2      ndims_out: 2    forward_fcn: @(wz,tdata)[3*wz(:,1),2*wz(:,2)]    inverse_fcn: @(xy,tdata)[xy(:,1)/3,xy(:,2)/2]          tdata: []

工具箱提供了两个关于变换点的函数:tforward计算正向变换,tforminv计算反变换。调用的语法是XY=tformfwd(WZ,tform)和WZ=tforminv(XY,tform)。在这里,WZ是P*2大小的矩阵,WZ的每一行包含一点的w和z坐标。类似地,XY是是包含在每一行中的x和y坐标对的P*2大小的点矩阵。例如,下面的命令计算某个点对的正向变换,接下来的反向变换核实了我们得到的原始数据:

>> WZ=[1 1;3 2];XY=tformfwd(WZ,tform1)XY =     3     2     9     4
>> WZ2=tforminv(XY,tform1)WZ2 =     1     1     3     2

如果你对特殊的空间变换的效果有一个较好的感觉,目测变换对在网格上安排一组点的影响是有帮助的。下面的两个自定义M-函数pointgrid和vistform可以帮助目测检验给定的变换。函数pointgrid创建了一组网格点以便用于目测。注意,为了创建网格,联合使用函数meshgrid和linspace

function wz= pointgrid(corners)% POINTGRID Points arranged on a grid.% WZ=POINTGRID(CORNERS) computes a set point of points on a % grid containing 10 horizontal and vertical lines.Each line% contains 50 points.CORNES is a 2-by-2 matrix.The first % row contains the horizontal and vertical coordinates of one% corner of the grid.The second row contains the coordinates% of the opposite corner.Each row of the P-by-2 output % matrix,WZ,contains the coordinates of a point on the output% grid.%Create 10 horizontal lines containing 50 points each.[w1,z1]=meshgrid(linspace(corners(1,1),corners(2,1),46),linspace(corners(1),corners(2),10));%Create 10 vertical lines containing 50 points each.[w2,z2]=meshgrid(linspace(corners(1),corners(2),10),linspace(corners(1),corner(2),46));%Create a P-by-2 matrix containing all the input-space points.wz=[w1(:) z1(:);w2(:) z2(:)];

下一个M-函数vistform变换一组输入点,然后,在输入空间中画出输入点,并在输出空间中画出相应的变换点。调整坐标系限制两个画图,以便更容易比较它们:

function vistform(tform, wz)%VISTFORM Visualization transformation effect on set of points% VISTFORM(TFORM,WZ)shows two plots.On the left are the % points in each row of the P-by-2 matrix WZ.On the right are % the spatially transformed points using TFORM.% Transform the points to output space.xy=tformfwd(tform,wz);%compute axes limits for both plots.Bump the limits outward%slightly.minlim=min([wz;xy],[],1);maxlim=max([wz;xy],[],1);bump=max((maxlim-minlim)*0.05,0.1);limits=[minlim(1)-bump(1),maxlim(1)+bump(1),minlim(2)-bump(2),maxlim(2)+bump(2)];subplot(1,2,1)grid_plot(wz,limits,'w','z')subplot(1,2,2)grid_plot(xy,limits,'x','y')%---------------------------------------------------------------------%function grid_plot(ab,limits,a_label,b_label)plot(ab(:,1),ab(:,2),'.','MarkerSize',2)axis equal,axis ij,axis(limits);set(gca,'XAxisLocation','top')xlabel(a_label),ylabel(b_label)

这里写图片描述

现在我们来设计第2个变换,以垂直坐标移动水平坐标,并保持垂直坐标不变。

(x,y)=T{(w,z)}=(w+0.4z,z)(w,z)=T(-1){(x,y)}=(x-0.4y,y)
forward_fcn=@(wz,tdata) [wz(:,1)+0.4*wz(:,2),wz(:,2)];inverse_fcn=@(xy,tdata) [xy(:,1)-0.4*xy(:,2),xy(:,2)];tform2=maketform('custom',2,2,forward_fcn,inverse_fcn,[]);
>> XY=tformfwd(WZ,tform2)XY =    1.4000    1.0000    3.8000    2.0000
>> WZ2=tforminv(XY,tform2)WZ2 =    1.0000    1.0000    3.0000    2.0000
figure(2),vistform(tform2,pointgrid([0 0;100 100]))

这里写图片描述

0 1
原创粉丝点击