Tesseract OCR с Java с примерами
В этой статье мы узнаем, как работать с Tesseract OCR на Java с помощью Tesseract API .
Что такое Tesseract OCR?
Tesseract OCR - это система оптического чтения символов, разработанная лабораториями HP в 1985 году и открытая в 2005 году. С 2006 года она разрабатывается Google. Tesseract имеет поддержку Unicode (UTF-8) и может распознавать более 100 языков «из коробки» и, таким образом, может также использоваться для создания программного обеспечения для сканирования на разных языках. Последняя версия Tesseract - Tesseract 4 . Он добавляет новый механизм OCR на основе нейронной сети (LSTM), который ориентирован на распознавание строк, но также по-прежнему поддерживает устаревший механизм OCR Tesseract, который работает путем распознавания шаблонов символов.
Как работает OCR?
Обычно OCR работает следующим образом:
- Предварительная обработка данных изображения, например: преобразование в шкалу серого, сглаживание, устранение перекоса, фильтрация.
- Обнаруживайте строки, слова и символы.
- Составьте ранжированный список персонажей-кандидатов на основе обученного набора данных. (здесь метод setDataPath () используется для установки пути к данным тренера)
- Постобработка распознанных символов, выбор лучших символов на основе достоверности предыдущего шага и языковых данных. Языковые данные включают словарь, грамматические правила и т. Д.
Преимущества
Преимущества OCR многочисленны, но именно:
- повышает эффективность и результативность офисной работы
- Возможность мгновенного поиска по содержанию чрезвычайно полезна, особенно в офисе, который имеет дело с большим объемом сканирования или большим потоком документов.
- OCR обеспечивает быстрое сохранение содержимого документа и экономию времени.
- Рабочий процесс увеличивается, поскольку сотрудникам больше не нужно тратить время на ручной труд и они могут работать быстрее и эффективнее.
Недостатки
- OCR ограничивается распознаванием языка.
- Требуется много усилий, чтобы сделать данные тренера на разных языках и реализовать их.
- Также необходимо проделать дополнительную работу по обработке изображений, поскольку это наиболее важная часть, которая действительно имеет значение, когда речь идет о производительности OCR.
- После выполнения такого огромного объема работы ни одно OCR не может обеспечить точность 100%, и даже после OCR мы должны определить нераспознанный символ с помощью соседних методов машинного обучения или вручную исправить его.
Как использовать Tesseract OCR
- Первый шаг - скачать Tess4J API по ссылке
- Извлеките файлы из загруженного файла
- Откройте свою IDE и создайте новый проект
- Свяжите файл jar с вашим проектом. Обратитесь по этой ссылке.
- Выполните миграцию по этому пути «.. Tess4J-3.4.8-src Tess4J dist».
Теперь вы закончили с jar-файлом ссылок в своем проекте и готовы к использованию механизма tesseract.
Выполнение оптического распознавания символов на четких изображениях
Now that you have linked the jar file, we can get started with our coding part. The following code reads an image file and perform OCR and display text on the console.
import java.io.File; import net.sourceforge.tess4j.Tesseract; import net.sourceforge.tess4j.TesseractException; public class Test { public static void main(String[] args) { Tesseract tesseract = new Tesseract(); try { tesseract.setDatapath( "D:/Tess4J/tessdata" ); // the path of your tess data folder // inside the extracted file String text = tesseract.doOCR( new File( "image.jpg" )); // path of your image file System.out.print(text); } catch (TesseractException e) { e.printStackTrace(); } } |
Input:
Output:
05221859Working:
Распознавание нечетких изображений
Обратите внимание, что выбранное выше изображение на самом деле очень четкое и имеет оттенки серого, но в большинстве случаев этого не происходит. В большинстве случаев мы получаем зашумленное изображение и, следовательно, очень любопытный результат. Чтобы справиться с этим, нам нужно выполнить некоторую обработку изображения, называемую обработкой изображения .
Tesseract работает лучше всего, когда есть очень четкая сегментация текста переднего плана от фона. На практике гарантировать хорошую сегментацию может быть чрезвычайно сложно. Существует множество причин, по которым вы можете не получить вывод хорошего качества из Tesseract, если на изображении присутствует шум на заднем плане. Удаление шума с изображения входит в состав обработки изображения. Для этого нам нужно знать, как нужно обрабатывать изображение.
Вы можете обратиться к этой статье, чтобы получить подробное представление о том, как повысить точность. Чтобы реализовать то же самое в JAVA, мы создадим небольшую интеллектуальную модель, которая будет сканировать содержимое RGB изображения, а затем преобразовывать его в содержимое в оттенках серого, а также мы выполним некоторый эффект масштабирования изображения.
The below example is a sample code on how the image can be grayscaled based on its RGB content. So if images are very dark then they become brighter and clearer and if in case the images are whitish then they are scaled to little dark contrast so that text is visible.
import java.awt.Graphics2D; import net.sourceforge.tess4j.*; import java.awt.Image; import java.awt.image.*; import java.io.*; import javax.imageio.ImageIO; public class ScanedImage { public static void processImg(BufferedImage ipimage, float scaleFactor, float offset) throws IOException, TesseractException { // Making an empty image buffer // to store image later // ipimage is an image buffer // of input image BufferedImage opimage = new BufferedImage( 1050 , 1024 , ipimage.getType()); // creating a 2D platform // on the buffer image // for drawing the new image Graphics2D graphic = opimage.createGraphics(); // drawing new image starting from 0 0 // of size 1050 x 1024 (zoomed images) // null is the ImageObserver class object graphic.drawImage(ipimage, 0 , 0 , 1050 , 1024 , null ); graphic.dispose(); // rescale OP object // for gray scaling images RescaleOp rescale = new RescaleOp(scaleFactor, offset, null ); // performing scaling // and writing on a .png file BufferedImage fopimage = rescale.filter(opimage, null ); ImageIO .write(fopimage, "jpg" , new File( "D:\Tess4J\Testing and learning\output.png" )); // Instantiating the Tesseract class // which is used to perform OCR Tesseract it = new Tesseract(); it.setDatapath( "D:\Program Files\Workspace\Tess4J" ); // doing OCR on the image // and storing result in string str String str = it.doOCR(fopimage); System.out.println(str); } public static void main(String args[]) throws Exception { File f = new File( "D:\Tess4J\Testing and learning\Final Learning Results\input.jpg" ); BufferedImage ipimage = ImageIO.read(f); // getting RGB content of the whole image file double d = ipimage .getRGB(ipimage.getTileWidth() / 2 , ipimage.getTileHeight() / 2 ); // comparing the values // and setting new scaling values // that are later on used by RescaleOP if (d >= - 1 .4211511E7 && d < - 7254228 ) { processImg(ipimage, 3f, -10f); } else if (d >= - 7254228 && d < - 2171170 ) { processImg(ipimage, 1 .455f, -47f); } else if (d >= - 2171170 && d < - 1907998 ) { processImg(ipimage, 1 .35f, -10f); } else if (d >= - 1907998 && d < - 257 ) { processImg(ipimage, 1 .19f, 0 .5f); } else if (d >= - 257 && d < - 1 ) { processImg(ipimage, 1f, 0 .5f); } else if (d >= - 1 && d < 2 ) { processImg(ipimage, 1f, 0 .35f); } } } |
Input:
Output:
Working:
Вниманию читателя! Не переставай учиться сейчас. Ознакомьтесь со всеми важными концепциями Java Foundation и коллекций с помощью курса "Основы Java и Java Collections" по доступной для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .