检测旋转
我建议你从检测直线开始。
寻找(可能是随机的)具有高对比度的小区域,即大部分是白色但也有相当数量的非常黑的像素。然后尝试为这些黑色像素拟合一条线,例如使用最小二乘法。删除异常值,并将另一条线拟合到其余点。根据需要进行迭代。评估拟合的好坏,即观察区域中有多少像素真正靠近线,以及该线超出观察区域的距离。对多个区域执行此过程,您应该得到一个加权的行列表。
对于每条线,您可以计算线本身的方向以及与其正交的方向。这些数字之一可以从区间 [0°, 90°) 中选择,另一个将是 90° 加上该值,因此存储一个就足够了。采取所有这些方向,并找到一个最适合所有方向的角度。您可以使用例如 5° 的滑动窗口来做到这一点:滑过该(循环)区域并找到窗口内的最大线数的值,然后计算该窗口内角度的平均值或中值。所有这些计算都可以在考虑线的权重的情况下完成。
找到线条的方向后,您可以旋转图像,使线条与坐标轴完美对齐。
检测翻译
假设图像在任何时候都没有缩放,那么您可以尝试使用基于 FFT 的图像相关性将其与模板匹配。将两个图像都转换为灰色,用零填充它们,直到原件最多占据填充图像边缘长度的 1/2,最好应该是 2 的幂。在两个方向上对两个图像进行 FFT,将它们逐元素相乘并返回 iFFT。生成的图像将编码两个图像在给定偏移下相对于彼此的一致程度。只需找到最大值,您就知道如何使它们匹配。
添加的文本根本不会引起任何问题。这种方法最适合大面积区域,例如公司徽标和灰色背景框。细线将提供较差的匹配,因此在这些情况下,您可能必须在进行相关之前模糊图片,以扩大特征。您不必使用模糊图像进行进一步处理;一旦您知道偏移量,您就可以返回到旋转但未模糊的版本。
现在您知道旋转和平移,并且假设没有缩放或剪切,因此您确切知道模板的哪个部分对应于扫描的哪个部分。继续。