计算旋转的2D图像的平移值和旋转angular度

我有两个图像,其中之一是原始图像,第二个是转换的图像。

我必须找出有多less度转换图像旋转使用3×3转换matrix。 另外,我需要find从原点转换多远。

这两个图像都是灰度并保存在matrixvariables中。 他们的大小是相同的[350 500]

我发现了这样的几个讲义。

讲义说,我应该使用下面的matrix公式进行轮换: 旋转公式

对于平移matrix,给出公式:

翻译公式

一切都很好。 但是有两个问题:

  1. 我无法想象如何使用MATLAB来实现公式。
  2. 公式的形状是findx'y'值,但我已经得到了xx'yy'值。 我需要find旋转angular度(θ)和t xt y
  3. 我想知道matrix中xx'yy'的等价性。

我有以下代码:

 rotationMatrix = [ cos(theta) sin(theta) 0 ; ... -sin(theta) cos(theta) 0 ; ... 0 0 1]; translationMatrix = [ 1 0 tx; ... 0 1 ty; ... 0 0 1]; 

但是正如你所看到的,tx,ty,thetavariables在使用之前没有被定义。 我怎样才能计算thetat xt y

PS:禁止使用image processing工具箱function。

这本质上是一个单应性恢复问题。 你正在做的是在一个图像中给出坐标,在另一个图像中给出相应的坐标,你正在试图恢复用于从一个图像到另一个图像翘曲的组合的平移和旋转matrix。

通过将两个matrix相乘,您基本上可以将旋转和平移组合到一个matrix中。 乘法只是将两个操作合成在一起。 你会得到:

 H = [cos(theta) -sin(theta) tx] [sin(theta) cos(theta) ty] [ 0 0 1] 

这背后的想法是通过每对点之间的最小平方最小化误差来find参数。

基本上,你想find的是以下关系:

 xi_after = H*xi_before 

H是将坐标从一个图像映射到另一个图像所需的组合的旋转和平移matrix。 H也是一个3 x 3的matrix,并且知道右下angular的条目(第3行,第3列)是1,这使事情变得更容易。 此外,假设你的观点是在增强的坐标系统中,我们基本上想要从第一个图像(x_i, y_i)到另一个坐标(x_i', y_i')find每对坐标的关系:

 [p_i*x_i'] [h11 h12 h13] [x_i] [p_i*y_i'] = [h21 h22 h23] * [y_i] [ p_i ] [h31 h32 1 ] [ 1 ] 

p_i的尺度是考虑到单应缩放和消失点。 我们来执行这个方程的matrix向量乘法。 我们可以忽略第三个元素,因为它对我们没有用(现在):

 p_i*x_i' = h11*x_i + h12*y_i + h13 p_i*y_i' = h21*x_i + h22*y_i + h23 

现在我们来看看第三个元素。 我们知道p_i = h31*x_i + h32*y_i + 1 。 因此,将p_i代入每个方程,并重新排列以求解x_i'y_i' ,由此得到:

 x_i' = h11*x_i + h12*y_i + h13 - h31*x_i*x_i' - h32*y_i*x_i' y_i' = h21*x_i + h22*y_i + h23 - h31*x_i*y_i' - h32*y_i*y_i' 

你现在在这里有两个方程每个独特的点。 我们现在可以做的是build立一个超定的方程组。 拿每一对,并build立两个方程。 然后你会把它放在matrixforms,即:

啊= b

A将是一组系数matrix,这些系数是使用第一幅图像的坐标从每组方程build立的, b是第二幅图像的每对点, h是您正在求解的参数。 最终,你终于解决matrixforms重新expression的线性系统:

在这里输入图像描述

你可以求解可以通过最小二乘法执行的向量h 。 在MATLAB中,你可以通

 h = A \ b; 

给你一个旁注:如果图像之间的移动只是一个旋转和平移,那么h31和h32在求解参数后都会为零。 不过,我总是喜欢彻底,所以我会解决h31和h32无论如何。

注意:如果你有至less 4个唯一的点对,这个方法才有效。 因为有8个参数需要解决,并且每个点有2个方程,所以为了系统一致(如果你想在循环中引入一些线性代数术语), A必须至less有一个8的秩。 如果你less于4分,你将无法解决这个问题。

如果你想要一些MATLAB代码,让我们假设你的点存储在sourcePointstargetPointssourcePoints来自第一个图像, targetPoints来自第二个图像。 显然,两幅图像之间应该有相同的点数。 假定源点和targetPoints都被存储为M x 2matrix。 第一列包含你的x坐标,而第二列包含你的y坐标。

 numPoints = size(sourcePoints, 1); %// Cast data to double to be sure sourcePoints = double(sourcePoints); targetPoints = double(targetPoints); %//Extract relevant data xSource = sourcePoints(:,1); ySource = sourcePoints(:,2); xTarget = targetPoints(:,1); yTarget = targetPoints(:,2); %//Create helper vectors vec0 = zeros(numPoints, 1); vec1 = ones(numPoints, 1); xSourcexTarget = -xSource.*xTarget; ySourcexTarget = -ySource.*xTarget; xSourceyTarget = -xSource.*yTarget; ySourceyTarget = -ySource.*yTarget; %//Build matrix A = [xSource ySource vec1 vec0 vec0 vec0 xSourcexTarget ySourcexTarget; ... vec0 vec0 vec0 xSource ySource vec1 xSourceyTarget ySourceyTarget]; %//Build RHS vector b = [xTarget; yTarget]; %//Solve homography by least squares h = A \ b; %// Reshape to a 3 x 3 matrix (optional) %// Must transpose as reshape is performed %// in column major format h(9) = 1; %// Add in that h33 is 1 before we reshape hmatrix = reshape(h, 3, 3)'; 

一旦你完成了,你有一个组合的旋转和平移matrix。 如果你想要xy翻译,只需在hmatrixselect列3,行1和2。 但是,我们也可以使用h自身的向量,因此h13将是元素3,h23将会是元素编号6.如果您想要旋转的angular度,只需将相应的反三angular函数取到行1,2和3第1,2列。对于h向量,这将是元素1,2,4和5.根据您select哪个元素,会有一些不一致,因为这是通过最小二乘法解决的。 find一个好的总体angular度的一种方法可能是find所有4个元素的angular度,然后做一些平均。 无论哪种方式,这是一个很好的起点。

参考

前段时间,我通过Leow Wee Kheng的计算机视觉课程了解了单应性。 我已经告诉你的是基于他的幻灯片: http : //www.comp.nus.edu.sg/~cs4243/lecture/camera.pdf 。 看看幻灯片30-32,如果你想知道我从哪里拉这个材料。 不过,我自己写的MATLAB代码:)