Leer texto de imágenes con C# OCR

En este tutorial, aprenderemos a convertir imágenes en texto en C# y otros lenguajes .NET.

Lectura de texto de imágenes en aplicaciones .NET

Utilizaremos la clase IronOcr.IronTesseract para reconocer texto dentro de imágenes y veremos los matices de cómo utilizar Iron Tesseract OCR para obtener el máximo rendimiento en términos de precisión y velocidad al leer texto de imágenes en .NET

Para conseguir "Imagen a Texto" instalaremos la librería IronOCR en un proyecto de Visual Studio.

Para ello, descargamos el IronOcr DLL o utilice NuGet .

Install-Package IronOcr

¿Por qué IronOCR?

Utilizamos IronOCR para la gestión de Tesseract porque es único en su género:

  • Funciona directamente en .NET puro
  • No requiere que Tesseract esté instalado en su máquina.
  • Funciona con los últimos motores: **Teseracto 5 ( así como Tesseract 4 & 3)
  • Está disponible para cualquier proyecto .NET: .NET Framework 4.5 +, .NET Standard 2 + y .NET Core 2, 3 & 5!
  • Ha mejorado la precisión y la velocidad con respecto al Tesseract tradicional
  • Compatible con Xamarin, Mono, Azure y Docker
  • Gestión del complejo sistema de diccionarios Tesseract mediante paquetes NuGet
  • Admite PDFS, MultiFrame Tiffs y los principales formatos de imagen sin necesidad de configuración.
  • Puede corregir escaneos de baja calidad y sesgados para obtener los mejores resultados de tesseract.

Biblioteca NuGet C# para OCR

Instalar con NuGet

Install-Package IronOcr
o
Java PDF JAR

Descargar DLL

Descargar DLL

Instalar manualmente en su proyecto

Uso de Tesseract en C#

En este sencillo ejemplo, puede ver que utilizamos la función IronOcr.IronTesseract para leer el texto de una imagen y devolver automáticamente su valor como cadena.

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-1.cs
//  PM> Install-Package IronOcr
using IronOcr;

OcrResult result = new IronTesseract().Read(@"img\Screenshot.png");
Console.WriteLine(result.Text);
'  PM> Install-Package IronOcr
Imports IronOcr

Private result As OcrResult = (New IronTesseract()).Read("img\Screenshot.png")
Console.WriteLine(result.Text)
VB   C#

Lo que da como resultado una precisión del 100% con el siguiente texto:

IronOCR Simple Example

In this simple example we will test the accuracy of our C# OCR library to read text from a PNG
Image. This is a very basic test, but things will get more complicated as the tutorial continues.

The quick brown fox jumps over the lazy dog

Aunque esto pueda parecer simplista, "bajo la superficie" se produce un comportamiento sofisticado: se escanea la imagen para comprobar su alineación, calidad y resolución, se examinan sus propiedades, se optimiza el motor de OCR y se utiliza una red de inteligencia artificial entrenada para leer el texto como lo haría un ser humano.

El OCR no es un proceso sencillo para un ordenador, y la velocidad de lectura puede ser similar a la de un ser humano. En otras palabras, el OCR no es un proceso instantáneo. En este caso, sin embargo, es 100% exacto.

Precisión de los resultados de la aplicación OCR en C#

Uso avanzado de IronOCR Tesseract para C#

En la mayoría de los casos de uso del mundo real, los desarrolladores van a querer el mejor rendimiento posible para su proyecto. En este caso, le recomendamos que siga adelante para utilizar el OcrInput y IronTesseract dentro del espacio de nombres IronOcr.

OcrInput te da la facilidad de establecer las características específicas de un trabajo de OCR, tales como:

  • Trabajo con casi cualquier tipo de imagen, incluidos JPEG, TIFF, GIF, BMP y PNG
  • Importación de documentos PDF completos o parciales
  • Mejora del contraste, la resolución y el tamaño
  • Corrección de rotación, ruido de escaneado, ruido digital, inclinación, imágenes negativas

    IronTesseract

  • Elija entre cientos de idiomas y variantes lingüísticas preconfiguradas
  • Utilice los motores OCR Tesseract 5, 4 ó 3 "listos para usar".
  • Especifique un tipo de documento, ya sea una captura de pantalla, un fragmento o un documento completo.
  • Leer códigos de barras
  • Salida de resultados a: PDFs buscables, Hocr HTML , a DOM & Strings

Ejemplo: Primeros pasos con OcrInput + IronTesseract

Todo esto puede parecer desalentador, pero en el ejemplo siguiente verá la configuración predeterminada con la que le recomendamos que empiece, que funcionará con casi cualquier imagen que introduzca en IronOCR.

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-2.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();
using OcrInput input = new OcrInput();
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames(@"img\Potter.tiff", pageindices);
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr

Private ocr As New IronTesseract()
Private OcrInput As using
Private pageindices = New Integer() { 1, 2 }
input.LoadImageFrames("img\Potter.tiff", pageindices)
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
VB   C#

Podemos utilizarlo incluso en un escaneado de calidad media con una precisión del 100%.

C# OCR Scan From Tiff Ejemplo

Como puede ver, la lectura del texto (y opcionalmente códigos de barras) a partir de una imagen escaneada como un TIFF era bastante fácil.

Este trabajo de OCR produce una precisión del 100%.

El OCR no es una ciencia perfecta cuando se trata de documentos del mundo real, pero IronTesseract no puede ser mejor.

También observará que IronOCR puede leer automáticamente documentos de varias páginas, como TIFF e incluso extraer texto de documentos PDF automáticamente.

Ejemplo: Una exploración de baja calidad


C# OCR Escaneado de baja resolución con ruido digital

Ahora probaremos con un escaneado de mucha menor calidad de la misma página, a un DPI bajo, que tiene mucha distorsión y ruido digital y daños en el papel original.

Aquí es donde IronOCR realmente brilla frente a otras librerías de OCR como Tesseract, y encontraremos proyectos alternativos de OCR que rehúyen discutir. OCR en imágenes escaneadas reales en lugar de casos de prueba "perfectos" creados digitalmente para obtener una precisión de OCR del 100%.

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-3.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();
using OcrInput input = new OcrInput();
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames(@"img\Potter.LowQuality.tiff", pageindices);
input.Deskew(); //  elimina la rotación y la perspectiva
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr

Private ocr As New IronTesseract()
Private OcrInput As using
Private pageindices = New Integer() { 1, 2 }
input.LoadImageFrames("img\Potter.LowQuality.tiff", pageindices)
input.Deskew() '  elimina la rotación y la perspectiva
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
VB   C#

Sin añadir Input.Deskew() para enderezar la imagen obtenemos una precisión del 52,5%. No es suficiente.

Añadir Input.Deskew() nos lleva a una precisión del 99,8% que es casi tan preciso como el OCR de un escáner de alta calidad.

Los filtros de imagen pueden tardar un poco en ejecutarse, pero también reducen el tiempo de procesamiento del OCR. Para un desarrollador, conocer sus documentos de entrada es un delicado equilibrio.

Si no está seguro:

  • Input.Deskew() es un filtro seguro y muy acertado de utilizar.
  • En segundo lugar prueba Input.DeNoise() para arreglar el considerable ruido digital.

Ajuste del rendimiento

El factor más importante en la velocidad de un trabajo de OCR es, de hecho, la calidad de la imagen de entrada. Cuanto menor sea el ruido de fondo y mayores sean los ppp, con un objetivo perfecto de unos 200 ppp, se obtendrán los resultados de OCR más rápidos y precisos.

Sin embargo, esto no es necesario, ya que IronOCR brilla a la hora de corregir documentos imperfectos. (aunque esto requiere mucho tiempo y hará que los trabajos de OCR utilicen más ciclos de CPU.).

Si es posible, elegir formatos de imagen de entrada con menos ruido digital, como TIFF o PNG, también puede dar resultados más rápidos que con pérdidas formatos de imagen como JPEG.

Filtros de imagen

Los siguientes filtros de imagen pueden mejorar realmente el rendimiento:

  • OcrInput.Rotate( grados dobles) Gira las imágenes un número de grados en el sentido de las agujas del reloj. Para girar en sentido antihorario, utilice números negativos.
  • OcrInput.Binarize()** Este filtro de imagen convierte cada píxel en blanco o negro sin término medio. Puede mejorar el rendimiento del OCR en casos de muy bajo contraste del texto con el fondo.
  • OcrInput.ToGrayScale() - Este filtro de imagen convierte cada píxel en un tono de escala de grises. Es poco probable que mejore la precisión del OCR, pero puede mejorar la velocidad
  • OcrInput.Contraste() - Aumenta el contraste automáticamente. Este filtro suele mejorar la velocidad y la precisión del OCR en escaneados de bajo contraste.
  • OcrInput.DeNoise() Elimina el ruido digital. Este filtro sólo debe utilizarse cuando se espera ruido.
  • OcrInput.Invert() Invierte todos los colores. Por ejemplo, el blanco se convierte en negro: el negro se convierte en blanco.
  • OcrInput.Dilate() Morfología avanzada. La dilatación añade píxeles a los límites de los objetos de una imagen. Enfrente de Erode
  • OcrInput.Erode() Morfología avanzada. Erosion elimina píxeles en los límites del objetoOpuesto de Dilate
  • OcrInput.Deskew() - Gira una imagen para que quede al derecho y ortogonal. Esto resulta muy útil para el OCR, ya que la tolerancia de Tesseract para los escaneados sesgados puede ser de tan sólo 5 grados.
  • OcrInput.DeepCleanBackgroundNoise()** - Eliminación de ruido de fondo intenso. Utilice este filtro sólo en caso de que se conozca el ruido de fondo extremo del documento, ya que este filtro también corre el riesgo de reducir la precisión del OCR de los documentos limpios, y es muy costoso para la CPU.
  • OcrInput.EnhanceResolution - Mejora la resolución de imágenes de baja calidad. Este filtro no suele ser necesario porque OcrInput.MinimumDPI y OcrInput.TargetDPI detectarán y resolverán automáticamente las entradas de baja resolución.

Ajuste del rendimiento para aumentar la velocidad

Utilizando Iron Tesseract, podemos acelerar el OCR en escaneados de mayor calidad.

Si optimizamos la velocidad, podríamos empezar en esta posición y luego volver a activar funciones hasta encontrar el equilibrio perfecto.

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-4.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();

//  Configurar para velocidad
ocr.Configuration.BlackListCharacters = "~`$#^*_}{][|\\";
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.Auto;
ocr.Language = OcrLanguage.EnglishFast;

using OcrInput input = new OcrInput();
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames(@"img\Potter.tiff", pageindices);

OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr

Private ocr As New IronTesseract()

'  Configurar para velocidad
ocr.Configuration.BlackListCharacters = "~`$#^*_}{][|\"
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.Auto
ocr.Language = OcrLanguage.EnglishFast

Using input As New OcrInput()
	Dim pageindices = New Integer() { 1, 2 }
	input.LoadImageFrames("img\Potter.tiff", pageindices)
	
	Dim result As OcrResult = ocr.Read(input)
	Console.WriteLine(result.Text)
End Using
VB   C#

Este resultado es un 99,8% exacto en comparación con la línea de base 100% - pero un 35% más rápido.

Lectura de regiones recortadas de imágenes

