我正在研究一个 OCR 算法,它给出了一个包含一些数字的图像。我希望它简单地检测每个图像,并将其与其他图像分开。
它适用于 0-9 的所有数字,除了数字 4,这给我带来了很多麻烦。
这是我的源图像:
这是解析它的一些数字的结果:
正如你所看到的,它们都被完美地解析了。唯一给我带来麻烦的是4。这是数字4的样子:
我遇到的问题是检测 4 的最左角,以便包括整个数字。这是我的算法在尝试检测每个字符的左边界时向下遍历的方式(蓝点表示算法采用的路径):
如果您在另一个选项卡中打开图像并放大,您可能会更好地看到它在做什么。
如您所见,它向下和向左移动,直到两次遇到背景。当它发生时,这意味着已经到达图像的最左侧边界。它适用于所有其他图像,除了 4,您可以看到它遇到背景两次并停止,但如果它继续向下再向下两个像素,那么它将遇到更多的 4 并会找到它真正的左-最边缘。
我不确定如何以不会破坏其他数字的方式做到这一点。这是我的实际代码以防万一:
int misses = 0;
int maxMisses = 2;
while (y < image.getHeight() && x >= 0 )
{
markPixel(x, y);
color = image.getRGB(x, y);
if (! reader.isForeground(color))
misses++;
if (misses < maxMisses)
{
y++;
x--;
continue;
}
x++;
break;
}
if (x < 0)
x = 0;
return x;
编辑:我已经能够通过一直遍历图像而不是在遇到 2 个背景像素时停下来实现一些改进,当我遇到前景像素时存储每一步的 x 坐标,然后按升序对匹配进行排序并返回他们的最低结果。它工作得更好一些。新 4 图像:
它还不完美。此外,9 看起来有点小:
算法遍历的新路径:
更新代码:
ArrayList<Integer> matches = new ArrayList<>();
int yB = y;
for (int i = 1; i <= 2; i++)
{
y = yB;
while (y < image.getHeight() && x >= 0 )
{
markPixel(x, y);
color = image.getRGB(x, y);
if ( reader.isForeground(color))
matches.add(x);
y++;
}
x--;
}
Collections.sort(matches);
return matches.get(0);
有人有什么想法可以从 4 中找出最后一个缺陷吗?