2

我不知道这是否应该出现在数学论坛或编程论坛中,但我会在这两个论坛中发布它,看看我在哪里。

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

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

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

任何人都可以帮忙吗?我对线性代数很熟悉……只是不够熟悉,无法在不费力气的情况下得出这个结论。任何事情都值得赞赏!

  • 麦克风
4

3 回答 3

3

不知道你要手动还是自动...

手动的

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

替代文字 http://www.praeclarum.org/so/wellner.png

(来自 Pierre Wellner在 DigitalDesk 上与 Paper 的交互以及他的论文中的更多细节)

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

使用四点对,可以通过高斯消元法快速求解两组四个联立线性方程组,求出 c1-8 的值。

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

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

自动的

相同的方法,但您可以使用边缘检测器与线检测算法相结合来找到一组构成矩形的 4 条线。

如果您的图像矩形真的很突出(深色背景上的白色图像),那么您可以使用OpenCV 的特征检测等库中提供的角点检测(请参阅参考资料)。cvCornerHarris

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

于 2009-12-06T19:05:53.573 回答
1

我认为您应该首先提供一个列表,例如6 个 3点(对于 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)

并将它们扔给方程求解器。

于 2009-12-06T18:55:04.003 回答
1

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

于 2009-12-06T19:09:38.733 回答