找到图像移位

时间:2009-09-01 07:00:14

标签: c++ vb.net image-processing computer-vision

如何使用编程语言vb.net或C ++或C#查找相同两个图像之间的移位和旋转?

5 个答案:

答案 0 :(得分:6)

您声明的问题称为运动检测(或运动补偿),是目前图像和视频处理中最重要的问题之一。除了一些非常微不足道的案例之外,没有简单的“这里有10行代码可以解决”。

即使是看似微不足道的情况也是非常困难的,因为如果没有专门定制的运动检测算法,以未知角度旋转可能会导致逐个像素的轻微变化,这些变化无法轻易检测到。

答案 1 :(得分:1)

没有简短的回答。您可以尝试使用免费的OpenCV库来查找两个图像之间的关系。

答案 2 :(得分:1)

如果图像非常相似,使得相机仅稍微移动和旋转,则可以在不使用高度复杂的技术的情况下解决问题。 在这种情况下,我要做的是使用运动跟踪算法来获取图像序列的光流,这是一个“地图”,它近似于像素从图像A“移动”到B. OpenCV确实是一个非常好的库,它具有以下功能: CalcOpticalFlowLK CalcOpticalFlowPyrLK

棘手的一点是从光流到图像的完全旋转。我将从重低通过滤光流开始,以获得更平滑的地图。 然后,您需要使用一些逻辑来测试图像是仅移动还是旋转。如果仅移动那么整个地图应该是一个“颜色”,即所有流向量指向相同的方向。 如果有旋转,则矢量将根据旋转指向不同的方向。

如果输入图像不如上述方法所需,那么我会查看特征描述符,以找出第一个图像中特定对象如何位于第二个图像中。然而,这将更加艰难。

答案 3 :(得分:0)

可以按任意顺序确定两个操作,旋转和平移。首先检测旋转要容易得多,因为您可以对此进行补偿。一旦两个图像的方向相同,翻译就变成了简单的相关性。

最好通过确定局部渐变来找到图像的相对旋转。对于每个邻域(例如3x3像素),将灰度值视为函数z(x,y),拟合通过9个像素的平面,并确定该平面的斜率或梯度。现在平均您在整个图像上找到的渐变,或者至少是整个图像的中心。你的两张图片会产生不同的平均值。部分原因是因为对于非90度旋转,图像不会完全重叠,但一般来说,平均梯度的差异是两者之间的旋转。

旋转一张图像后,您可以确定相关性。这是一个相当标准的操作;你实际上是在确定两个图像重叠的可能性。这将为您提供班次估计。

一旦得到两者,您可以通过向后旋转平移,移动第二张图像,并仅在两幅图像共有的像素上确定平均渐变来优化旋转角度估计。

答案 4 :(得分:0)

如果图像完全相同,则应该很容易提取一些特征点 - 例如使用SIFT - 并匹配两个图像的特征。然后,您可以使用任何两个匹配功能来查找旋转和平移。翻译只是两个匹配特征点之间的差异。您可以补偿一个图像中的平移,并将旋转角度作为剩余三个点形成的角度。