fitgeotrans,transformPointsForward,imwarp,非反射相似变换,相似变换,仿射变换

本文详细介绍了图像处理中的几种关键几何变换,包括非反射相似变换、相似变换及仿射变换的概念、数学表达及其在Matlab中的实现方式。通过实例展示了不同变换对棋盘图像的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数简介:

函数fitgeotrans:

功能:获取相似变换对象:affine2d,其含有属性T,是一个3*3的矩阵。

tform = fitgeotrans(movingPoints,fixedPoints,transformationType)%我们只关心这个函数
tform = fitgeotrans(movingPoints,fixedPoints,'polynomial',degree)%略
tform = fitgeotrans(movingPoints,fixedPoints,'pwl')%略
tform = fitgeotrans(movingPoints,fixedPoints,'lwm',n)%略

函数transformPointsForward:

功能:对坐标点应用转换tform

[x,y] = transformPointsForward(tform,u,v)%x,y坐标分开传递
X = transformPointsForward(tform,U)%[x,y]一起放在U中传递

输入参数:

参数说明
tform几何变换,指定为一个affine2d 几何变换对象
u将被转换的点在X维上坐标,指定为一个数组
v将被转换的点在Y维上坐标,指定为一个数组
U将被转换的点的XY坐标,指定为一个n*2的矩阵

注意:上面的数组和矩阵的区别。

输出参数:

参数说明
xX维上转换后的坐标,返回为一个数组
yY维上转换后的坐标,返回为一个数组
xX,Y维上转换后的坐标,返回为一个n*2的点的矩阵

注意:两个函数是实现的点的转换(位置的转换),如果对图像进行转换的化,需要使用imwarp函数。点的转换,即位置的转换,而图像的转换对应转换后位置处的像素,并且涉及到像素的插值,且不可把两者混淆。

一般的定义形式:

相似变换表示为

T(xy)=(abba)(xy)+(txty)

或者:
T(xy)=(abbatxty)xy1

或者:
T(xy)=(scosθssinθssinθscosθ)(xy)+(txty)

其中 s 为缩放的尺度,θ是旋转的角度。
为了计算找到 T() 的参数 (a,b,tx,ty) ,使得形状 x 能够更好的对齐 x ,即最小化下面的公式:
E(a,b,tx,ty)=|T(x)x|=i=1n(axibyi+txxi)2+(bxi+ayi+tyyi)2

对每个参数求导数,并令其等于0,得到如下的结果:
a(Sxx+Syy)+txSx+tySy=Sxx+Syyb(Sxx+Syy)+tySx+txSy=Sxy+SyxaSxbSy+tx=SxbSx+aSy+ty=Sy

为了简化(并不丢失一般性),我们假定首先将x的重心平移到原点上。那么, Sx=Sy=0 ,并且我们获得:
tx=Sxty=Sy

以及:
a=b=(Sxx+Syy)/(Sxx+Syy)=x.x/|x|2(SxySyx)/(Sxx+Syy)=(SxySyx)/|x|2

因此,如果将两个对齐的点集移动到中心(重心,质心)位置的化,那么我们可以上面的公式计算出其相似变换。我们可以看到a,b公式的分母对应的都是原点集的信息。
如果x的重心不在原点上,那么在最终的解决方案中必须考虑到到原点的最初的平移。

仿射变换表示为:

T(xy)=(acbd)(xy)+(txty)

我们希望找到 T() 的参数 (a,b,c,d,tx,ty) 。其类似上面的描述。

Matlab中的非反射相似变换,相似变换,仿射变换

变换类型:
1. Nonreflective Similarity 非反射相似变换
2. Similarity 相似变换
3. Affine Transformation 仿射变换
4. Projective Transformation 透视变换
5. Polynomial Transformation 多项式变换
6. Piecewise Linear Transformation 分段线性变换
7. Sinusoidal Transformation 正弦变换
8. Barrel Transformation
9. Pin Cushion Transformation
这里只学习非反射相似变换相似变换仿射变换
三者的关系为: 非反射相似变换 相似变换 仿射变换。
并且非仿射相似变换就是传统意义上的相似变换,也就是一般的定义形式中的相似变换。相似变换分为:非反射相似变换和反射相似变换。只是定义了一个额外的正负号的乘子。下面的例子中一看就清楚了。
这里写图片描述

创建一些列的转换图像

