如何使用编程语言vb.net或C++或C#找到同一两个图像之间的位移和旋转?
你提到的问题被称为运动检测(或运动补偿),是当前图像和视频处理中最重要的问题之一。除了一些非常琐碎的情况外,没有简单的“这里有十行代码可以解决”的解决方案。
即使是看似琐碎的情况也很困难,因为未知角度的旋转可能会导致微小的逐像素变化,如果没有专门用于运动检测的算法,很难进行检测。
旋转和平移这两个操作可以按任意顺序确定。首先检测旋转会更容易,因为您可以进行补偿。一旦两个图像定向相同,平移就成为简单相关的问题。
通过确定局部梯度来找到图像的相对旋转是最好的方法。对于每个邻域(例如3x3像素),将灰度值视为函数z(x,y),通过9个像素拟合一个平面,并确定该平面的斜率或梯度。现在将您发现的梯度平均到整个图像上,或者至少是中心。您的两个图像将产生不同的平均值。其中一部分是因为对于非90度旋转,图像不会完全重叠,但通常平均梯度的差异是两者之间的旋转。
一旦您将一个图像旋转回来,就可以确定相关性。这是一个相当标准的操作;您实际上正在确定每个可能的偏移量两个图像重叠的程度。这将为您提供位移的估计。
一旦您获得了两者,您可以通过旋转回平移,移动第二个图像并仅在两个图像共有的像素上确定平均梯度来优化您的旋转角度估计。