我不知道这是否应该放在数学论坛或编程论坛中,但我会将其发布在两个论坛中,看看我得到了什么。

我有两张电脑图像...其中之一是“原始”图像(一个大的 TIF 文件)。另一张是原始图像的转换版本......它在软件程序中被旋转、剪切和平移。我需要对转换后的图像进行一些处理,但我需要原始图像中每个像素的 (x-y) 坐标才能完成计算。

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

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

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

  • 麦克风
有帮助吗?

解决方案

不确定你是否想要 手动的 或者 自动的...

手动的

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

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

(摘自皮埃尔·韦尔纳的 与 DigitalDesk 上的纸张交互 以及他的更多详细信息 论文)

现在您只需求解方程的系数即可。

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

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

但我会坚持使用非线性方程(上面),因为它们可以处理 透视畸变.

自动的

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

如果您的图像矩形确实很突出(深色背景上的白色图像),那么您可以使用 角点检测 可从类似的图书馆获得 OpenCV的特征检测 (看 cvCornerHarris).

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

其他提示

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

我认为你应该首先提供一份清单,例如 6 3 变换前后具有 X/Y 坐标的点(对于 6 个未知数)。

然后,比我更聪明的人应该将其放入一组线性方程中,然后将其输入(例如)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 重复此操作)

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top