我正在设计一个系统,可以将规范化的表格扫描成图像(例如 TBitmap)。我希望能够识别这些页面上的对准标记,并使用这些裁切标记的位置将页旋转到适当的方向(使顶部实际上是朝上),并将图像裁剪到对准标记的位置。
以下是需要定位的典型标记示例图像:
(来源:tpub.com)
有哪些技术可以评估从扫描仪获取的图像,以查找图像中的各种标记?我需要定位多个标记及其中心点位置。
我正在设计一个系统,可以将规范化的表格扫描成图像(例如 TBitmap)。我希望能够识别这些页面上的对准标记,并使用这些裁切标记的位置将页旋转到适当的方向(使顶部实际上是朝上),并将图像裁剪到对准标记的位置。
以下是需要定位的典型标记示例图像:
(来源:tpub.com)
有哪些技术可以评估从扫描仪获取的图像,以查找图像中的各种标记?我需要定位多个标记及其中心点位置。
只是列举了一些可能的方法。
模板匹配
一种蛮力法是拥有一个注册标记外观的位图图像。然后,对于图像中与模板位图具有相同宽度和高度的每个可能的矩形,都将图像像素与模板像素进行比较。如果大多数对应的像素匹配,则可能找到了一个注册标记。这非常计算密集,因为您必须扫描所有可能的位置、旋转、比例因子等。您可以通过利用已知的东西来缩小范围。例如,您的注册标记是对称的,因此您不需要检查所有可能的旋转。也许您知道标记应该是确切大小,因此可以避免迭代不同的比例因子。最后,您可能知道注册标记应该靠近角落,因此可以跳过图像的大部分中间部分。
有趣的点
找到一种方法来在图像中识别“有趣的点”。例如,似乎处于交叉口中心的点可以通过使用增强具有基本方向上匹配像素的小核进行卷积,然后阈值化结果来找到。这会给出一个看起来像是交叉点的像素列表(可能会有一些噪声)。您可以在该坐标的子集中搜索类似于注册标记中的五个交点的“星座”。您可能仍然需要应用模板匹配来找到最可能的位置,但这将大大减少您否则必须尝试的位置、旋转和比例因子的数量。
特征检测
有线条检测、圆检测等算法。您可以运行其中一些, 然后寻找一个圆内两个相交线段的组合。这可能是最稳健的方式,但也可能是最难实现的方法。
如果图像本身不够清晰,则一些预处理步骤,如运行边缘检测器、阈值化或膨胀、腐蚀过滤器可能也会有所帮助。
对于标记,您可以使用Hough变换来检测圆和直线,然后检查是否有任何交叉线位于任何圆的中心位置,那么它就是您的标记。我不确定Delphi是否支持,但Hough变换算法是众所周知的,并且在许多库中实现。