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

标签 matrix transformation

我不知道这应该放在数学论坛还是编程论坛上,但我会在这两个论坛上发布它,看看我能得到什么。

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

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

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

有人可以帮忙吗?我熟悉线性代数......只是不够熟悉,无法在没有整个洛塔挠头的情况下得出这一点。不胜感激!

  • 迈克

最佳答案

不确定您是想要手动还是自动

手册

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

x' = c1 * x + c2 * y + c3 * x * y + c4
y' = c5 * x + c6 * y + c7 * x * y + c8

(来自 Pierre Wellner 的 Interacting with Paper on the DigitalDesk,第 67 页)

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

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

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

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

自动

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

如果您的图像矩形真的很突出(深色背景上的白色图像),那么您可以使用 角点检测,这些库可从 OpenCV's Feature Detection 等库中获取。 (参见 cv::cornerHarris)。

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

关于matrix - 尝试仅使用图像导出二维变换矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1856210/

相关文章:

r - 制作特殊矩阵的最佳方法

matlab - 如何对 MATLAB 中的所有其他行求和

matlab - 从给定向量创建下三角矩阵

ios - 什么样的变换会给我想要的结果图像?

python - 如何拆分列中的多个值并按pandas中的所述值进行分组?

c++ - 无法正确生成 ViewProjection 矩阵

objective-c - 这个初始化中的方括号在 Objective C 中有什么作用?

qt - 调整和旋转 QGraphicsItem 会导致奇怪的形状

java - 在java xquery处理器中使用OSB功能bea

xml - 使用 XSL 转换(XML 到 XML)包装多个列表元素序列