2009-12-06 58 views
2

我不知道这是否应该在数学论坛或编程论坛上发布,但我会在两篇文章中发布它,并查看我的位置。试图仅使用图像推导2D变换矩阵

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

我知道图像是旋转和剪切的3x3变换矩阵。如果我有矩阵,我可以从第一个(或反之亦然)自己推导出第二个图像。我不知道旋转,剪切或翻译的确切程度,所以我不能从一组已知的变换中推导出矩阵。我所做的是每个图像中的一组对应点(角点等)以及它们对应的(x,y)坐标。所以这是我的困境:

使用一组相应的变换点((x,y) - >(x',y'),它们中的三个或更多)可以导出用于转动的变换矩阵一个图像到另一个?如果我可以导出矩阵,我可以求出所有像素的原始坐标(全部1,800万像素),并完成我需要做的计算。

任何人都可以帮忙吗?我对线性代数很熟悉......只是不够熟悉,没有一个完整的头部划痕就可以推导出来。任何感谢!

  • 迈克
+0

这个问题一直让我着迷。请看看[这里](http://stackoverflow.com/questions/8959657/order-sequence-of-matrix-transformations-in-2d)和[这里](http://stackoverflow.com/questions/8834070 /矩阵坐标变换顺序)。如果我只能将你的答案翻译成简单的编程。 – 2012-01-22 07:46:42

回答

3

不确定是否需要说明书自动 ...

手册

如果您指定的长方形的四个角的变换后的坐标,那么你就可以推导出变换方程:

alt text http://www.praeclarum.org/so/wellner.png

(皮埃尔Wellner的Interacting with Paper on the DigitalDesk和更多细节在他的Thesis

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

有四个点对,两组四个同时线性方程可以快速通过高斯消元法求解,找到C 1-8的值。

最后,您可以将这些方程转换为您需要的3x3矩阵。上面的公式足够强大,可以进行非线性变换,并且可以将其简化为3x3仿射剪切矩阵。

但我会坚持使用nonliner方程(上面),因为他们可以处理透视失真

自动

相同的方法,但可以使用边缘检测器与一个行检测算法comboined找到一组4个肥胖型线妆容的矩形。

如果你的图像矩形真正站出来(在一个黑暗的背景whiteish图像),那么你可以使用角点检测可以从像OpenCV's Feature Detection库(见cvCornerHarris)。

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

+0

我应该让迈克为自己说话,但我觉得绝望不足以理解你的解释。我想我们中的很多人只是熟悉数学。 – 2009-12-06 19:15:19

+0

哦。高斯消除法在诸如“数值算法”等书籍中有很好的记载。但是我想强调一下,这比3x3仿射变换要好得多,因为它可以处理透视失真(非线性非仿射变换)。如果有兴趣,我可以扩展我的答案。 – 2009-12-06 19:19:11

+0

评论范围。我想补充一点,我已经在生产项目中使用了这种精确的方法,效果非常好。我道歉,如果我没有公正地做,但不要让我的描述使你远离这种强大的技术。请阅读链接的材料。 – 2009-12-06 19:22:03

1

我想你应该提供的清单开始,说 点(6个未知数)与X/Y改造前后的坐标。

然后有人比我更聪明的将它弹入一组线性方程组,然后将它馈送给(比方说)Wolfram Alpha进行求解。

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

[ 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 before/afte r对)

并将它们扔在方程求解器中。

+0

这是对我的答案的简化,您只需简单地删除c3和c7的术语。但是,拼写实际的线性代数的工作很好。你的“方程求解器”是我的“消除高斯”。 – 2009-12-06 19:25:17

+0

谢谢!我很高兴看到我接近。我想我30年前做过我的最后一个GE;从那以后,我一直很乐意让程序去做。很高兴看到迈克被亲们照顾。 – 2009-12-06 19:51:58

1

您只需要3个点来定义3x3变换矩阵。如果你有点(0,0),(0,1)和(1,0)并通过矩阵[abcdef 0 0 1]进行变换,你将得到(c,f),(b,e)和(a,d)。

+0

哦...我们有6个未知数,但每对点有两个方程...所以3对将给我们6个方程。聪明! – 2009-12-06 19:13:41