几何变换与图像配准一--点变换
来源:互联网 发布:中日经济数据 编辑:程序博客网 时间: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]))
- 几何变换与图像配准一--点变换
- 几何变换与图像变换二--仿射变换
- 图像的几何变换
- 图像的几何变换
- 图像的几何变换
- 图像的几何变换
- 图像变换几何模型
- 图像几何变换
- 图像几何变换
- 图像的几何变换
- 图像中的几何变换
- 图像几何变换
- 图像的几何变换
- 图像的几何变换
- 图像的几何变换
- 【图像处理】MATLAB:几何变换与图像配准
- 图像处理的几何变换
- 图像的基本几何变换
- javascript方法调用
- hdu 2054
- 20170326#cs231n#11.Recurrent Neural Networks 循环神经网络RNN
- Linux命令大全(七)--Linux文件权限和访问模式
- if的条件嵌套
- 几何变换与图像配准一--点变换
- win10的cmd中显示:telnet不是内部或外部命令也不是可运行的程序或批处理?
- Android6.0以上版本打电话获取权限
- ABI 应用程序二进制接口
- C语言中的操作符(详)
- 运算符 优先级 结合性 用法 解释
- pycharm开发python时出现控制台显示中文乱码
- Java运算符
- Floor problem