我是图像处理的新手,但我正在使用EMGU进行C#图像分析。但是,我知道单应矩阵并不是EMGU独有的,因此也许有其他语言知识的人可以更好地解释。
请(尽可能简化)有人可以解释每个元素的作用。我在网上看了这个,但找不到我能理解的答案(就像我说的那样,我对这一切都不熟悉!)
我分析了2个图像,都是2维。因此,需要3×3矩阵来解释图像的旋转/平移。如果未检测到移动,则单应矩阵为: 100, 010, 001
我从研究中得知(例如OpenCV Homography, Transform a point, what is this code doing?): 10TX, 01Ty, XXX
10,01位是x和y坐标的旋转。 Tx和Ty位是平移运动,但XXX位是什么?这是我不明白的?它与仿射变换有关吗?请有人解释一下: 如果我现在对我上面所说的是对的。 2. XXX位意味着什么
答案 0 :(得分:15)
如果你掌握了矩阵乘法,那就不难理解了。假设你指出x
是
/a\
\b/,
并且您希望按A
:
/3 4\
\5 6/
并通过t
/2\
\2/.
后面的矩阵是仿射变换的组成部分,以获得新的点y
:
y = A*x + t = <a'; b'>T //(T means transposed).
如您所知,为此,可以构建一个3d矩阵B
和一个向量x'
,看起来像
/3 4 2\ /a\
B = |5 6 2| , x' = |b|
\0 0 1/ \1/
这样
/a'\
y' = |b'| = B*x'
\ 1/
您可以从中提取y
。让我们看看它是如何工作的。在原始变换中(使用加法),第一步是进行乘法,即。旋转部分y_r
:
y_r = A*x = <3a+4b; 5a+6b>T
然后你添加“绝对”部分:
y = y_r + t = <3a+4b+2; 5a+6b+2>T
现在看看B
的工作原理。我会逐行计算y'
:
1) a' = 3*a + 4*b + 2*1
2) b' = 5*a + 6*b + 2*1
3) the rest: 0*a + 0*b + 1*1 = 1
正是我们的期望。首先,计算旋转部分 - 加法和乘法。然后,添加平移部分的x部分,乘以1
- 它保持不变。第二行也是一样。
在第三行中,a
和b
被删除(乘以0
)。最后一部分保持不变,恰好是1
。因此,关于最后一行的所有内容都是“删除”该点的值并保留1
。
那么可以说,2x3矩阵就足够了。这部分是正确的,但有一个明显的缺点:你松散的可组合性。假设您对B
基本满意,但想要镜像一个坐标。然后你可以选择另一个转换矩阵
/-1 0 0\
C = | 0 1 0|
\ 0 0 1/
并有结果
y'' = C*B*x' = <-3a+4b+2; 5a+6b+2; 1>T
由于矩阵乘法的特性,这种简单的乘法不能轻易地用2x3矩阵完成。
原则上,在上面,最后一行(XXX
)也可以是<0;0;x>
形式的任何其他内容。只是为了降低点值。然而,通过乘法工作来制作合成是非常必要的。
最后,在这种情况下,wikipedia对我来说似乎非常有用。
(@任何人:可能会注意到,我不是数学家。我想我理解这个概念,但是如果有错误或缺少某些东西,请告诉我。)
答案 1 :(得分:1)
首先,仿射变换是那些保留直线并可以保留许多任意维度的变换
Homography描述了两个平面之间的映射或纯相机旋转期间发生的情况。
最后一行代表各种剪切(即当x是x,y的函数时)