Como se puede ver en el siguiente ejemplo de código, el fork de Iron de Tesseract OCR es experto en la lectura de áreas específicas de las imágenes.

Podemos utilizar un System.Drawing.Rectangle para especificar, en píxeles, el área exacta de una imagen que hay que leer.

Esto puede ser increíblemente útil cuando se trata de un formulario estandarizado que se rellena, en el que sólo una determinada área tiene texto que cambia de un caso a otro.

Ejemplo: Escanear un área de una página

Podemos utilizar un System.Drawing.Rectangle para especificar una región en la que leeremos un documento. La unidad de medida es siempre píxeles.

Veremos que esto proporciona mejoras en la velocidad, además de evitar la lectura de texto innecesario. En este ejemplo leeremos el nombre de un alumno de una zona central de un documento normalizado.

C# OCR Scan From Tiff Ejemplo   C# OCR Scan From Tiff Ejemplo


:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-5.cs
using IronOcr;
using IronSoftware.Drawing;

IronTesseract ocr = new IronTesseract();
using OcrInput input = new OcrInput();
//  una mejora de la velocidad del 41
Rectangle contentArea = new Rectangle(x: 215, y: 1250, height: 280, width: 1335);
input.LoadImage("img/ComSci.png", contentArea);
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Imports IronSoftware.Drawing

Private ocr As New IronTesseract()
Private OcrInput As using
'  una mejora de la velocidad del 41
Private contentArea As New Rectangle(x:= 215, y:= 1250, height:= 280, width:= 1335)
input.LoadImage("img/ComSci.png", contentArea)
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
VB   C#

Esto supone un aumento de la velocidad del 41%** y nos permite ser específicos. Esto es increíblemente útil para situaciones de .NET OCR en las que los documentos son similares y coherentes, como facturas, recibos, cheques, formularios, reclamaciones de gastos, etc.

Áreas de contenido (Recorte OCR) también es compatible con la lectura de archivos PDF.

Idiomas internacionales

IronOCR admite 125 idiomas internacionales a través de paquetes de idiomas que se distribuyen como DLL, que pueden descargarse desde este sitio web, o también desde el gestor de paquetes NuGet para Visual Studio.

Podemos instalarlos navegando por NuGet (busque "IronOcr.Languages") o del Página de paquetes de idiomas OCR.

Entre los idiomas admitidos se incluyen:

  • Afrikaans
  • Amárico También conocido como አማርኛ
  • Árabe También conocido como العربية
  • Alfabeto árabe También conocido como العربية
  • Alfabeto armenio También conocido como Հայերեն
  • Asamés También conocido como অসমীয়া
  • Azerbaiyano También conocido como azərbaycan dili
  • AzerbaiyanoCirílico También conocido como azərbaycan dili
  • Bielorruso También conocido como беларуская мова
  • Bengalí También conocido como Bangla,বাংলা
  • Alfabeto Bengalí También conocido como Bangla,বাংলা
  • Tibetano También conocido como tibetano estándar, tibetano, central ཡིག་
  • Bosnio También conocido como bosanski jezik
  • Bretón También conocido como brezhoneg
  • Búlgaro También conocido como български език
  • CanadianAboriginalAlphabet También conocido como Primeras Naciones Canadienses, Indígenas Canadienses, Nativo Canadiense, Inuit
  • Catalán También conocido como català, valencià
  • Cebuano También conocido como Bisaya, Binisaya
  • Checo También conocido como čeština, český jazyk
  • Alfabeto Cherokee También conocido como ᏣᎳᎩ ᎦᏬᏂᎯᏍᏗ, Tsalagi Gawonihisdi
  • ChineseSimplified También conocido como 中文 (Zhōngwén), 汉语, 漢語
  • ChineseSimplifiedVertical También conocido como 中文 (Zhōngwén), 汉语, 漢語
  • ChinoTradicional También conocido como 中文 (Zhōngwén), 汉语, 漢語
  • ChineseTraditionalVertical También conocido como 中文 (Zhōngwén), 汉语, 漢語
  • Cherokee También conocido como ᏣᎳᎩ ᎦᏬᏂᎯᏍᏗ, Tsalagi Gawonihisdi
  • Corso También llamado corsu, lingua corsa.
  • Galés También conocido como Cymraeg.
  • Alfabeto cirílico También conocido como escritura cirílica.
  • Danés También llamado dansk
  • DanishFraktur También conocido como dansk
  • Alemán También conocido como Deutsch
  • GermanFraktur También conocido como Deutsch.
  • Alfabeto Devanagari También conocido como Nagair,देवनागरी
  • Divehi También conocido como ދިވެހި
  • Dzongkha También conocido como རྫོང་ཁ
  • Griego También conocido como ελληνικά
  • Inglés
  • MiddleEnglish También conocido como inglés (1100-1500 D.C.)
  • Esperanto
  • Estonio También conocido como eesti, eesti keel
  • Alfabeto etíope También conocido como Ge'ez,ግዕዝ, Gəʿəz
  • Vasco También llamado euskara, euskera.
  • Feroés También conocido como føroyskt
  • Persa También conocido como فارسی
  • Filipino También conocido como Lengua Nacional de Filipinas, Tagalo Estandarizado.
  • Finlandés También conocido como suomi, suomen kieli
  • Financieros También conocidos como Documentos Financieros, Numéricos y Técnicos.
  • Francés También llamado français, langue française.
  • Alfabeto Fraktur También llamado Fraktur genérico, Mano caligráfica del alfabeto latino.
  • Franco También conocido como Frenkisk, antiguo franco.
  • MiddleFrench También conocido como Moyen Français,Francés Medio (ca. 1400-1600 D.C.)
  • WesternFrisian También conocido como Frysk
  • Alfabeto georgiano También conocido como ქართული
  • Gaélico escocés También conocido como Gàidhlig.
  • Irlandés También conocido como Gaeilge
  • Gallego También conocido como galego
  • AncientGreek También conocido como Ἑλληνική
  • Alfabeto griego También conocido como ελληνικά
  • Gujarati También conocido como ગુજરાતી
  • Alfabeto Gujarati También conocido como ગુજરાતી
  • Alfabeto Gurmukhi También conocido como Gurmukhī, ਗੁਰਮੁਖੀ, Shahmukhi, گُرمُکھی, Sihk Script.
  • Alfabeto Hangul También conocido como alfabeto coreano,한글,Hangeul,조선글,hosŏn'gŭl
  • Alfabeto vertical Hangul También conocido como alfabeto coreano,한글,Hangeul,조선글,hosŏn'gŭl
  • HanSimplifiedAlphabet También conocido como Samhan ,한어, 韓語
  • HanSimplifiedVerticalAlphabet También conocido como Samhan ,한어, 韓語
  • Alfabeto Tradicional Han También conocido como Samhan ,한어, 韓語
  • HanTraditionalVerticalAlphabet También conocido como Samhan ,한어, 韓語
  • Haitiano También llamado Kreyòl ayisyen.
  • Hebreo También conocido como עברית
  • Alfabeto hebreo También conocido como עברית
  • Hindi También conocido como हिन्दी, हिंदी
  • Croata También conocido como hrvatski jezik
  • Húngaro También conocido como magyar
  • Armenio También conocido como Հայերեն
  • Inuktitut También conocido como ᐃᓄᒃᑎᑐᑦ
  • Indonesio También conocido como Bahasa Indonesia
  • Islandés También conocido como Íslenska.
  • Italiano _También llamado italiano
  • ItalianoAntiguo _También llamado italiano
  • Alfabeto japonés También conocido como 日本語 (にほんご)
  • Alfabeto vertical japonés También conocido como 日本語 (にほんご)
  • Javanés También conocido como basa Jawa
  • Japonés También conocido como 日本語 (にほんご)
  • JapaneseVertical También conocido como 日本語 (にほんご)
  • Kannada También conocido como ಕನ್ನಡ
  • Alfabeto Kannada También conocido como ಕನ್ನಡ
  • Georgiano También conocido como ქართული
  • GeorgianOld También conocido como ქართული
  • Kazajo También conocido como қазақ тілі
  • Jemer También conocido como ខ្មែរ, ខេមរភាសា, ភាសាខ្មែរ
  • Alfabeto Jemer También conocido como ខ្មែរ, ខេមរភាសា, ភាសាខ្មែរ
  • Kirguís También conocido como Кыргызча, Кыргыз тили
  • Kurdo septentrional También llamado kurmanji, کورمانجی ,Kurmancî
  • Coreano También conocido como 한국어 (韓國語), 조선어 (朝鮮語)
  • KoreanVertical También conocido como 한국어 (韓國語), 조선어 (朝鮮語)
  • Lao También conocido como ພາສາລາວ
  • Alfabeto Lao También conocido como ພາສາລາວ
  • Latín También llamado latine, lingua latina.
  • Alfabeto latino También llamado latín, lingua latina.
  • Letón También conocido como latviešu valoda
  • Lituano También conocido como lietuvių kalba
  • Luxemburgués También conocido como Lëtzebuergesch.
  • Malayalam También conocido como മലയാളം
  • Alfabeto Malayalam También conocido como മലയാളം
  • Marathi También conocido como मराठी
  • MICR También conocido como reconocimiento de caracteres de tinta magnética, codificación de cheques MICR.
  • Macedonio También conocido como македонски јазик
  • Maltés También conocido como Malti
  • Mongol También conocido como монгол
  • Maorí También conocido como te reo Māori
  • Malayo También conocido como bahasa Melayu, بهاس ملايو
  • Myanmar También conocido como birmano ,ဗမာစာ
  • Alfabeto Myanmar También conocido como birmano ,ဗမာစာ
  • Nepalí También conocido como नेपाली
  • Neerlandés También llamado Nederlands, Vlaams.
  • Noruego También conocido como Norsk
  • Occitano También conocido como occitan, lenga d'òc
  • Oriya También conocido como ଓଡ଼ିଆ
  • Alfabeto Oriya También conocido como ଓଡ଼ିଆ
  • Panjabi También conocido como ਪੰਜਾਬੀ, پنجابی
  • Polaco También conocido como język polski, polszczyzna
  • Portugués También conocido como português.
  • Pashto También conocido como پښتو
  • Quechua También conocido como Runa Simi, Kichwa.
  • Rumano También conocido como limba română
  • Ruso También conocido como русский язык
  • Sánscrito También conocido como संस्कृतम्
  • Cingalés También conocido como සිංහල
  • Alfabeto Cingalés También conocido como සිංහල
  • Eslovaco También llamado slovenčina, slovenský jazyk.
  • SlovakFraktur También conocido como slovenčina, slovenský jazyk
  • Esloveno También conocido como slovenski jezik, slovenščina
  • Sindhi También conocido como सिन्धी, سنڌي، سندھی
  • Español También conocido como español, castellano.
  • EspañolAntiguo También conocido como español, castellano.
  • Albanés También conocido como gjuha shqipe
  • Serbio También conocido como српски језик
  • SerbianLatin También conocido como српски језик
  • Sundanés También conocido como Basa Sunda
  • Swahili También conocido como Kiswahili
  • Sueco También conocido como Svenska
  • Siríaco También llamado sirio, arameo siríaco,ܠܫܢܐ ܣܘܪܝܝܐ, Leššānā Suryāyā
  • Alfabeto siríaco También conocido como sirio, arameo siríaco,ܠܫܢܐ ܣܘܪܝܝܐ, Leššānā Suryāyā
  • Tamil También conocido como தமிழ்
  • Alfabeto tamil También conocido como தமிழ்
  • Tártaro También conocido como татар теле, tatar tele
  • Telugu También conocido como తెలుగు
  • Alfabeto Telugu También conocido como తెలుగు
  • Tayiko También conocido como тоҷикӣ, toğikī, تاجیکی
  • Tagalo También conocido como Wikang Tagalog, ᜏᜒᜃᜅ᜔ ᜆᜄᜎᜓᜄ᜔
  • Tailandés También conocido como ไทย
  • Alfabeto Thaana También conocido como Taana , Tāna , ތާނަ
  • Alfabeto tailandés También conocido como ไทย
  • Alfabeto tibetano También conocido como tibetano estándar, tibetano, central ཡིག་
  • Tigriña También conocido como ትግርኛ
  • Tonga También conocido como faka Tonga
  • Turco También conocido como Türkçe
  • Uigur También conocido como Uyƣurqə, ئۇيغۇرچە
  • Ucraniano También conocido como українська мова
  • Urdu También conocido como اردو
  • Uzbeko También conocido como O'zbek, Ўзбек, أۇزبېك
  • UzbekoCirílico También conocido como O'zbek, Ўзбек, أۇزبېك
  • Vietnamita También conocido como Tiếng Việt
  • Alfabeto vietnamita También conocido como Tiếng Việt
  • Yiddish También conocido como ייִדיש
  • Yoruba También conocido como Yorùbá

