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

java openimaj OutOfMemoryError when using MSER algorithm for text detection

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

没有问题的图片示例:

发生内存溢出错误的图片示例2:

请帮忙。

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

使用 PixelsFeature 时出现 OOM 和性能不佳的原因是底层分水岭算法正在为 256 grey-levels 中的每一个区域的每个区域创建一个连通分量(这发生在最大找到稳定的组件,因此将创建一个真正巨大的树结构,每个级别都有重叠的像素集)。这不是你想做的事...

我手头没有任何代码来演示替代方法,但您可能想要做的是计算枢轴像素,然后使用 [=22= 向后工作以获取 ConnectedComponents ] 喜欢的办法。如果 MSER 方向为 Up,则从每个枢轴像素开始对图像进行泛洪填充,以找到由小于或等于枢轴像素值的所有像素值组成的连通分量(注意枢轴像素将它们的 grey-level 表示为整数;您需要除以 255 才能使其与输入图像兼容)。