| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Алгоритмы > Определение угла наклона изображения текста |
| Автор: Y-Vladimir 12.5.2005, 15:42 |
| Задача такая: есть сканированное изображение страницы с печатным текстом. Нужно определить угол наклона текста на этой странице. Так, как это делает FineReader на начальном этапе обработки. Единственное, что мог нарыть по этому поводу: http://ocr.apmath.spbu.ru/algorithms/DetectLineDirection.html Может есть другие алгоритмы? |
| Автор: MBo 12.5.2005, 16:36 |
| Преобразование Хафа (Хоха, Hough) попробуй. Возможно, лучше будет сгладить изображение и отшарпить, чтобы строчки в линии превратились. |
| Автор: ~FoX~ 13.5.2005, 14:02 |
| А чем этот алгоритм не устраивает? Хотя можно наверное попроще: 1. Конвертим в черно-белое изображение (чтоб от шумов избавиться). - можно и не делать 2. Берем самый верхний(нижний)-левый пиксель отличный от цвета фона 3. Берем самы вархний(нижний)-правый пиксель отличный от цвета фона 4. Считаем прямую. Например при помощи параметрического представления (так удобней угол считать) 5. Определяме угол наклона прямой. Это и будет угол наклона листа. Добавлено @ 14:04 Правда, если будет много шумов, придется какой то фильтра делать или на крайняк проверку по другому краю листа. |
| Автор: Y-Vladimir 14.5.2005, 10:01 | ||||||
У связки: сглаживание -> резкость -> Преобразование Хафа. Не получится ли слишком большая стоимость по времени? Или я ошибаюсь? Дело в том, что у меня изображения размером 150 мегапикселей, и хотелось бы найти более-менее эффективный алгоритм.
Хотел узнать, может какие есть еще алгоритмы, т.к. у того, на который я привел ссылку, есть некоторые недостатки.
К сожалению этот способ подходит только для изображений с прямоугольным текстовым блоком и без помех (хотя помехи в этом случае можно обходить). В реальности изображения другие. А если на изображении строки не совсем ровные на краях (из-за аббераций фотаппарата), то преобразование Хафа может выделить эти дуги? |
| Автор: ~FoX~ 14.5.2005, 10:54 | ||||||
Почему это? Я же не говорю взять два крайних конца строки, можно взять и некое расстояние, главное чтоб страка была одна, а для простоты можно взять верхнюю/нижнюю строку.
Какие?
В зависимости от оптимизации алгоритма преобразования их можно выделить и как дуги и как прямые (допустим по усредненным значениям). К томуже я не думаю, что при таком разрешении радиус дуги будет настолько большим, что бы иметь значение. Вобще зачем тебе брать именно края возьми середину строки в каком то диапазоне. |
| Автор: MBo 14.5.2005, 11:54 |
| >У связки: сглаживание -> резкость -> Преобразование Хафа. Не получится ли слишком большая стоимость по времени? сглаживание-резкость - не знаю, понадобится ли. Надо проверять. Само преобразование Хафа для такого размера картинок довольно дорогое, конечно. Впрочем, откуда столько точек? А4 в разрешении 1200 dpi? Так для определения наклона такое разрешение не требуется, нужно снимать с меньшим или сжать, если картинки уже имеются. Ведь даже для распознавания в большинстве случаев хватает 300dpi, а 600 - за глаза. |
| Автор: ~FoX~ 14.5.2005, 13:57 | ||
Для всего документа машина "офигеет" считать. Если оптимизировать алгоритм, например брать не весь документ целиком, а какую то его часть, то вполне сносно получиться. Даже со всеми сглаживаниями и резкостью. Главное правильно критерии преобразования задать, а то можно и текст распознать сразу. Если с применением Хафа, то получиться что то вроде: 1. Выделяем строку целиком путем пробегания по ней квадратом с размером по гоизантали в полтора раза больше чем самый длинный символ и по высоте на 7-10% меньше высоты строчного символа. Если сверху /снизу этого квадрата есть явный проблеск, то смещаемся в противоположную сторону. И закрашиваем эту строку чисто черным или проводим прямую 30% от высоты символов. 2. Дальше берем нашего Хафа и считаем параметрическое уравнение прямой. 3. Из него выделяем угол наклона прямой. Только будут проблемы с символами не являющимися буквами: !";:*()_+=- и т.д. Надо думать |
| Автор: Y-Vladimir 14.5.2005, 15:53 | ||||||||
Может получится так, что первая точка будет взята из одной строки, а вторая - из другой. Или может подсчитать за строчку, к примеру, колонтитул или помехи.
Вот пример фрагмента реального изображения, которое я хочу обрабатывать: http://y-vladimir.chat.ru/img/Example.jpg Здесь присутствуют вертикальные, горизонтальные прямые и строчки по краям (здесь не видно) расходятся чуток.
Да нет - метр на пол метра в 300 dpi - это газета 1890 года, у них большой формат. Фотографируется при помощи офигенно дорогого устройства, которое выдает 10000*15000 пикселей.
Проблема в том, что часто встречаются и большие символы и обрамляющие прямоугольники. Надо как-то в среднем все это брать... |
| Автор: ~FoX~ 14.5.2005, 16:39 | ||
Ну так сделай привайв в котором будешь выбирать кусок страницы наиболее подходящий для определения, узнаешь на какой угол повернут кусок и поворачиваешь на минус такой угол весь лист. |
| Автор: Y-Vladimir 14.5.2005, 18:29 | ||
А как можно определить, что такой-то кусок наиболее подходит для вычисления угла? Вообще я хочу случайным образом (или по шаблону) выбрать несколько областей и найти там угол наклона, затем вычислить среднее - на него и повернуть все изображение. |
| Автор: ~FoX~ 16.5.2005, 08:23 |
| Рамки присутствуют на каждом листе? Если да, то преобразование надо делать именно их. ИМХО удобней. Если нет, то вероятнее всего надо выбирать прямоугольные блоки текста, и справа и слева они ровненькие. |
| Автор: Y-Vladimir 16.5.2005, 08:58 | ||||
Нет, не на каждом...
А по какому критерию их можно выбирать, т.е. как лучше определить, что такой-то блок является текстом? |
| Автор: ~FoX~ 16.5.2005, 11:20 |
| А заечем тебе определять что он текст, он может быть и рамкой. На самом деле между колоноками достаточно большое светлое расстояние (вертикальное), вот его то тебе и нужно определить и прочертить по нему наклонную прямую, не обязательно через весь лист. Надеш три таких прямых, получишь среднее значение и повернешь лист на угол минус этого значения. |
| Автор: Graf Zeppelin 17.5.2005, 12:55 | ||
Согласен. Можно текст также уменьшить, чтобы буквы стали почти точечными. |
| Автор: ~FoX~ 17.5.2005, 14:05 | ||
Да вот как раз уменьшать то ему и не рекомендуется, ибо на таких размерах исходного листа могут быть скожения в разную строноу (в зависимости от поверхности на которой он лежит и удаленности кусков проверяемого места друг от друга, от линзы в фотике и т.д.). Скорее надо не по строкам смотреть, а по бокам текстовых блоков, их правые и левые границы достаточно ровыне, что бы по ним можно было провести прямую. Или искать рамки (если они есть) и по ним проводит прямые. |
| Автор: Guest 18.5.2005, 11:44 | ||
Hough transform - самое медленное преобразование. Для таких огромных размеров не подойдет. Надо упрощать. Пути два. Либо уменьшают dpi картинки (при 300 dpi Hough работает еще прекрасно). Либо так - выделяют компоненты связности, т.е. выполняют кластеризацию (это реализуется довольно быстро), строят обрамляющие прямоугольники, выбирают из каждого прямоугольника по одной точке, и только для них считают Hough. Метод работает. Дополнительно нужны кое-какие меры предосторожности, чтобы учесть разные размеры букв. Обычно выполняют сливание 2-3-х ближлижайших кластеров. При кластеризации одновременно удаляют слишком большие кластеры (т.е. рисунки, таблицы, линии и т.д.). Либо, наоборот, выделяют тонкие линии, если есть, и их тоже используют для определения угла наклона. Используют также преобразование Радона, оно намного быстрее Hough, но смысл тот же. Насчет искривления строк - Хаф тут не поможет. Пожалуй, это самая сложная задача в document processing. Мне известны пока только два метода. Но лично я в своей программе пока еще этого реализовать не смог. |
| Автор: Y-Vladimir 18.5.2005, 15:19 | ||||||||||||||||||
Ну так у рамки есть и вертикальные и горизонтальные линии - алгоритм может и сбится. Лучше текстовый блок как-то выцепить...
Я все-таки хочу найти несколько текстовых блоков и там определить угол, потом методом голосования (среднее не покатит - слишком высокая погрешность будет, если хоть один блок даст сильно отличающийся угол)
В приципе в моем случае (да и в других тоже) раза в четыре можно бесболезненно уменьшить изображение и потом его обрабатывать, но размер все равно получается не маленький...
Но если в печтаном тексте выделять компоненты связности, то в каждый такой компонент будет входить либо всего одна буква (изредка - несколько), либо ее часть. Это конечно зависит от шрифта, но в общем случае будет так.
А не будет ли преобразование Хафа в таком случае искать линии в буквах, вместо линий ИЗ букв?
Спасибо за информацию о преобразовании Радона, надо будет почитать...
А как же выделение параметрических дуг с помощью преобразования Хафа?
Да, это весьма сложная задача, хотя ИМХО сегментация т.е. выделение текстовых блоков, изображений, таблиц будет потруднее, хотя может я и ошибаюсь.
А что ты за программу писал? Очень интересно было бы узнать... |