仿射变换2

转载:http://www.wtoutiao.com/p/13dgkJA.html


第6篇•图像知识篇——仿射变换

OpenCV机器视觉图像处理MATLAB · 2016-01-02 07:06

大家好,之前没有更新,自己也挺不好意思,先给大家道歉。不过前天遇到仿射变换中6个自由度与6个单独的“原子变换”的关系,查了很长时间发现网上相关内容要么只列举六个“原子变换”,要么列举一堆公式,结果还是搞不懂,也没有看到中文论文或者博客中有详细解释,挺让我失望的。庆幸找到一本书——《Multiple View Geometry inComputer Vision》Jongwoo Lim and David Ross的程序,让我大概了解这两个参数之间的对应关系,感谢下老外的细微描述能力和分享精神。我之前的文章很多都是看书或者网上查找的,用自己语言尽可能简单的语言描述出来,不算什么原创,最多算个知识的搬运工。由于微信内容不能输入公式,因此用了Multiple View Geometry in Computer Vision》书中公式截图。闲言少叙,进入主题。

仿射变换几何书上都有,公式如下:



分块表示为:


其中

为6个自由度,对应的6个“原子变换”为X和Y方向上的位移(两个),旋转(一个),回转(错切,一个),X和Y方向分别缩放的比例因子(两个)。旋转(一个),回转(错切,一个)如下图(来自《Multiple View Geometry in Computer Vision》)所示:


在解释变换对应关系之前,先引入一个基础知识。

等距变换,即包括图像整体旋转(包括对称)和位移,图像中变换前后长度、角度和面积不变,并且保持平行关系。公式为:



其中为1时改等距变换为保向的(平移和旋转),为-1时该等距变换为逆向的。这里假设左上角的2×2矩阵为R,如下公式表示:


相似变换,即包括图像整体缩放、旋转和位移。公式如下:



分块表示为:




退回到仿射变换,“原子变换”中的位移直接对应于仿射变换矩阵的tx和ty。其他的四个自由度对应于仿射变换矩阵中A。这里A可以通过奇异值分解,映射到四个自由度,公式如下:



这里的R为前面等距变换中的定义。最后附上MATLAB代码:

function q =affparam2mat(p)

%功能:由原子变换计算仿射变换矩阵;

% Reference "Multiple View Geometry in Computer Vision"by Richard

% Hartley and Andrew Zisserman.

% Copyright (C) Jongwoo Lim and David Ross. All rights reserved.

sz = size(p);

if (length(p(:)) ==6)

p = p(:);

end

s = p(3,:); th =p(4,:); r = p(5,:); phi = p(6,:);

cth = cos(th); sth= sin(th); cph = cos(phi); sph = sin(phi);

ccc = cth.*cph.*cph; ccs = cth.*cph.*sph; css =cth.*sph.*sph;

scc = sth.*cph.*cph; scs = sth.*cph.*sph; sss =sth.*sph.*sph;

q(1,:) = p(1,:); q(2,:) = p(2,:);

q(3,:) = s.*(ccc +scs +r.*(css -scs)); q(4,:) = s.*(r.*(ccs -scc) -ccs -sss);

q(5,:) = s.*(scc -ccs +r.*(ccs +sss)); q(6,:) = s.*(r.*(ccc +scs) -scs +css);

q = reshape(q, sz);

function q =affparam2geom(p)

功能:由仿射变换矩阵计算六个“原子变换”。

% Reference "Multiple View Geometry in ComputerVision" by Richard

% Hartley and Andrew Zisserman.

% Copyright (C) Jongwoo Lim and David Ross. All rights reserved.

A = [ p(3), p(4); p(5), p(6) ];

%% A = USVt =(UVt)(VSVt) = R(th)R(-phi)SR(phi)

[U,S,V] = svd(A);

if (det(U) < 0)

U =U(:,2:-1:1); V = V(:,2:-1:1); S = S(2:-1:1,2:-1:1);

end

q(1) = p(1);

q(2) = p(2);

q(4) = atan2(U(2,1)*V(1,1)+U(2,2)*V(1,2),U(1,1)*V(1,1)+U(1,2)*V(1,2));

phi = atan2(V(1,2),V(1,1));

if (phi <= -pi/2)

c = cos(-pi/2); s= sin(-pi/2);

R = [c -s; sc]; V = V * R; S = R'*S*R;

end

if (phi >= pi/2)

c = cos(pi/2); s= sin(pi/2);

R = [c -s; sc]; V = V * R; S = R'*S*R;

end

q(3) = S(1,1);

q(5) = S(2,2)/S(1,1);

q(6) = atan2(V(1,2),V(1,1));

q = reshape(q, size(p));

你可能感兴趣的:(目标跟踪)