Leer texto de imágenes con C# OCR
En este tutorial, aprenderemos a convertir imágenes en texto en C# y otros lenguajes .NET.
Cómo convertir imágenes en texto en C#
- Descargar la biblioteca IronOCR de reconocimiento óptico de caracteres de imagen a texto
- Ajustar las regiones de recorte para leer partes de una imagen
- Utiliza hasta 125 idiomas internacionales mediante paquetes de idiomas
- Exportar resultados de escaneado OCR como texto o PDF con función de búsqueda
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.
Comience a usar IronOCR en su proyecto hoy con una prueba gratuita.
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)
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.
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)
Podemos utilizarlo incluso en un escaneado de calidad media con una precisión del 100%.
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 inclusoextraer texto de documentos PDF automáticamente.
Ejemplo: Una exploración de baja calidad
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(); // removes rotation and perspective
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() ' removes rotation and perspective
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
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();
// Configure for speed
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()
' Configure for speed
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
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.
: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();
// a 41% improvement on speed
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
' a 41% improvement on speed
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)
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 delPá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
:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-6.cs
// PM> Install IronOcr.Languages.Arabic
using IronOcr;
IronTesseract ocr = new IronTesseract();
ocr.Language = OcrLanguage.Arabic;
using OcrInput input = new OcrInput();
input.LoadImageFrame("img/arabic.gif", 1);
// add image filters if needed
// In this case, even thought input is very low quality
// IronTesseract can read what conventional Tesseract cannot.
OcrResult result = ocr.Read(input);
// Console can't print Arabic on Windows easily.
// Let's save to disk instead.
result.SaveAsTextFile("arabic.txt");
' PM> Install 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)
' add image filters if needed
' In this case, even thought input is very low quality
' IronTesseract can read what conventional Tesseract cannot.
Dim result As OcrResult = ocr.Read(input)
' Console can't print Arabic on Windows easily.
' Let's save to disk instead.
result.SaveAsTextFile("arabic.txt")
End Using
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;
// We can add any number of languages.
ocr.AddSecondaryLanguage(OcrLanguage.English);
// Optionally add custom tesseract .traineddata files by specifying a file path
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
' We can add any number of languages.
ocr.AddSecondaryLanguage(OcrLanguage.English)
' Optionally add custom tesseract .traineddata files by specifying a file path
Using input As New OcrInput()
input.LoadImage("img/MultiLanguage.jpeg")
Dim result As OcrResult = ocr.Read(input)
result.SaveAsTextFile("MultiLanguage.txt")
End Using
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 Pages
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 Pages
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 page for every frame (page) in the 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 page for every frame (page) in the TIFF
: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");
// We can also select specific PDF page numbers to OCR
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Console.WriteLine($"{result.Pages.Length} Pages");
// 1 page for every page of the PDF
Imports IronOcr
Private ocr As New IronTesseract()
Private OcrInput As using
input.LoadPdf("example.pdf", Password:= "password")
' We can also select specific PDF page numbers to OCR
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
Console.WriteLine($"{result.Pages.Length} Pages")
' 1 page for every page of the PDF
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")
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")
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")
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";
// Add more content as required...
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"
' Add more content as required...
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")
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);
// type and location properties also exposed
}
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)
' type and location properties also exposed
Next barcode
End Using
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;
// We can delve deep into OCR results as an object model of Pages, Barcodes, Paragraphs, Lines, Words and Characters
// This allows us to explore, export and draw OCR content using other 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)
{
// Page object
int pageNumber = page.PageNumber;
string pageText = page.Text;
int pageWordCount = page.WordCount;
// null if we don't set Ocr.Configuration.ReadBarCodes = true;
OcrResult.Barcode[] barcodes = page.Barcodes;
AnyBitmap pageImage = page.ToBitmap(input);
System.Drawing.Bitmap pageImageLegacy = page.ToBitmap(input);
double pageWidth = page.Width;
double pageHeight = page.Height;
foreach (var paragraph in page.Paragraphs)
{
// Pages -> Paragraphs
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)
{
// Pages -> Paragraphs -> Lines
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)
{
// Pages -> Paragraphs -> Lines -> Words
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 is only set when using Tesseract Engine Modes rather than 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)
{
// Pages -> Paragraphs -> Lines -> Words -> Characters
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;
// Output alternative symbols choices and their probability.
// Very useful for spell checking
OcrResult.Choice[] characterChoices = character.Choices;
}
}
}
}
}
Imports IronOcr
Imports IronSoftware.Drawing
' We can delve deep into OCR results as an object model of Pages, Barcodes, Paragraphs, Lines, Words and Characters
' This allows us to explore, export and draw OCR content using other 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
' Page object
Dim pageNumber As Integer = page.PageNumber
Dim pageText As String = page.Text
Dim pageWordCount As Integer = page.WordCount
' null if we don't set 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 Double = page.Width
Dim pageHeight As Double = page.Height
For Each paragraph In page.Paragraphs
' Pages -> Paragraphs
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
' Pages -> Paragraphs -> Lines
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
' Pages -> Paragraphs -> Lines -> Words
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 is only set when using Tesseract Engine Modes rather than 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
' Pages -> Paragraphs -> Lines -> Words -> Characters
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
' Output alternative symbols choices and their probability.
' Very useful for spell checking
Dim characterChoices() As OcrResult.Choice = character.Choices
Next character
Next word
Next line
Next paragraph
Next page
End Using
Resumen
IronOCR proporciona a los desarrolladores de C# los más avanzadosAPI 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:
- Empiece a utilizar nuestroInicio rápido de Tesseract OCR en C# guía.
- Explora laEjemplos de código C# y VB
- Lea en profundidadReferencia de la API al estilo MSDN.
Descarga del código fuente
También puede disfrutar de los otros tutoriales .NET OCR en esta sección.