Ejemplo: OCR en árabe (+ muchos más)

En el siguiente ejemplo, mostraremos cómo podemos escanear un documento árabe.

PM> Install-Package IronOcr.Languages.Arabic
C# OCR en árabe
:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-6.cs
//  PM> Instalar IronOcr.Languages.Arabic
using IronOcr;

IronTesseract ocr = new IronTesseract();
ocr.Language = OcrLanguage.Arabic;

using OcrInput input = new OcrInput();
input.LoadImageFrame("img/arabic.gif", 1);
//  añadir filtros de imagen si es necesario
//  En este caso, aunque la entrada sea de muy baja calidad
//  IronTesseract puede leer lo que Tesseract convencional no puede.

OcrResult result = ocr.Read(input);

//  La consola no puede imprimir árabe en Windows fácilmente.
//  En su lugar, guardemos en disco.
result.SaveAsTextFile("arabic.txt");
'  PM> Instalar IronOcr.Languages.Arabic
Imports IronOcr

Private ocr As New IronTesseract()
ocr.Language = OcrLanguage.Arabic

Using input As New OcrInput()
	input.LoadImageFrame("img/arabic.gif", 1)
	'  añadir filtros de imagen si es necesario
	'  En este caso, aunque la entrada sea de muy baja calidad
	'  IronTesseract puede leer lo que Tesseract convencional no puede.
	
	Dim result As OcrResult = ocr.Read(input)
	
	'  La consola no puede imprimir árabe en Windows fácilmente.
	'  En su lugar, guardemos en disco.
	result.SaveAsTextFile("arabic.txt")
End Using
VB   C#

Ejemplo: OCR en más de un idioma en el mismo documento.

En el siguiente ejemplo, mostraremos cómo escanear mediante OCR varios idiomas en el mismo documento.

En realidad, esto es muy habitual, ya que, por ejemplo, un documento chino puede contener palabras y Urls en inglés.

PM> Install-Package IronOcr.Languages.ChineseSimplified
:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-7.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;

//  Podemos añadir cualquier número de idiomas.
ocr.AddSecondaryLanguage(OcrLanguage.English);
//  Opcionalmente, añada archivos tesseract .traineddata personalizados especificando una ruta de archivo

using OcrInput input = new OcrInput();
input.LoadImage("img/MultiLanguage.jpeg");
OcrResult result = ocr.Read(input);
result.SaveAsTextFile("MultiLanguage.txt");
Imports IronOcr

Private ocr As New IronTesseract()
ocr.Language = OcrLanguage.ChineseSimplified

'  Podemos añadir cualquier número de idiomas.
ocr.AddSecondaryLanguage(OcrLanguage.English)
'  Opcionalmente, añada archivos tesseract .traineddata personalizados especificando una ruta de archivo

Using input As New OcrInput()
	input.LoadImage("img/MultiLanguage.jpeg")
	Dim result As OcrResult = ocr.Read(input)
	result.SaveAsTextFile("MultiLanguage.txt")
End Using
VB   C#

Documentos de varias páginas

IronOcr puede combinar múltiples páginas / imágenes en un único OcrResult. Esto resulta muy útil cuando un documento se ha elaborado a partir de varias imágenes. Veremos más adelante que esta característica especial de IronTesseract es extremadamente útil para producir archivos PDF y HTML con capacidad de búsqueda a partir de entradas OCR.

IronOcr permite "mezclar y combinar" imágenes, marcos TIFF y páginas PDF en una única entrada de OCR.

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-8.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();

using OcrInput input = new OcrInput();
input.LoadImage("image1.jpeg");
input.LoadImage("image2.png");
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames("image3.gif", pageindices);

OcrResult result = ocr.Read(input);

Console.WriteLine($"{result.Pages.Length} Pages"); //  3 páginas
Imports IronOcr

Private ocr As New IronTesseract()

Private OcrInput As using
input.LoadImage("image1.jpeg")
input.LoadImage("image2.png")
Dim pageindices = New Integer() { 1, 2 }
input.LoadImageFrames("image3.gif", pageindices)

Dim result As OcrResult = ocr.Read(input)

Console.WriteLine($"{result.Pages.Length} Pages") '  3 páginas
VB   C#

También podemos realizar fácilmente el reconocimiento óptico de caracteres de cada página de un TIFF.

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-9.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();

