java openimaj OutOfMemoryError при использовании алгоритма MSER для обнаружения текста

Я хочу выполнить обнаружение текста на изображении с помощью java. Я использую OpenIMAJ для этого с использованием алгоритма MSER (в качестве первого этапа), но это требует много времени обработки, и в большинстве изображений возвращается исключение OutOfMemoryError.

Пробовал менять параметры, а также менять исходный код алгоритма, но проблема осталась.

Когда я использовал алгоритм MSER с использованием Matlab, он был быстрым и не имел ошибок 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 изображения, выдающего OutOfMemoryError:

введите здесь описание изображения

пожалуйста помоги.


person Hamdi Altaheri    schedule 18.01.2016    source источник
comment
Только предположение, но это, вероятно, из-за высокого качества изображения. Вы пытались сжать его в меньший размер и качество? Каковы размеры и размер изображений?   -  person Enrichman    schedule 19.01.2016
comment
спасибо, на самом деле ошибка возникает даже на небольших изображениях, например (размер 667x397 и 96 dpi). также я работаю над видео в режиме реального времени, поэтому мне нужно очень быстрое время отклика.   -  person Hamdi Altaheri    schedule 19.01.2016


Ответы (1)


OpenIMAJ реализует быстрый алгоритм MSER, определенный Нистером и Стевиниусом (см. http://link.springer.com/chapter/10.1007%2F978-3-540-88688-4_14). Реализация OpenIMAJ очень быстро находит опорные пиксели каждой максимально стабильной области (это можно увидеть, удалив ссылку на PixelsFeature.class из кода).

Причина, по которой вы получаете OOM и плохую производительность при использовании PixelsFeature, заключается в том, что базовый алгоритм водораздела создает связанный компонент для каждого региона для каждого из 256 уровней серого (это происходит до того, как будут найдены максимально стабильные компоненты, поэтому он собирается создать действительно массивная древовидная структура с перекрывающимися наборами пикселей на каждом уровне). Это не то, чем ты хочешь заниматься...

У меня нет никакого кода, чтобы продемонстрировать альтернативный подход, но вы, вероятно, захотите вычислить опорные пиксели, а затем работать в обратном направлении, чтобы получить ConnectedComponents, используя подход, похожий на заливку. Если направление MSER было Up, то, начиная с каждого опорного пикселя, выполните заливку изображения, чтобы найти связанный компонент, состоящий из всех значений пикселей, меньших или равных значению опорного пикселя (обратите внимание, что опорные пиксели представляют их серые цвета). level как целое число; вам нужно разделить на 255, чтобы получить его как много, совместимое с входным изображением).

person Jon    schedule 20.01.2016