1

我想使用 java 在图像中进行文本检测。我正在使用 OpenIMAJ 使用 MSER 算法(作为第一阶段)来做到这一点,但这需要大量的处理时间,并且在大多数图像中返回异常 OutOfMemoryError。

我尝试更改参数,并更改算法源代码,但问题仍然存在。

当我使用 Matlab 进行 MSER 算法时,它很快并且没有 OutOfMemoryError。

这是我的代码:

MSERFeatureGenerator mser = new MSERFeatureGenerator(delta,  maxArea, minArea, maxVariation, minDiversity, PixelsFeature.class);
List<Component> up_regions = mser.generateMSERs(flattenImg, MSERDirection.Up);

当我调用以下方法时,实际上会发生错误:

List<MergeTreeBuilder> mergeTrees = mser.performWatershed(Transforms.calculateIntensityNTSC(img));

没有问题的图像示例:

在此处输入图像描述

导致 OutOfMemoryError 的图像示例 2:

在此处输入图像描述

请帮忙。

4

1 回答 1

0

OpenIMAJ 实现了 Nister 和 Stewinius 定义的快速 MSER 算法(参见http://link.springer.com/chapter/10.1007%2F978-3-540-88688-4_14)。OpenIMAJ 实现非常快地找到每个最大稳定区域的枢轴像素(您可以通过PixelsFeature.class从代码中删除对的引用来看到这一点)。

您使用 OOM 和性能不佳的原因PixelsFeature是底层分水岭算法正在为每个区域为 256 个灰度级中的每一个创建一个连接组件(这发生在找到最大稳定组件之前,因此将创建一个真正的大规模树结构,每个级别都有重叠的像素集)。这不是你想做的事……

我没有任何代码可以演示替代方法,但您可能想要做的是计算枢轴像素,然后向后工作以ConnectedComponents使用类似洪水填充的方法。如果 MSER 方向是Up,则从每个枢轴像素开始对图像进行泛洪填充,以找到由小于或等于枢轴像素值的所有像素值组成的连通分量(请注意,枢轴像素表示它们的灰度级作为整数;您需要除以 255 才能使其与输入图像完全兼容)。

于 2016-01-20T09:10:23.440 回答