Matrix 尝试仅使用图像导出二维变换矩阵

Matrix 尝试仅使用图像导出二维变换矩阵,matrix,transformation,Matrix,Transformation,我不知道这是否应该出现在数学论坛或编程论坛上,但我会将其发布在这两个论坛上,看看我会从哪里得到 我有两张电脑图像。。。其中一个是“原始”图像(一个大的TIF文件)。另一个是原始图像的转换版本。。。它在软件程序中被旋转、剪切和翻译。我需要对转换后的图像做一些工作,但我需要原始图像中每个像素的(x-y)坐标来完成我的计算 我知道图像是用3x3变换矩阵旋转和剪切的。如果我有这个矩阵,我可以从第一个(反之亦然)我自己得到第二个图像。我不知道它被旋转、剪切或平移了多少,所以我不能从一组已知的变换中推导出矩

我不知道这是否应该出现在数学论坛或编程论坛上,但我会将其发布在这两个论坛上,看看我会从哪里得到

我有两张电脑图像。。。其中一个是“原始”图像(一个大的TIF文件)。另一个是原始图像的转换版本。。。它在软件程序中被旋转、剪切和翻译。我需要对转换后的图像做一些工作,但我需要原始图像中每个像素的(x-y)坐标来完成我的计算

我知道图像是用3x3变换矩阵旋转和剪切的。如果我有这个矩阵,我可以从第一个(反之亦然)我自己得到第二个图像。我不知道它被旋转、剪切或平移了多少,所以我不能从一组已知的变换中推导出矩阵。我所拥有的是每幅图像中的一组对应点(角点等),以及它们对应的(x,y)坐标。这就是我的困境:

使用一组对应的变换点((x,y)->(x',y'),其中三个或更多),我可以导出用于将一个图像转换为另一个图像的变换矩阵吗?如果我能推导出矩阵,我就能解出所有像素的原始坐标(所有1800万像素),并完成我需要做的计算

有人能帮忙吗?我熟悉线性代数。。。只是不太熟悉,无法在不费吹灰之力的情况下得出这个结论。什么都好

  • 迈克

我认为您应该首先提供一个列表,比如6个3个点(对于6个未知点),以及转换前后的X/Y坐标

然后有一个比我更聪明的人把它放到一组线性方程组中,然后把它交给(比如)Wolfram Alpha求解

Java的文档顶部显示了需要如何设置矩阵:

[ x']   [  m00  m01  m02  ] [ x ]   [ m00x + m01y + m02 ]
[ y'] = [  m10  m11  m12  ] [ y ] = [ m10x + m11y + m12 ]
[ 1 ]   [   0    0    1   ] [ 1 ]   [         1         ]
去除大部分绒毛叶:

[ x']   [ m00x + m01y + m02 ]
[ y'] = [ m10x + m11y + m12 ]
然后你只需要建立一组6 x 2的方程如下:

m00x + m01y + m02 - x' = 0
m10x + m11y + m12 - y' = 0
(在对之前/之后重复2次其他x/y)


然后把它们扔到方程求解器上。

不确定是要手动还是自动

手册

如果指定矩形四个角的变换坐标,则可以导出变换方程:

(摘自皮埃尔·韦尔纳的作品以及他作品中的更多细节)

现在你只需要解方程的系数

对于四个点对,两组四个联立线性方程组可以通过高斯消去法快速求解,以找到c1-8的值

最后,您可以将这些方程转换为所需的3x3矩阵。上述方程足以进行非线性变换,您可以将其简化为3x3仿射剪切矩阵

但我会坚持使用非线性方程(如上),因为它们可以处理透视失真

自动

同样的方法,但是您可以使用一个边缘检测器和一个线条检测算法组合来查找一组组成矩形的4条线

如果您的图像矩形非常突出(深色背景上的白色图像),则可以使用库中提供的角点检测,如(请参见
cvCornerHarris


您可以将这些线相交以找到四个角并使用变换方程。

您只需要3个点即可定义3x3变换矩阵。如果你有点(0,0),(0,1)和(1,0)并用矩阵[AB c d e f 0 0 1]变换它们,你会得到(c,f),(b,e)和(a,d)。

。。。我们有6个未知数,但每对点有2个方程式。。。3对将给出6个方程。聪明!我应该让迈克为自己说话,但我个人觉得无法理解你的解释。我想我们很多人对数学只是略知一二。高斯消去法在《数值算法》等书中有很好的记载。但我想强调的是,这远远优于3x3仿射变换,因为它可以处理透视失真(一种非线性非仿射变换)。如果有人感兴趣,我可以详述我的答案。请发表评论。我想补充一点,我在一个生产项目中使用了这种精确的方法,效果非常好。如果我没有做到公正,我深表歉意,但不要让我油嘴滑舌的描述让你远离这项强大的技术。请阅读链接到资料的链接。这太完美了,弗兰克。我不认为这个解释是油嘴滑舌的,它给了我一张我需要做什么的地图。我确信那里正在进行透视变换。我可以从4个非线性点推导出c1-c8常数。。。它们不必是角落,对吗?我只记得在第二张图片中有两个角被剪掉了,但在这种情况下应该没关系。。。我可以使用许多非常不同的参考点。我将把这些插入,以转换其余的。我不赞成使用3x3矩阵。。。我只是需要一种方法来转换点。我想你的图像链接被破坏了,我有一种感觉,缺少图像就是为什么我似乎忽略了如何从两个独立的对应点集导出一组非线性方程的部分。如果你能解释一下如何推导转换方程,我想这会对我的答案有很大帮助。这是我答案的简化,你只需去掉c3和c7项。但是,拼写所涉及的实际线性代数很好。你的“方程求解器”是我的“高斯消去法”。谢谢!我很高兴看到我接近了。我想我在30年前完成了最后一次GE;从那时起,我一直很高兴让一个程序来做这件事。很高兴看到迈克被一位职业选手照顾。这个问题让我发疯了。请看一看,然后。如果我能把你的答案翻译成简单的编程就好了。