using OcrInput input = new OcrInput();
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames("MultiFrame.Tiff", pageindices);
OcrResult result = ocr.Read(input);

Console.WriteLine(result.Text);
Console.WriteLine($"{result.Pages.Length} Pages");
//  1 página por cada fotograma (página) del TIFF
Imports IronOcr

Private ocr As New IronTesseract()

Private OcrInput As using
Private pageindices = New Integer() { 1, 2 }
input.LoadImageFrames("MultiFrame.Tiff", pageindices)
Dim result As OcrResult = ocr.Read(input)

Console.WriteLine(result.Text)
Console.WriteLine($"{result.Pages.Length} Pages")
'  1 página por cada fotograma (página) del TIFF
VB   C#
:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-10.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();
using OcrInput input = new OcrInput();
input.LoadPdf("example.pdf", Password: "password");
//  También podemos seleccionar números de página específicos del PDF para el OCR

OcrResult result = ocr.Read(input);

Console.WriteLine(result.Text);
Console.WriteLine($"{result.Pages.Length} Pages");
//  1 página por cada página del PDF
Imports IronOcr

Private ocr As New IronTesseract()
Private OcrInput As using
input.LoadPdf("example.pdf", Password:= "password")
'  También podemos seleccionar números de página específicos del PDF para el OCR

Dim result As OcrResult = ocr.Read(input)

Console.WriteLine(result.Text)
Console.WriteLine($"{result.Pages.Length} Pages")
'  1 página por cada página del PDF
VB   C#

PDF con opción de búsqueda

La exportación de resultados de OCR como archivos PDF con capacidad de búsqueda en C# y VB.NET es una función muy popular de IronOCR. Esto puede ser de gran ayuda para la población de la base de datos, SEO y PDF usabilidad empresas y gobiernos.

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-11.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();

using OcrInput input = new OcrInput();
input.Title = "Quarterly Report";
input.LoadImage("image1.jpeg");
input.LoadImage("image2.png");
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames("image3.gif", pageindices);

OcrResult result = ocr.Read(input);
result.SaveAsSearchablePdf("searchable.pdf");
Imports IronOcr

Private ocr As New IronTesseract()

Private OcrInput As using
input.Title = "Quarterly Report"
input.LoadImage("image1.jpeg")
input.LoadImage("image2.png")
Dim pageindices = New Integer() { 1, 2 }
input.LoadImageFrames("image3.gif", pageindices)

Dim result As OcrResult = ocr.Read(input)
result.SaveAsSearchablePdf("searchable.pdf")
VB   C#

Otro truco de OCR consiste en convertir un documento PDF existente en un documento en el que se puedan realizar búsquedas.

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-12.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();

using OcrInput input = new OcrInput();
input.Title = "Pdf Metadata Name";
input.LoadPdf("example.pdf", Password: "password");
OcrResult result = ocr.Read(input);
result.SaveAsSearchablePdf("searchable.pdf");
Imports IronOcr

Private ocr As New IronTesseract()

Private OcrInput As using
input.Title = "Pdf Metadata Name"
input.LoadPdf("example.pdf", Password:= "password")
Dim result As OcrResult = ocr.Read(input)
result.SaveAsSearchablePdf("searchable.pdf")
VB   C#

Lo mismo se aplica a la conversión de documentos TIFF con 1 o más páginas a PDF con capacidad de búsqueda mediante IronTesseract.

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-13.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();
using OcrInput input = new OcrInput();
input.Title = "Pdf Title";
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames("example.tiff", pageindices);
OcrResult result = ocr.Read(input);
result.SaveAsSearchablePdf("searchable.pdf");
Imports IronOcr

Private ocr As New IronTesseract()
Private OcrInput As using
input.Title = "Pdf Title"
Dim pageindices = New Integer() { 1, 2 }
input.LoadImageFrames("example.tiff", pageindices)
Dim result As OcrResult = ocr.Read(input)
result.SaveAsSearchablePdf("searchable.pdf")
VB   C#

Exportar Hocr HTML

Del mismo modo, podemos exportar los documentos con los resultados del OCR a Hocr HTML. Se trata de un documento XML que puede ser analizado por un lector XML o marcado en HTML visualmente atractivo.

Esto permite cierto grado de conversión de PDF a HTML y de TIFF a HTML.

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-14.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();

using OcrInput input = new OcrInput();
input.Title = "Html Title";

//  Añada más contenido si es necesario...
input.LoadImage("image2.jpeg");
input.LoadPdf("example.pdf",Password: "password");
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames("example.tiff", pageindices);

OcrResult result = ocr.Read(input);
result.SaveAsHocrFile("hocr.html");
Imports IronOcr

Private ocr As New IronTesseract()

Private OcrInput As using
input.Title = "Html Title"

'  Añada más contenido si es necesario...
input.LoadImage("image2.jpeg")
input.LoadPdf("example.pdf",Password:= "password")
Dim pageindices = New Integer() { 1, 2 }
input.LoadImageFrames("example.tiff", pageindices)

Dim result As OcrResult = ocr.Read(input)
result.SaveAsHocrFile("hocr.html")
VB   C#

Lectura de códigos de barras en documentos OCR

IronOCR tiene una ventaja adicional única sobre el teseracto tradicional, ya que también lee códigos de barras y códigos QR;

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-15.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();

ocr.Configuration.ReadBarCodes = true;

using OcrInput input = new OcrInput();
input.LoadImage("img/Barcode.png");

OcrResult result = ocr.Read(input);

foreach (var barcode in result.Barcodes)
{
    Console.WriteLine(barcode.Value);
    //  propiedades de tipo y ubicación también expuestas
}
Imports IronOcr

Private ocr As New IronTesseract()

ocr.Configuration.ReadBarCodes = True

