使用MSER算法进行文本检测时,java openimaj OutOfMemoryError

时间:2016-01-18 21:27:27

标签: java openimaj mser

我想用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));

没有问题的图像示例:

enter image description here

制作OutOfMemoryError的图像示例2:

enter image description here

请帮忙。

1 个答案:

答案 0 :(得分:0)

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

使用PixelsFeature获得OOM和性能不佳的原因是底层分水岭算法为256个灰度级中的每一个创建了每个区域的连通分量(这发生在找到最大稳定组件之前) ,因此将创建一个非常庞大的树结构,每个级别都有重叠的像素集。这不是你想要做的事情......

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

相关问题