Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Отделение текста от рисунков


Автор: 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
можно попробовать померять самые разнообразные статистические показатели
например, автокорреляционную функцию построить для текста и посмотреть...

Автор: Y-Vladimir 16.1.2007, 19:30
Цитата(maxim1000 @  16.1.2007,  19:24 Найти цитируемый пост)
например, автокорреляционную функцию построить для текста и посмотреть...

Двумерную автокорреляционную функцию? Проблема еще в том, что изображение бинарное... Поэтому применять какие-либо функции затруднительно. Вторая загвоздка в том, что буквы могут быть разного размера в пикселях. Как выбрать критерий, инвариантный к размеру букв и типу шрифта - основная трудность.

Автор: DENNN 16.1.2007, 20:09
Рассматривать изображение страницы как "шум" и попытаться выделить "кластеры" на этом изображении. Т.к. рисунок - это почти всегда обособленная область, отджеленная пустым пространством от блоков текста.
Только не спрашивай алгоритм, сам не знаю smile

Автор: maxim1000 16.1.2007, 22:48
Цитата(Y-Vladimir @  16.1.2007,  18:30 Найти цитируемый пост)
Проблема еще в том, что изображение бинарное... Поэтому применять какие-либо функции затруднительно.

ну ничего не мешает заменить false на 0, а true на 1 и получить тем самым обычное серое изображение (ну и что, что только два значения используются)

а, например, для оптимизации это вообще не проблема, а, скорее, возможность...

кстати, вполне можно надеяться на то, что для букв вертикальная составляющая АКФ даст какие-то более высокие значения, чем, например, для диагональных (впрочем, это при условии приблизительно горизонтальных строк)

к тому же, АКФ - всего лишь одна из возможных статистических характеристик
можно, например, выискивать часто встречающиеся паттерны...

Автор: Y-Vladimir 17.1.2007, 11:19
Выложил прогу:  http://old-book.ksu.ru/page_analizer.rar (470 кб)
На интерфейс просьба не ругаться — чисто технологическая программа для отработки алгоритма smile 

Работать следующим образом:
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 
smile после того, как перечитал вопрос, понял что фигню сказанул... Извиняюсь. Я подумал, что уже распознается текст...

Добавлено @ 02:39 
Хотя... может можно использовать для эталонов сети не буквы, а куски текста областью 50х50, например?

Автор: Y-Vladimir 22.1.2007, 11:11
Цитата(Bitter @  20.1.2007,  02:29 Найти цитируемый пост)
Люди, а вы не пробовали использовать нейросеть Хопфилда (или Хопвилда, не помню точно), а лучше Хемминга. На них же FineReader работает

FineReader, судя по http://ocrai.narod.ru/fr.html работает немного на другом принципе. Нейронку он конечно использует, но на вход ей подается не растровое изображение, а набор признаков.


Цитата(Bitter @  20.1.2007,  02:29 Найти цитируемый пост)
Хотя... может можно использовать для эталонов сети не буквы, а куски текста областью 50х50, например? 

Тогда нейронка будет слишком чувствительна к типу шрифта и размерам букв. Как уже сказал, перед подачей на вход нейронки, нужно провести предобработку и/или преобразование исходного изображения.

Автор: Bitter 22.1.2007, 16:25
Y-Vladimir, народ.ру весьма сомнительный портал. Так как там и 10-ти летний может написать всё, что хочет. Хотя я сам не уверен в том, какие сети использует FineReader.

Цитата

будет слишком чувствительна к типу шрифта и размерам букв


не будет, если использовать сеть Хопфилда, так как она распознаёт всё, что похоже на запомненные ею эталоны. А так как все шрифты друг на друга похожи, то соответственно сеть их распознАет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)