Using input As New OcrInput()
	input.LoadImage("img/Barcode.png")
	
	Dim result As OcrResult = ocr.Read(input)
	
	For Each barcode In result.Barcodes
		Console.WriteLine(barcode.Value)
		'  propiedades de tipo y ubicación también expuestas
	Next barcode
End Using
VB   C#

Una mirada detallada a los resultados del OCR de imagen a texto

Lo último que veremos en este tutorial es el objeto de resultados de OCR. Cuando leemos OCR, normalmente sólo queremos sacar el texto, pero IronOCR contiene en realidad una enorme cantidad de información que puede ser de utilidad para desarrolladores avanzados.

Dentro de un objeto de resultados de OCR, tenemos una colección de páginas que se pueden iterar. Dentro de cada página, podemos encontrar códigos de barras, gráficos de potencia, líneas de texto, palabras y caracteres.

De hecho, cada uno de estos objetos contiene: una ubicación; una coordenada X; una coordenada Y; una anchura y una altura; una imagen asociada que puede inspeccionarse; un nombre de fuente; el tamaño de letra; la dirección en la que se escribe el texto; la rotación del texto; y la confianza estadística que IronOCR tiene para esa palabra, línea o párrafo concretos.

En resumen, esto permite a los desarrolladores ser creativos y trabajar con los datos OCR de la forma que deseen para inspeccionar y exportar la información.

También podemos trabajar y exportar cualquier elemento del objeto .NET OCR Results como un párrafo, palabra o código de barras como una Imagen o BitMap.

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-16.cs
using IronOcr;
using IronSoftware.Drawing;

//  Podemos profundizar en los resultados del OCR como un modelo de objetos de Páginas, Códigos de barras, Párrafos, Líneas, Palabras y Caracteres.
//  Esto nos permite explorar, exportar y dibujar contenidos OCR utilizando otras APIs

IronTesseract ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true;

using OcrInput input = new OcrInput();
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames(@"img\Potter.tiff", pageindices);

OcrResult result = ocr.Read(input);

foreach (var page in result.Pages)
{
    //  Página objeto
    int pageNumber = page.PageNumber;
    string pageText = page.Text;
    int pageWordCount = page.WordCount;

    //  null si no establecemos Ocr.Configuration.ReadBarCodes = true;
    OcrResult.Barcode[] barcodes = page.Barcodes;

    AnyBitmap pageImage = page.ToBitmap(input);
    System.Drawing.Bitmap pageImageLegacy = page.ToBitmap(input);
    int pageWidth = page.Width;
    int pageHeight = page.Height;

    foreach (var paragraph in page.Paragraphs)
    {
        //  Páginas -> Párrafos
        int paragraphNumber = paragraph.ParagraphNumber;
        String paragraphText = paragraph.Text;
        System.Drawing.Bitmap paragraphImage = paragraph.ToBitmap(input);
        int paragraphXLocation = paragraph.X;
        int paragraphYLocation = paragraph.Y;
        int paragraphWidth = paragraph.Width;
        int paragraphHeight = paragraph.Height;
        double paragraphOcrAccuracy = paragraph.Confidence;
        var paragraphTextDirection = paragraph.TextDirection;

        foreach (var line in paragraph.Lines)
        {
            //  Páginas -> Párrafos -> Líneas
            int lineNumber = line.LineNumber;
            String lineText = line.Text;
            AnyBitmap lineImage = line.ToBitmap(input);
            System.Drawing.Bitmap lineImageLegacy = line.ToBitmap(input);
            int lineXLocation = line.X;
            int lineYLocation = line.Y;
            int lineWidth = line.Width;
            int lineHeight = line.Height;
            double lineOcrAccuracy = line.Confidence;
            double lineSkew = line.BaselineAngle;
            double lineOffset = line.BaselineOffset;

            foreach (var word in line.Words)
            {
                //  Páginas -> Párrafos -> Líneas -> Palabras
                int wordNumber = word.WordNumber;
                String wordText = word.Text;
                AnyBitmap wordImage = word.ToBitmap(input);
                System.Drawing.Image wordImageLegacy = word.ToBitmap(input);
                int wordXLocation = word.X;
                int wordYLocation = word.Y;
                int wordWidth = word.Width;
                int wordHeight = word.Height;
                double wordOcrAccuracy = word.Confidence;

                if (word.Font != null)
                {
                    //  Word.Font sólo se establece cuando se utilizan los modos del motor Tesseract en lugar de LTSM.
                    String fontName = word.Font.FontName;
                    double fontSize = word.Font.FontSize;
                    bool isBold = word.Font.IsBold;
                    bool isFixedWidth = word.Font.IsFixedWidth;
                    bool isItalic = word.Font.IsItalic;
                    bool isSerif = word.Font.IsSerif;
                    bool isUnderlined = word.Font.IsUnderlined;
                    bool fontIsCaligraphic = word.Font.IsCaligraphic;
                }

                foreach (var character in word.Characters)
                {
                    //  Páginas -> Párrafos -> Líneas -> Palabras -> Caracteres
                    int characterNumber = character.CharacterNumber;
                    String characterText = character.Text;
                    AnyBitmap characterImage = character.ToBitmap(input);
                    System.Drawing.Bitmap characterImageLegacy = character.ToBitmap(input);
                    int characterXLocation = character.X;
                    int characterYLocation = character.Y;
                    int characterWidth = character.Width;
                    int characterHeight = character.Height;
                    double characterOcrAccuracy = character.Confidence;

                    //  Salida de opciones de símbolos alternativos y su probabilidad.
                    //  Muy útil para la corrección ortográfica
                    OcrResult.Choice[] characterChoices = character.Choices;
                }
            }
        }
    }
}
Imports IronOcr
Imports IronSoftware.Drawing

