寻找图像位移

3
如何使用编程语言vb.net或C++或C#找到同一两个图像之间的位移和旋转?
5个回答

6

你提到的问题被称为运动检测(或运动补偿),是当前图像和视频处理中最重要的问题之一。除了一些非常琐碎的情况外,没有简单的“这里有十行代码可以解决”的解决方案。

即使是看似琐碎的情况也很困难,因为未知角度的旋转可能会导致微小的逐像素变化,如果没有专门用于运动检测的算法,很难进行检测。


运动检测是“有动静吗?”有时也会是“在哪里?”。运动补偿是“我认为我知道这个运动,我想用它来改变感知的运动”。你应该使用的术语是运动估计。@MSalters 你在开玩笑,对吧?你在引用经典的直接运动估计与间接运动估计的争论。为什么聪明的算法不能使用特征?特征在不同应用下表现非常好。 - koan

1

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


相关性遗憾地无法说明旋转问题。 - Hannes Ovrén

1
如果图像非常相似,以至于相机只略微移动和旋转,则问题可以在不使用高度复杂的技术的情况下解决。在这种情况下,我会使用运动跟踪算法来获取图像序列的光流,它是一个“地图”,近似描述了像素从图像 A 移动到 B 的方式。确实非常好的 OpenCV 库具有执行此操作的函数:CalcOpticalFlowLK 和 CalcOpticalFlowPyrLK。
关键在于如何从光流推导出图像的总旋转。我会从对光流进行强烈的低通滤波开始,以获得更平滑的地图以便处理。然后,您需要使用一些逻辑来测试图像是否只被移动或旋转。如果只是被移动,则整个地图应该是一个“颜色”,即所有流向量指向同一方向。如果存在旋转,则根据旋转方向,向量将指向不同方向。
如果输入图像不像上述方法那样完美,则我会研究特征描述符,以查找第一张图像中特定对象在第二张图像中的位置。这将会更加困难。

0

旋转和平移这两个操作可以按任意顺序确定。首先检测旋转会更容易,因为您可以进行补偿。一旦两个图像定向相同,平移就成为简单相关的问题。

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

一旦您将一个图像旋转回来,就可以确定相关性。这是一个相当标准的操作;您实际上正在确定每个可能的偏移量两个图像重叠的程度。这将为您提供位移的估计。

一旦您获得了两者,您可以通过旋转回平移,移动第二个图像并仅在两个图像共有的像素上确定平均梯度来优化您的旋转角度估计。


0
如果图像完全相同,那么提取一些特征点就非常容易了,例如使用SIFT,然后匹配两个图像的特征。接着,您可以使用任意两个匹配的特征来找到旋转和平移。平移只是两个匹配特征点之间的差异。然后您可以对一个图像进行平移补偿,并将剩余三个点形成的角度作为旋转角度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接