Перейти к содержимому
Compvision.ru

ok_demo

Пользователи
  • Количество публикаций

    10
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные пользователем ok_demo


  1. Необходимо распознать текст на однотонном фоне (шрифт стандартный, например, Times New Roman) с определенной области изображения.

    За счет каких функций, решений это можно осуществить?

    Заранее спасибо.

    Думаю, так просто, как Вы думаете, не получится. Более того, OpenCV, ИМХО, не обладает таким потенциалом в области OCR, как специализированные разработки. Сталкивался с tesseract - вполне себе понравилось, и лицензия хорошая.


  2. Есть одна авантюрная мысль, нормировать все компоненты точек (привести максимальные элементы к 255. Работать нужно с тройками - берем максимальный компонент из R,G и B и умножаем его на коэффициент такой чтобы он стал равным 255 и остальные оставшиеся два компонента умножаем на тот-же коэффициент), тогда все серое станет белым :D Потом через бинаризатор и очиститель мелкого шума.

    Да вроде как уже отделить серое от цветного не проблема. Проблема в том, что на иллюстрациях оказалось слишком много серого цвета, особенно на границах.


  3. Описываю, как находил новые границы изображения. Ввёл два пороговых значения: цветовое и процентное.

    Прохожу по XArr, считаю число элементов XArr меньше цветового порога. Если их процент от общего числа меньше процентного порога, то увеличиваю на 1 минимальный X, уменьшаю на 1 максимальный X, осуществляю повторный проход в новых границах. Если их больше процентного порога, то минимальный и максимальный X - новые границы изображения. Аналогичную процедуру выполняю для Y.

    Данный метод сильно зависит от выбранных порогов и не позволяет улучшить выделение иллюстраций (по крайней мере в моей реализации).

    Не очень понял логику алгоритма. Может быть, поэтому он мне не нравится? :D

    Куски мы определили.

    Далее вычисляем проекции.

    Сглаживаем обязательно!

    После этого ищем "пики наоборот". Пример определения можно подсмотреть в одном из известных проектов (прикрепляю два файла на джаве, логику работы там можно посмотреть, правда, джавовское расширение не хотело загружаться, пришлось файлы переименовать). Смотреть функцию BandGraph::findPeaks();

    Graph.txt

    BandGraph.txt


  4. На одной странице может быть и несколько иллюстраций.

    Тут скорее проблема будет даже не с тем, что их несколько, а с тем, как они расположены на странице (если они пересекаются горизонтально и вертикально, то алгоритм анализа диаграмм существенно усложнится) и какого они размера (достаточно небольшие иллюстрации при достаточно жирном шрифте могут "тонуть" на общей диаграмме, что усложнит их поиск). В общем, трудно сказать, не видя исходных изображений, нужно пробовать, что получится. Благо, все обсуждаемые алгоритмы просты и не требуют даже OpenCV. :D


  5. Как минимум, озадачивает уже этот код:

    Maximum := GetMaximum([abs(Row^[x].rgbtRed - Row^[x].rgbtGreen),

    abs(Row^[x].rgbtGreen - Row^[x].rgbtBlue),

    abs(Row^[x].rgbtRed - Row^[x].rgbtGreen)]);

    В третьей строчке явно нужно отнимать от синего красный (или наоборот).

    Ну и далее.

    "Слишком большой порог - области вне иллюстраций идеально белые, но и сами иллюстрации обрезаны".

    В смысле обрезаны? По краю идеально обрезаны? Т.е. у них по краям что-то типа заливки, близкой к оттенкам серого? И Вы хотите ее сохранить?

    В таком случае можно сделать, например, следующее.

    1. Пропускаем изображение через данный алгоритм.

    2. Определяем зоны иллюстраций.

    3. Увеличиваем их на определенную величину (трудно сказать, какую, нужно оценить, думаю, процентов 30 будет достаточно).

    4. Строим горизонтальную и вертикальную проекцию каждого куска на исходном изображении (суммируем интенсивность каждого столбца и строки), белый фон будет давать всплески, иллюстрация - провалы.

    На самом деле, можно попробовать обработать сразу п.4 все исходное изображение, я как-то сразу не подумал об этом, но алгоритм существенно усложнится, если на одной странице несколько иллюстраций и они расположены на ней произвольным образом. А так сначала определяем позицию каждой иллюстрации, а потом уточняем ее границы.


  6. Реализовал пробный вариант. Приблизительное равенство определяется некоторым порогом. Для каждой отдельной иллюстрации можно подобрать порог, чтобы она определялась безошибочно. При уменьшении порога нарастает шум и сбивается работа cvFindContours. При увеличении порога возникают погрешности в определении границ. В среднем в первой реализации Ваш метод обеспечивает примерно такую же точность, как и cvMorphologyEx с CV_MOP_CLOSE.

    А можно код увидеть?

    Я так понимаю, проблемы должны быть с самой иллюстрацией, ибо все остальное достаточно черно-белое и должно хорошо отсекаться. При увеличении порога на иллюстрации должны все более проявляться белые пятна (пиксели, достаточно близкие к оттенкам серого). Именно с ними возникают проблемы?


  7. Посмотрите еще этот документ: http://www.compvision.ru/forum/index.php?a...=post&id=95

    Не самый простой способ, но его часто используют при OCR.

    ИМХО, для поставленной задачи это слишком громоздкое решение. Я бы попытался сделать проще. По крайней мере, для начала.


  8. Точно не скажу, какие конкретно функции могут помочь, но по Вашему описанию логика решения достаточно проста.

    В ч/б изображении значения RGB компонент равны, в отличие от цветного. Почему бы не использовать этот признак? Например, обходите изображение и помечаете все пиксели с равными (ну или приблизительно равными) RGB компонентами нолями, а прочие единицами. В результате получите маску цветных иллюстраций (вероятно, с некоторым шумом).

    P.S. В принципе, можно теперь открыть документацию OpenCV и поискать функцию, которая поможет нам провести подобную обработку, и избавиться при необходимости от возможного шума.


  9. 1. Нет, надо потр..аться с перекомпилированием OpenCV, пересознанием его проектов.

    Перекомпилировать придется, пересоздавать проекты нужды нет.

    В двух словах:

    1. Открываете солюшен OpenCV, в нужных проектах выставляете цель линковки lib вместо dll.

    2. Собственно, компилируете, ищете нужные файлы (к сожалению, пути настроены не совсем очевидным образом).

    3. Кроме этого необходимо забрать скомпилированные lib-файлы для сторонних библиотек (libpng, libjpeg и пр.).

    5. Также нам понадобится файл videoInput.lib, его можно найти в папке 3rdparty/lib.

    7. Еще нужны файлы vfw32.lib и comctl32.lib (у меня они потащились из Platform SDK).

    8. Берете из OpenCV папку include.

    9. Последний штрих - кроме подключения всех этих библиотек, в Вашем компилируемом файле необходимо в список игнорируемых библиотек добавить файл atlthunk.lib (его будет пытаться тащить за собой упоминаемый выше videoInput.lib).

    Собственно, все достаточно просто. И теперь на выходе только один exe-файл. Очень удобно.

×