下面的例子对棋盘图像应用不用的转换来展示集合变换的一些属性。
简介:
一个二维的集合变换是这样的一个映射,其将一个欧式平面内的每一个点与一个欧式平面内的另外一个点关联起来。在这些例子中,几何变换通过一个规则定义,该规则高斯我们如何将笛卡尔坐标为 (x,y) 的点映射到另外一个笛卡尔坐标为 (u,v) 的点。一个棋盘的图案有助于对输入图像平面中的坐标网格可视化,并且也有助于对每一个变换产生的扭曲类型的可视化。

图像1,创建一个棋盘

棋盘有长方形的”瓷砖”,并且有4个唯一的角。因此很容易看到集合变换是如何扭曲棋盘图像的。

I = checkerboard(10,2);%10表示每个格子的大小(长或者宽)为10个像素,2表示行的数量,用法为checkerboard(n,p,q),如果q不指定,默认为正方形棋盘
imshow(I)
title('original')

这里写图片描述

图像2,对棋盘应用非反射相似变换

非反射相似变换可以包括旋转,缩放和平移。保持了形状和角度,平行线任然是平行线,直线任然是直线。
对于一个非反射相似变换:

(uv)=(xy1)T

T 是一个3*3的矩阵,其依赖4个参数。

% Try varying these 4 parameters.
scale = 1.2;       % scale factor
angle = 40*pi/180; % rotation angle
tx = 0;            % x translation
ty = 0;            % y translation

sc = scale*cos(angle);
ss = scale*sin(angle);

T = [ sc -ss  0;
      ss  sc  0;
      tx  ty  1];

因此,非反射相似是仿射变换的一个子集,使用下面的代码创建一个affine2d对象。

t_nonsim = affine2d(T);%转换为affine2d仿射对象
I_nonreflective_similarity = imwarp(I,t_nonsim,'FillValues',.3);%I:输入图像,t_nonsim:非反射相似变换,'FillValue',填充值,采用.3

figure, imshow(I_nonreflective_similarity);
title('nonreflective similarity')

这里写图片描述

关于转换:如果你将tx或者ty改变我非0值。那么你将会注意到输出图像没有影响,如果你想看的相对于转换的坐标,则通过下面的代码语句:

[I_nonreflective_similarity,RI] = imwarp(I,t_nonsim,'FillValues',.3);

figure, imshow(I_nonreflective_similarity,RI)
axis on
title('nonreflective similarity')

这里写图片描述
注意到,imwarp函数输出的空间参考对象RI揭示了转换。为了指定,你想看的输出图像的哪一部分。那么在imwarp函数中使用’OutputView’name-value对。

图3:对棋盘应用相似变换

在相似变换中,相似三角形映射到相似三角形。非反射相似变换是相似变换的子集。
对于一个相似变换,等式类似于一个非反射相似:

(uv)=(xy1)T

T is a 3-by-3 matrix that depends on 4 parameters plus an optional reflection.

% Try varying these parameters.
scale = 1.5;        % scale factor
angle = 10*pi/180; % rotation angle
tx = 0;            % x translation
ty = 0;            % y translation
a = -1;            % -1 -> reflection, 1 -> no reflection

sc = scale*cos(angle);
ss = scale*sin(angle);

T = [   sc   -ss  0;
      a*ss  a*sc  0;
        tx    ty  1];

Since similarities are a subset of affine transformations, create an affine2d object using:

t_sim = affine2d(T);

% As in the translation example above, retrieve the output spatial
% referencing object |RI| from the |imwarp| function, and pass |RI| to
% |imshow| to reveal the reflection.
[I_similarity,RI] = imwarp(I,t_sim,'FillValues',.3);

figure, imshow(I_similarity,RI)
axis on
title('similarity')

这里写图片描述

其他

中心化,原点化,尺度单位化

%the size of landmark is :n×2,n表示基准点的数量,2表示基准点的x,y坐标。 
%中心化
meanxy=mean(landmark,1);
c_shape=bsxfun(@minus, landmark, meanxy);%c center
%原点化
minxy=min(landmark,[],1);%分别求x,y坐标中的最小值
o_shape=bsxfun(@minus, landmark, minxy);% o origin
%尺度单位化
minxy=min(landmark,[],1);
maxxy=max(landmark,[],1);
i_shaple=bsxfun(@rdivide, maxxy, minxy);%for x,y %i identity

参考文献:
1. http://blog.youkuaiyun.com/xiamentingtao/article/details/50810121
2. http://jivp.eurasipjournals.springeropen.com/articles/10.1186/1687-5281-2014-46
3. https://cn.mathworks.com/help/images/examples/creating-a-gallery-of-transformed-images.html [主要的参考文献]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值