Обработка изображений - вращение и оптическое распознавание символов - PullRequest
4 голосов
/ 10 апреля 2011

Доброе утро всем,

Сегодня я хочу побеспокоиться о теме "Работа с изображениями в C ++".

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

Но теперь у меня есть два вопроса.

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

enter image description here


Второй вопрос:
Как продолжить?Как вы думаете, я должен отправить изображение в «Оптическое распознаватель символов» (а) или я должен отфильтровать каждую букву (б) ?

Если ответравно (a) что такое наименьшая ocr lib?Все библиотеки, которые я нашел до сих пор, кажутся одоленными и трудными для реализации в существующем проекте.(например, gocr или tesseract)

Если ответ (b) , как лучше всего сохранить каждую букву как собственное изображение?Должен ли я искать белый пиксель, а затем перейти от пикселя к пикселю и сохранить координаты в 2D-массиве?Что с буквой «я»;)


Спасибо всем, кто поможет мне найти свой путь!
Извините за странный английский выше.Я до сих пор язык нуб : -)

Ответы [ 3 ]

4 голосов
/ 10 апреля 2011

Обычное название проблемы в вашем первом вопросе - «Исправление перекоса»

enter image description here

Вы можете использовать Google для этого (множество ссылок).Хорошая статья здесь , показывающая, например, как это получить:

enter image description here

Простой способ начать (но не так хорошокак упоминалось ранее), должен выполнить анализ основных компонентов :

enter image description here

1 голос
/ 10 апреля 2011

По первому вопросу:

Во-первых, удалите все «спецификации» шумных белых пикселей, которые не являются частью буквенной последовательности. Мягкий фильтр нижних частот (цвет пикселя = среднее из окружающих пикселей) с последующей фиксацией значений пикселей до чисто черного или чисто белого. Это должно избавить от маленькой «точки» под символом «а» на вашем изображении и любых других характеристиках.

Теперь ищите следующие пиксели:

xMin = white pixel with the lowest  x value (white pixel closest to the left edge)
xMax = white pixel with the largest x value (white pixel closest to the right edge)
yMin = white pixel with the lowest  y value (white pixel closest to the top edge)
yMax = white pixel with the largest y value (white pixel closest to the bottom edge)

with these four pixel values, form a bounding box: Rect(xMin, yMin, xMax, yMax);
compute the area of the bounding box and find the center.

using the center of the bounding box, rotate the box by N degrees. (You can pick N: 1 degree would be an ok value).

Repeat the process of finding xMin,xMax,yMin,yMax and recompute the area

Continue rotating by N degrees until you've rotated K degrees.  Also rotate by -N degrees until you've rotated by -K degrees.  (Where K is the max rotation... say 30 degrees). At each step recompute the area of the bounding box.

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

0 голосов
/ 10 апреля 2011

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

...