'  Podemos profundizar en los resultados del OCR como un modelo de objetos de Páginas, Códigos de barras, Párrafos, Líneas, Palabras y Caracteres.
'  Esto nos permite explorar, exportar y dibujar contenidos OCR utilizando otras APIs

Private ocr As New IronTesseract()
ocr.Configuration.ReadBarCodes = True

Using input As New OcrInput()
	Dim pageindices = New Integer() { 1, 2 }
	input.LoadImageFrames("img\Potter.tiff", pageindices)
	
	Dim result As OcrResult = ocr.Read(input)
	
	For Each page In result.Pages
		'  Página objeto
		Dim pageNumber As Integer = page.PageNumber
		Dim pageText As String = page.Text
		Dim pageWordCount As Integer = page.WordCount
	
		'  null si no establecemos Ocr.Configuration.ReadBarCodes = true;
		Dim barcodes() As OcrResult.Barcode = page.Barcodes
	
		Dim pageImage As AnyBitmap = page.ToBitmap(input)
		Dim pageImageLegacy As System.Drawing.Bitmap = page.ToBitmap(input)
		Dim pageWidth As Integer = page.Width
		Dim pageHeight As Integer = page.Height
	
		For Each paragraph In page.Paragraphs
			'  Páginas -> Párrafos
			Dim paragraphNumber As Integer = paragraph.ParagraphNumber
			Dim paragraphText As String = paragraph.Text
			Dim paragraphImage As System.Drawing.Bitmap = paragraph.ToBitmap(input)
			Dim paragraphXLocation As Integer = paragraph.X
			Dim paragraphYLocation As Integer = paragraph.Y
			Dim paragraphWidth As Integer = paragraph.Width
			Dim paragraphHeight As Integer = paragraph.Height
			Dim paragraphOcrAccuracy As Double = paragraph.Confidence
			Dim paragraphTextDirection = paragraph.TextDirection
	
			For Each line In paragraph.Lines
				'  Páginas -> Párrafos -> Líneas
				Dim lineNumber As Integer = line.LineNumber
				Dim lineText As String = line.Text
				Dim lineImage As AnyBitmap = line.ToBitmap(input)
				Dim lineImageLegacy As System.Drawing.Bitmap = line.ToBitmap(input)
				Dim lineXLocation As Integer = line.X
				Dim lineYLocation As Integer = line.Y
				Dim lineWidth As Integer = line.Width
				Dim lineHeight As Integer = line.Height
				Dim lineOcrAccuracy As Double = line.Confidence
				Dim lineSkew As Double = line.BaselineAngle
				Dim lineOffset As Double = line.BaselineOffset
	
				For Each word In line.Words
					'  Páginas -> Párrafos -> Líneas -> Palabras
					Dim wordNumber As Integer = word.WordNumber
					Dim wordText As String = word.Text
					Dim wordImage As AnyBitmap = word.ToBitmap(input)
					Dim wordImageLegacy As System.Drawing.Image = word.ToBitmap(input)
					Dim wordXLocation As Integer = word.X
					Dim wordYLocation As Integer = word.Y
					Dim wordWidth As Integer = word.Width
					Dim wordHeight As Integer = word.Height
					Dim wordOcrAccuracy As Double = word.Confidence
	
					If word.Font IsNot Nothing Then
						'  Word.Font sólo se establece cuando se utilizan los modos del motor Tesseract en lugar de LTSM.
						Dim fontName As String = word.Font.FontName
						Dim fontSize As Double = word.Font.FontSize
						Dim isBold As Boolean = word.Font.IsBold
						Dim isFixedWidth As Boolean = word.Font.IsFixedWidth
						Dim isItalic As Boolean = word.Font.IsItalic
						Dim isSerif As Boolean = word.Font.IsSerif
						Dim isUnderlined As Boolean = word.Font.IsUnderlined
						Dim fontIsCaligraphic As Boolean = word.Font.IsCaligraphic
					End If
	
					For Each character In word.Characters
						'  Páginas -> Párrafos -> Líneas -> Palabras -> Caracteres
						Dim characterNumber As Integer = character.CharacterNumber
						Dim characterText As String = character.Text
						Dim characterImage As AnyBitmap = character.ToBitmap(input)
						Dim characterImageLegacy As System.Drawing.Bitmap = character.ToBitmap(input)
						Dim characterXLocation As Integer = character.X
						Dim characterYLocation As Integer = character.Y
						Dim characterWidth As Integer = character.Width
						Dim characterHeight As Integer = character.Height
						Dim characterOcrAccuracy As Double = character.Confidence
	
						'  Salida de opciones de símbolos alternativos y su probabilidad.
						'  Muy útil para la corrección ortográfica
						Dim characterChoices() As OcrResult.Choice = character.Choices
					Next character
				Next word
			Next line
		Next paragraph
	Next page
End Using
VB   C#

Resumen

IronOCR proporciona a los desarrolladores de C# los más avanzados API de Tesseract que conocemos en ninguna plataforma.

IronOCR puede desplegarse en Windows, Linux, Mac, Azure, AWS, Lambda y es compatible con proyectos .NET Framework así como .NET Standard y .NET Core.

Podemos ver que si introducimos un documento imperfecto en IronOCR, éste puede leer su contenido con una precisión estadística de alrededor del 99%, aunque el documento esté mal formateado, sesgado y tenga ruido digital.

También podemos leer códigos de barras en escaneados OCR, e incluso exportar nuestro OCR como HTML y PDF con capacidad de búsqueda.

Esto es exclusivo de IronOCR y es una característica que no encontrará en las bibliotecas OCR estándar o en Tesseract.

Avanzar

Para seguir aprendiendo más sobre IronOCR, le recomendamos que:

Descarga del código fuente