php распознавание текста на картинке
OCR в PHP: чтение текста с изображений с помощью Tesseract
Оптическое распознавание символов (OCR) — это процесс преобразования печатного текста в цифровое представление. Он имеет множество практических применений — от оцифровки печатных книг, создания электронных записей квитанций до распознавания номерных знаков и даже обхода CAPTCHA на основе изображений.
Tesseract — это программа с открытым исходным кодом для выполнения распознавания текста. Вы можете запустить его на системах * Nix, Mac OSX и Windows, но используя библиотеку, мы можем использовать ее в приложениях PHP. Этот учебник разработан, чтобы показать вам, как.
Установка
подготовка
Для простоты и согласованности мы будем использовать виртуальную машину для запуска приложения, которое мы предоставляем с помощью Vagrant. Это позаботится об установке PHP и Nginx, хотя мы установим Tesseract отдельно, чтобы продемонстрировать процесс.
Vagrant Setup
Введите следующую команду, чтобы загрузить конфигурацию Homestead Improved Vagrant в каталог с именем ocr :
Давайте изменим конфигурацию Nginx в Homestead.yml из:
Вам также необходимо добавить следующее в ваш файл hosts:
Установка Tesseract Binary
Следующим шагом является установка двоичного файла Тессеракта.
Как я упоминал выше, в README есть инструкции для других операционных систем.
Тестирование и настройка установки
Мы собираемся использовать оболочку PHP, но прежде чем мы начнем строить, мы можем проверить, что Tesseract работает с использованием командной строки.
В виртуальной vagrant ssh ( vagrant ssh ) выполните следующую команду, чтобы «прочитать» образ и выполнить процесс распознавания:
Это создает файл в текущей папке с именем out.txt который все хорошо, должен содержать слово «ВНИМАНИЕ».
Теперь попробуйте с файлом sign2.jpg :
( Изображение является адаптированной версией этого ).
На этот раз вы должны обнаружить, что он произвел слово «Einbahnstral’ie». Это близко, но это не правильно — даже несмотря на то, что текст на изображении довольно четкий и ясный, он не смог распознать символ eszett (ß).
Чтобы Tesseract правильно прочитал строку, нам нужно установить несколько новых языковых файлов — в нашем случае это немецкий.
Здесь представлен полный список доступных языковых файлов, но давайте просто скачаем соответствующий файл напрямую:
Затем скопируйте файлы в следующий каталог:
На этот раз текст должен быть правильно обозначен как «Einbahnstraße».
Не стесняйтесь добавлять дополнительные языки, повторяя этот процесс.
Настройка приложения
Мы собираемся использовать эту библиотеку-оболочку для использования Tesseract из PHP.
Мы собираемся создать действительно простое веб-приложение, которое позволит людям загружать изображения и видеть результаты процесса распознавания. Для его реализации мы будем использовать микрорамку Silex — хотя не беспокойтесь, если вы с ней не знакомы, так как само приложение будет очень простым.
Первый шаг — установить зависимости с помощью Composer:
Теперь создайте следующие три каталога:
Нам понадобится форма для загрузки ( views\index.twig ):
И страница с результатами ( views\results.twig ):
Теперь создайте скелет приложения Silex ( public\index.php ):
Если вы посещаете приложение в своем браузере, вы должны увидеть форму загрузки файла. Если вы следите за новостями и используете Homestead Improved с Vagrant, вы найдете его по следующему URL:
Как вы можете видеть, мы генерируем квазислучайное имя файла, чтобы минимизировать конфликты имен файлов — но, в конечном счете, в контексте этого приложения не имеет значения, что мы называем загруженным файлом.
Получив копию файла в локальной файловой системе, мы можем создать экземпляр библиотеки Tessearct, передав ему путь к изображению, которое мы хотим проанализировать:
Выполнить OCR на изображении действительно просто. Мы просто вызываем метод recognize() :
Наконец, мы можем отобразить страницу результатов, передав ей результаты OCR:
Практический пример
Давайте посмотрим на более практическое применение технологии OCR. В этом примере мы попытаемся найти и отформатировать номер телефона, встроенный в изображение.
Посмотрите на следующее изображение и попробуйте загрузить его в свое приложение:
Результаты должны выглядеть так:
Он не подхватил основной текст, который мы могли ожидать из-за низкого качества изображения. Он идентифицировал номер телефона, но там также есть некоторый дополнительный «шум».
Чтобы попытаться извлечь соответствующую информацию, есть несколько вещей, которые мы можем сделать.
Вы можете указать Tesseract ограничить его вывод определенными диапазонами символов. Таким образом, мы можем сказать, чтобы он возвращал только цифры, используя следующую строку:
Однако есть проблема с этим. Вместо того, чтобы игнорировать нечисловые символы, он обычно интерпретирует буквы как цифры. Например, имя «Боб» можно интерпретировать как число «808».
Вместо этого давайте используем двухэтапный процесс:
Давайте добавим порт PHP библиотеки libphonenumber в наш файл composer.json :
Не забудьте обновить:
Теперь мы можем написать функцию, которая принимает строку и пытается извлечь из нее действительный номер телефона:
Надеемся, что комментарии объяснят, что делает функция. Обратите внимание, что если библиотека не сможет проанализировать строку чисел как номер телефона, она выдаст исключение. Это не проблема как таковая; мы просто игнорируем это и переходим к следующему кандидату.
Теперь мы можем использовать его следующим образом:
Мы должны предоставить libphonenumber «подсказку» о том, в какой стране находится телефонный номер. Вы можете изменить это для своей страны.
Мы могли бы обернуть все это в новый маршрут:
Теперь у нас есть простой API — и, следовательно, ответ JSON, — который мы могли бы использовать, например, в качестве серверной части простого мобильного приложения для добавления контактов или осуществления вызовов с печатного номера телефона.
Резюме
OCR имеет много приложений — и его легче интегрировать в ваши приложения, чем вы могли ожидать. В этой статье мы установили пакет OCR с открытым исходным кодом; и, используя библиотеку-оболочку, интегрировал ее в очень простое PHP-приложение. Мы только коснулись поверхности того, что возможно, но, надеюсь, это дало вам некоторые идеи относительно того, как вы можете использовать эту технологию в своих собственных приложениях.
Распознавание текста с помощью OCR
Tesseract — это движок оптического распознавания символов (OCR) с открытым исходным кодом, является самой популярной и качественной OCR-библиотекой.
OCR использует нейронные сети для поиска и распознавания текста на изображениях.
Tesseract ищет шаблоны в пикселях, буквах, словах и предложениях, использует двухэтапный подход, называемый адаптивным распознаванием. Требуется один проход по данным для распознавания символов, затем второй проход, чтобы заполнить любые буквы, в которых он не был уверен, буквами, которые, скорее всего, соответствуют данному слову или контексту предложения.
На одном из проектов стояла задача распознать чеки с фотографий.
Инструментом для распознавания был использован Tesseract OCR. Плюсами данной библиотеки можно отметить обученные языковые модели (>192), разные виды распознавания (изображение как слово, блок текста, вертикальный текст), легкая настройка. Так как Tesseract OCR написан на языке C++, был использован сторонний wrapper c github.
Различиями между версиями являются разные обученные модели (версия 4 имеет большую точность, поэтому мы использовали её).
Нам потребуются файлы с данными для распознавания текста, для каждого языка свой файл. Скачать данные можно по ссылке.
Чем лучше качество исходного изображения (имеют значение размер, контрастность, освещение), тем лучше получается результат распознавания.
Также был найден способ обработки изображения для его дальнейшего распознавания путем использования библиотеки OpenCV. Так как OpenCV написан на языке C++, и не существует оптимального для нашего решения написанного wrapper’а, было решено написать собственный wrapper для этой библиотеки с необходимыми для нас функциями обработки изображения. Основной сложностью является подбор значений для фильтра для корректной обработки изображения. Также есть возможность нахождения контуров чеков/текста, но не изучено до конца. Результат получился лучше (на 5-10%).
language — язык текста с картинки, можно выбрать несколько путем их перечисления через «+»;
pageSegmentationMode — тип расположения текста на картинке;
charBlacklist — символы, которые будут игнорироваться ignoring characters.
Использование только Tesseract дало точность
70% при идеальном изображении, при плохом освещении/качестве картинки точность была
Vision + Tesseract OCR
Так как результат был неудовлетворителен, было решено использовать библиотеку от Apple — Vision. Мы использовали Vision для нахождения блоков текста, дальнейшего разделения изображения на отдельные блоки и их распознавания. Результат был лучше на
5%, но и появлялись ошибки из-за повторяющихся блоков.
Недостатками этого решения были:
MLKit
Еще одним из методов определения текста является MLKit от Google, развернутый на Firebase. Данный метод показал наилучшие результаты (
90%), но главным недостатком этого метода является поддержка только латинских символов и сложная обработка разделенного текста в одной строке (наименование — слева, цена — справа).
В итоге можно сказать, что распознать текст на изображениях — задача выполнимая, но есть некоторые трудности. Основной проблемой является качество (размер, освещенность, контрастность) изображения, которую можно решить путем фильтрации изображения. При распознавании текста при помощи Vision или MLKit были проблемы с неверным порядком распознавания текста, обработкой разделенного текста.
Распознанный текст может быть в ручную откорректирован и пригоден к использованию; в большинстве случаев при распознавании текста с чеков итоговая сумма распознается хорошо и не нуждается в корректировках.
PHP: распознать цифры, буквы с картинки
Приветствую вас дорогие читатели! В этой небольшой статья я поделюсь с вами своими небольшими наработками, по распознанию цифр и букв, а впрочем и любых других символов с картинки. Наверняка многие из вас задумывались о том, как бы распознать код с capcha в автоматическом режиме. Написать для этого скрипт и творить свои темные делишки;) Мне же предстояла задача, распознать с нескольких тысяч картинок текст и сделать это было нужно с помощью PHP (впрочем инструмент может быть и другим С, C++, delphi и т.д.)
Для начала вкратце расскажу о логике работы нашего скрипта, все достаточно просто и можно разделить на следующие этапы:
1) Загрузка картинки в память
2) Перебор всех пикселей картинки с получением значения цвета пикселя и запись значения в многомерный массив или одномерный линейный массив в зависимости от алгоритма сверки (я использовал второй вариант).
3) Приведение пикселей «шума» на изображение в нулевое значение, чтобы далее не путаться с ним.
4) Сверка элементов массива(матрицы) с эталонным массивом, содержащим значения той или иной буквы символа. В случаи максимального совпадения значений, фиксируем букву — как распознанную.
Например, вот так выглядит цифра 2 первого шрифта:
Сложность заключается в том, что шрифт в тексте может быть разным, а также разного размера, в результате эталонный массив со значениями должен включать данные и их. Т.е. основная работа сводится к подготовке именно такого эталонного массива со значениями всех символов, с разным шрифтом и размером.
Картинка для распознания
Код скрипта выглядит следующим образом, (в листинге присутствует много лишнего кода, для вывода результатов в браузер, надеюсь в процессе разбора вам будет все понятно)
Пример работы скрипта можно посмотреть по этой ссылке.
Надеюсь вы почерпнете, что-то новое для себя из этого решения. В данном случае наиболее важен сам принцип и алгоритм реализации распознания текста с картинки, а язык программирования и сам код уже остается за вами.
Также существуют и другие способы распознания текста, например нейронные сети, о которых так много говорят;) Успехов!
Похожие записи
1 Comment to “PHP: распознать цифры, буквы с картинки”
спасибо очень помогло распознать номер с картинки,
правда пришлось из твоего же кода, сделать сначала определить пикселей чтоб сделать свои цифры, так как у меня картинка была в разы больше по пикселям
А потом переделать под себя.
Оставить комментарий
Друзья, всем привет!
Меня зовут Роман Чернышов, я веб-разработчик и данный блог посвящен моим проектам и бизнесу.
Тут я делюсь личным опытом
и отвечаю на вопросы. Я всегда готов к сотрудничеству с вами, готов реализовать проект любой сложности( опыт 10+ лет ).
Детектирование текста на изображении, антиспам
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Генерация текста на изображении
Здравствуйте! Только начал изучать php, поэтому уж слишком сильно не ругайте, пожалуйста. Задача.
Каракули вместо текста на изображении
Здравствуйте. Как только я решил проблему с накладыванием текста на изображения обнаружил еще одну.
Детектирование трещин на изображении
Добрый день, уважаемые господа и дамы. Я нахожусь в критической ситуации, когда сам уже ничего не.
Добавлено через 34 секунды
Ну или Администратор
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Распознавание текста на изображении
Знаю, тема не нова, но очень нужно распознать текст на изображении(
100x25px, язык английский +.
Распознавание текста на изображении
Потребовалось распознать текст на картинке, попытался найти готовые библиотеки, из таких нашел.
Поиск текста в изображении
Ситуация такова: Есть цветное изображения x*y размера надо найти текст(на белом фоне) он его цвет.
imagefttext
(PHP 4 >= 4.0.7, PHP 5, PHP 7, PHP 8)
imagefttext — Нанесение текста на изображение, используя шрифты FreeType 2
Описание
Список параметров
Размер шрифта в пунктах.
Угол в градусах, 0 градусов означает расположение текста слева направо. Положительные значения означают поворот текста против часовой стрелки. Например, текст повёрнутый на 90 градусов нужно будет читать снизу вверх.
y-координата. Это позиция базовой линии шрифта, в общем случае она не совпадает с низшей точкой в символе.
Путь к TrueType шрифту, который требуется использовать.
В большинстве случаев размещение файлов шрифтов в директории скрипта решает подобные проблемы включения файлов.
Текст для вставки в изображение.
Ключ | Тип | Значение |
---|---|---|
linespacing | float | Определяет рисование нижнего подчёркивания |
Возвращаемые значения
Эта функция возвращает массив, определяющий четыре точки рамки текста. Текст внутри этих границ начинается с левого нижнего угла и поворачивается против часовой стрелки:
0 | нижняя левая x-координата |
1 | нижняя левая y-координата |
2 | нижняя правая x-координата |
3 | нижняя правая y-координата |
4 | верхняя правая x-координата |
5 | верхняя правая y-координата |
6 | верхняя левая x-координата |
7 | верхняя левая y-координата |
Список изменений
Версия | Описание |
---|---|
8.0.0 | image теперь ожидает экземпляр GdImage ; ранее ожидался ресурс ( resource ). |
Примеры
Пример #1 Пример использования imagefttext()
// Путь к ttf файлу шрифта
$font_file = ‘./arial.ttf’ ;
// Вывод изображения
header ( ‘Content-Type: image/png’ );
Примечания
Смотрите также
User Contributed Notes 15 notes
Do this as root :
apt-get install libfreetype6-dev
After spending the evening with some work on automatically generated images, I had the idea to switch of anti-aliasing (looking, if some font would look better that way), which turned out not to be quite so easy.
Actually you have to use the negative of the desired color to switch of antialising. I include the corresponding line from my code (line split up):
// USE NEGATIVE OF DESIRED COLOR TO SWITCH OF ANTI-ALIASING
ImageFTText ($neuesBild,$fontsize,$fontangle,$TextPosX,$TextPosY,
-$custom_fg,$fonttype,$text,array());
If you’re interested in turning off FreeType hinting, search for the following line in the gd source (gdft.c):
err = FT_Load_Glyph (face, glyph_index, FT_LOAD_DEFAULT);
and replace it with
err = FT_Load_Glyph (face, glyph_index, FT_LOAD_NO_HINTING);
Recompile GD, and vo�la: beauteous antialiasing.
This function is very simular to imageffttext(), you may find the information provided on its manual page helpful:
For a design project I am required to have spacing between characters; since imagefttext does not support this feature I have created a function which does support this.
The arguments are identical to imagefttext, accept that (array)$extrainfo now accepts the ‘character_spacing’ spacing parameter. The return values are as expected, and include the image boundaries of the entire string including the character spacing.
I hope this is of some use to someone.
— KeepSake
// Required header (assuming we use png images)
header ( «Content-type: image/png» );
could be different. This helped when setting GDFONTPATH.
GD1 was OK as it used pixels for font rendering, but GD2 uses points, which only makes any sense if you know the DPI that it assumes when rendering text on the image surface. I have not been able to find this anywhere in this documentation but have examined the GD2 source code and it appears to assume a DPI of 96 internally. However, this can easily be customised in the GD2 source so it cannot be assumed that all PHP interpreters out there have a GD2 compiled using 96dpi internally.
If it does, and you are using it to construct images whose target DPI is not 96, you can calculate the point size to supply to imageftbox() and imagefttext() like this:
/* 100mm x 100mm image */
$imageWidth = 100 ;
$imageHeight = 100 ;
/* 300 dpi image, therefore image is 1181 x 1181 pixels */
$imageDPI = 300 ;
header ( «Content-type: image/jpeg» );
I found myself in need of an align right function and found one on the imagepstext manual page. I can’t imagine I’m the only person who’s needed to use this, so here’s a slightly modified version that works with imagefttext:
$text1 = «shenko.homedns.org» ; // Here is our text
Thanks for the script! I modified it to show several fonts that I was wanting to use. I am using GD-2.0.7, FreeType-2.1.3(text rotation fix,among others), and PHP-4.2.3 and had to include the array information to get it to work.
Code change follows:
$fontfile=»/usr/local/fonts/ttf/bookantbd.ttf»;
// Waterfall of point sizes to see what Freetype 2’s autohinting looks like:
//
for($i=4;$i 1.0));
>
Since this function is not documented, I felt it was best that I shed some light on the extrainfo parameter.
Basically it accepts an array containing the following options as keys and an associated value:
(int) flags [more info in the GD reference manual]
(double/float) linespacing
(int) charmap
(int) hdpi
(int) vdpi
(string) xshow
(string) fontpath
My C/C++ is not very good but this is the best I can explain. Read the documentation for more information. 🙂
A very simple example of usage would be:
I’m not sure if this is a PHP issue or an GD issue, but after upgrading to PHP 5.3.2, text written at an angle has become top-justified (so «N» and «n» have the same top, but the bottom of the «N» is lower than the bottom of the «n». I’ve written a kludgy work-around, which writes the text to a non-rotated temporary image, then copies the temporary image, rotated onto the main image. The kludginess is to get around the fact that I can’t seem to extract the font info, particularly the distance between the baseline and the very bottom (I’ve hard-coded it as 30% of the font size)
I hope the bug can be fixed (if it is indeed a bug) or that others can improve this code: