Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Алгоритмы > Отделение текста от рисунков |
Автор: Y-Vladimir 16.1.2007, 18:13 |
Задача в следующем: есть отсканированное бинарное изображение страницы, на которой есть текст с рисунками. Необходимо выделить области с текстом и области с изображениями подобно тому, как это делает FineReader на этапе анализа макета страницы. Т.е. необходим некоторый критерий определения текст или рисунок содержится в данном фрагменте. Я пока придумал следующий подход: Изображение равномерно разбивается на квадратные сегменты с условием, чтобы в сегменте помещалось 2-5 строк текста. Вот 3 признака того, что в данном сегменте содержится текст: 1). Доля черных пикселей от 0.1 до 0.4 2). В пределах сегмента все элементы (точки, линии) примерно равной толщины 3). Есть пустые (или почти пустые) горизонтальные полосы — это типа междустрочья Все это я реализовал, результаты есть, но пока далеко от идеала. Что можете порекомендовать по сабжу? |
Автор: maxim1000 16.1.2007, 18:34 |
хм... а не связан ли обычно этот этап с самим распознаванием символов? грубо говоря, там , где не получается распознать, там и картинка (ну, скорее всего распознавание не полное, а какое-нибудь "оценочное" - получитсяч/не получится) |
Автор: Y-Vladimir 16.1.2007, 19:00 |
Например FineReader анализ макета страницы и выделение блоков с текстом и рисунками делает до этапа распознавания. Потом блоки, помеченные как текст передаются на распознавание. |
Автор: maxim1000 16.1.2007, 19:24 |
можно попробовать померять самые разнообразные статистические показатели например, автокорреляционную функцию построить для текста и посмотреть... |
Автор: DENNN 16.1.2007, 20:09 |
Рассматривать изображение страницы как "шум" и попытаться выделить "кластеры" на этом изображении. Т.к. рисунок - это почти всегда обособленная область, отджеленная пустым пространством от блоков текста. Только не спрашивай алгоритм, сам не знаю ![]() |
Автор: maxim1000 16.1.2007, 22:48 | ||
ну ничего не мешает заменить false на 0, а true на 1 и получить тем самым обычное серое изображение (ну и что, что только два значения используются) а, например, для оптимизации это вообще не проблема, а, скорее, возможность... кстати, вполне можно надеяться на то, что для букв вертикальная составляющая АКФ даст какие-то более высокие значения, чем, например, для диагональных (впрочем, это при условии приблизительно горизонтальных строк) к тому же, АКФ - всего лишь одна из возможных статистических характеристик можно, например, выискивать часто встречающиеся паттерны... |
Автор: Y-Vladimir 17.1.2007, 11:19 |
Выложил прогу: http://old-book.ksu.ru/page_analizer.rar (470 кб) На интерфейс просьба не ругаться — чисто технологическая программа для отработки алгоритма ![]() Работать следующим образом: 1). "Открыть" — выбираем файл с изображением 2). Подвигать ползунок порога бинаризации пока не получится приемлемый бинарный вид 3). "Анализ" — ждем пару секунд, результат в нижнем окошке. Зеленые сегменты — текст, красные — изображение. Если поставить галочку "Гистограммы", то отобразятся гистограммы каждого блока в горизонтальном направлении. Необходимо еще сделать доводку границ найденных блоков, т.к. пока пока границы определяются слишком грубо. |
Автор: VictorTsaregorodtsev 18.1.2007, 10:45 |
Y-Vladimir, Еще можно посмотреть на формат djvu - он при компрессии сканированной страницы разделяет области текста и графики и каждую из них жмет своим алгоритмом. Каков при этом разделении баланс между строгой математикой и эмпирикой - фиг знает, надо спецификации формата смотреть (где-нибудь на djvuzone.org) |
Автор: Y-Vladimir 18.1.2007, 11:46 |
VictorTsaregorodtsev, про этот формат я знаю - он разделяет текст от фона. Текст сжимает алгоритмом без потерь типа LZW, фон - вейвлетами. Я уже сделал нечто подобное, только для других целей - очистка изображение. Можете глянуть, как это работает здесь: http://old-book.ksu.ru/restoration/index.php |
Автор: Bitter 20.1.2007, 02:29 |
Люди, а вы не пробовали использовать нейросеть Хопфилда (или Хопвилда, не помню точно), а лучше Хемминга. На них же FineReader работает. Заполнили базу символов, расчитали (очень просто) веса сети, а дальше всё, что похоже на, скажем, букву А будет распознано как буква А (во как сказанул...). А сеть Хемминга просто выдаст номер распознанной буквы в базе. Добавлено @ 02:36 ![]() Добавлено @ 02:39 Хотя... может можно использовать для эталонов сети не буквы, а куски текста областью 50х50, например? |
Автор: Y-Vladimir 22.1.2007, 11:11 | ||||
FineReader, судя по http://ocrai.narod.ru/fr.html работает немного на другом принципе. Нейронку он конечно использует, но на вход ей подается не растровое изображение, а набор признаков.
Тогда нейронка будет слишком чувствительна к типу шрифта и размерам букв. Как уже сказал, перед подачей на вход нейронки, нужно провести предобработку и/или преобразование исходного изображения. |
Автор: Bitter 22.1.2007, 16:25 | ||
Y-Vladimir, народ.ру весьма сомнительный портал. Так как там и 10-ти летний может написать всё, что хочет. Хотя я сам не уверен в том, какие сети использует FineReader.
не будет, если использовать сеть Хопфилда, так как она распознаёт всё, что похоже на запомненные ею эталоны. А так как все шрифты друг на друга похожи, то соответственно сеть их распознАет. |