Cómo crear un servicio Azure OCR con IronOCR

Iron Software ha creado un OCR (Reconocimiento óptico de caracteres) que elimina los problemas de interoperabilidad de la integración de Azure OCR. Trabajar con bibliotecas OCR en Azure siempre ha sido un poco pesado para los desarrolladores. La solución para éste y muchos otros quebraderos de cabeza del OCR es IronOCR.

Funciones de IronOCR para Microsoft Azure

IronOCR incluye las siguientes características para crear un servicio OCR en Microsoft Azure:

  • Convierte los PDF en documentos en los que se pueden realizar búsquedas para extraer texto fácilmente
  • Convierte imágenes en documentos que permiten búsquedas extrayendo texto de las imágenes
  • Lee códigos de barras y códigos QR
  • Precisión excepcional
  • Se ejecuta localmente y no requiere SaaS (Software como servicio) que es un modelo de distribución de software en el que un proveedor de nube, como Microsoft Azure, aloja diversas aplicaciones y las pone a disposición de los usuarios finales.
  • Velocidad de vértigo

    Veamos cómo el mejor motor de OCR, IronOCR de Iron Software, facilita a los desarrolladores la extracción de texto de cualquier documento de entrada.

Empecemos con nuestro servicio Azure OCR

Para empezar con el ejemplo, primero tenemos que instalar IronOCR.

  1. Crear una nueva aplicación de consola con C#
  2. Instale IronOCR a través de NuGet, ya sea introduciendo: Install-Package IronOcr o seleccionando Manage NuGet packages y buscando IronOCR. Se muestra a continuación
  3. Edite su archivo Program.cs para que tenga el siguiente aspecto:
    • Importamos el espacio de nombres IronOcr para hacer uso de sus capacidades ocr para leer y extraer el contenido del archivo PDF.
    • Creamos un nuevo objeto IronTesseract, para poder extraer texto de una imagen.
using IronOcr;
using System;

namespace IronOCR_Ex
{
    class Program
    {
        static void Main(string [] args)
        {
            var ocr = new IronTesseract();
            using (var Input = new OcrInput("..\\Images\\Purgatory.PNG"))
            {
                var result = ocr.Read(Input); //Leer archivo de imagen PNG
                Console.WriteLine(result.Text); //Escribir salida en documento PDF
                Console.ReadLine();
            }
        }
    }
}
using IronOcr;
using System;

namespace IronOCR_Ex
{
    class Program
    {
        static void Main(string [] args)
        {
            var ocr = new IronTesseract();
            using (var Input = new OcrInput("..\\Images\\Purgatory.PNG"))
            {
                var result = ocr.Read(Input); //Leer archivo de imagen PNG
                Console.WriteLine(result.Text); //Escribir salida en documento PDF
                Console.ReadLine();
            }
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#
  1. A continuación, abrimos una imagen llamada Purgatorio.PNG. Esta imagen forma parte de la Comedia divina de Dante, uno de mis libros favoritos. La imagen se parece a la siguiente.

    El texto que se va a extraer con las capacidades de lectura óptica de caracteres de IronOCR.

    Figura 2 - El texto que debe extraerse con las capacidades de lectura óptica de caracteres de IronOCR.

  2. La salida después de que el texto anterior se ha extraído del texto de la imagen de entrada anterior.

    Texto extraído

    Figura 3 - Texto extraído

  3. Hagamos lo mismo con un documento PDF. El documento PDF contiene el mismo texto a extraer que la Figura.

    La única diferencia es que seremos un documento PDF en lugar de una imagen. Introduce el siguiente código:

 var Ocr = new IronTesseract();
            using (var input = new OcrInput())
            {
                input.Title = "Divine Comedy - Purgatory"; //Dar título al documento de entrada 
                //Contraseña opcional y nombre del documento
                input.AddPdf("..\\Documents\\Purgatorio.pdf", "dante");
                var Result = Ocr.Read(input); //Leer el archivo de entrada

                Result.SaveAsSearchablePdf("SearchablePDFDocument.pdf"); 
            }
 var Ocr = new IronTesseract();
            using (var input = new OcrInput())
            {
                input.Title = "Divine Comedy - Purgatory"; //Dar título al documento de entrada 
                //Contraseña opcional y nombre del documento
                input.AddPdf("..\\Documents\\Purgatorio.pdf", "dante");
                var Result = Ocr.Read(input); //Leer el archivo de entrada

                Result.SaveAsSearchablePdf("SearchablePDFDocument.pdf"); 
            }
Dim Ocr = New IronTesseract()
			Using input = New OcrInput()
				input.Title = "Divine Comedy - Purgatory" 'Dar título al documento de entrada
				'Contraseña opcional y nombre del documento
				input.AddPdf("..\Documents\Purgatorio.pdf", "dante")
				Dim Result = Ocr.Read(input) 'Leer el archivo de entrada

				Result.SaveAsSearchablePdf("SearchablePDFDocument.pdf")
			End Using
VB   C#

Casi igual que el código anterior que extrae texto de una imagen.

Aquí hacemos uso del método OcrInput para leer el documento PDF actual, en este caso: Purgatorio.pdf. Si hay metadatos en el archivo PDF, como un título o una contraseña, también podemos introducirlos.

El resultado se guarda como un documento PDF en el que podemos buscar texto.

Tenga en cuenta que si el archivo PDF es demasiado grande, puede producirse una excepción.

  1. Suficiente en aplicaciones Windows; veamos cómo podemos utilizar ocr con Microsoft Azure.

    Lo bueno de IronOCR es que funciona muy bien con Microsoft Azure como Azure Function en una arquitectura de microservicios. He aquí un ejemplo muy rápido de lo que sería una función de Microsoft Azure que trabaja con IronOCR. Esta función de Microsoft Azure extrae texto de imágenes.

public static class OCRFunction
{
    public static HttpClient hcClient = new HttpClient();

    [FunctionName("IronOCRFunction_EX")]
    public static async Task<IActionResult> Run([HttpTrigger] HttpRequest hrRequest, ExecutionContext ecContext)
    {
        var URI = hrRequest.Query ["image"];
        var saStream = await hcClient.GetStreamAsync(URI);

        var ocr = new IronTesseract();
        using (var inputOCR = new OcrInput(saStream))
        {
            var outputOCR = ocr.Read(inputOCR);
            return new OkObjectResult(outputOCR.Text);
        }
    }
} 
public static class OCRFunction
{
    public static HttpClient hcClient = new HttpClient();

    [FunctionName("IronOCRFunction_EX")]
    public static async Task<IActionResult> Run([HttpTrigger] HttpRequest hrRequest, ExecutionContext ecContext)
    {
        var URI = hrRequest.Query ["image"];
        var saStream = await hcClient.GetStreamAsync(URI);

        var ocr = new IronTesseract();
        using (var inputOCR = new OcrInput(saStream))
        {
            var outputOCR = ocr.Read(inputOCR);
            return new OkObjectResult(outputOCR.Text);
        }
    }
} 
Public Module OCRFunction
	Public hcClient As New HttpClient()

	<FunctionName("IronOCRFunction_EX")>
	Public Async Function Run(<HttpTrigger> ByVal hrRequest As HttpRequest, ByVal ecContext As ExecutionContext) As Task(Of IActionResult)
		Dim URI = hrRequest.Query ("image")
		Dim saStream = Await hcClient.GetStreamAsync(URI)

		Dim ocr = New IronTesseract()
		Using inputOCR = New OcrInput(saStream)
			Dim outputOCR = ocr.Read(inputOCR)
			Return New OkObjectResult(outputOCR.Text)
		End Using
	End Function
End Module
VB   C#

De este modo, la imagen recibida por la función se envía directamente al motor ocr para que la emita como texto extraído.

Un breve resumen sobre Microsoft Azure.

Según Microsoft: Microsoft Azure Microservices es un enfoque arquitectónico para construir aplicaciones donde cada función central, o servicio, se construye y despliega de forma independiente. La arquitectura de microservicios está distribuida y poco acoplada, por lo que el fallo de un componente no romperá toda la aplicación. Los componentes independientes trabajan juntos y se comunican con contratos de API bien definidos. Cree aplicaciones de microservicios para satisfacer las necesidades empresariales en rápida evolución y comercializar nuevas funcionalidades con mayor rapidez.

Algunas características más de IronOCR con .NET o Microsoft Azure son las siguientes:

La capacidad de realizar ocr en casi cualquier archivo, imagen o PDF.

  • Procesamiento ultrarrápido de entradas ocr
  • Precisión excepcional
  • Lee códigos de barras y códigos QR
  • Se ejecuta localmente, sin necesidad de SaaS
  • Puede convertir PDF e imágenes en documentos con capacidad de búsqueda
  • Excelente alternativa a Azure OCR de Microsoft Cognitive Services

Filtros de imagen para mejorar el rendimiento del OCR

  • OcrInput.Rotate - Rota las imágenes varios 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. Esto mejora el rendimiento del OCR.
  • OcrInput.ToGrayScale() - Este filtro de imagen convierte cada píxel en un tono de escala de grises. Esto mejora la velocidad de OCR
  • OcrInput.Contraste() - Aumenta el contraste automáticamente. Este filtro mejora la velocidad de ocr y la precisión en exploraciones de bajo contraste.
  • OcrInput.DeNoise() Elimina el ruido digital. Este filtro sólo debe utilizarse cuando se espera ruido en los documentos de entrada.
  • OcrInput.Invert() Invierte todos los colores.
  • OcrInput.Dilate() - La dilatación añade píxeles a los límites de cualquier objeto de una imagen.
  • OcrInput.Erode() - La erosión elimina los píxeles de los límites del objeto.
  • 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.
  • OcrInput.EnhanceResolution - Mejora la resolución de una imagen de baja calidad.

Velocidad

A continuación, un ejemplo:

    var Ocr = new IronTesseract();
    Ocr.Configuration.BlackListCharacters = "~`$#^*_}{][
\\";
    Ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.Auto;
    Ocr.Configuration.TesseractVersion = TesseractVersion.Tesseract5;
    Ocr.Configuration.EngineMode = TesseractEngineMode.LstmOnly;
    Ocr.Language = OcrLanguage.EnglishFast;
    using (var Input = new OcrInput("..\\Images\\Purgatory.PNG"))
    {
        var Result = Ocr.Read(Input);
        Console.WriteLine(Result.Text);
    }
    var Ocr = new IronTesseract();
    Ocr.Configuration.BlackListCharacters = "~`$#^*_}{][
\\";
    Ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.Auto;
    Ocr.Configuration.TesseractVersion = TesseractVersion.Tesseract5;
    Ocr.Configuration.EngineMode = TesseractEngineMode.LstmOnly;
    Ocr.Language = OcrLanguage.EnglishFast;
    using (var Input = new OcrInput("..\\Images\\Purgatory.PNG"))
    {
        var Result = Ocr.Read(Input);
        Console.WriteLine(Result.Text);
    }
Dim Ocr = New IronTesseract()
	Ocr.Configuration.BlackListCharacters = "~`$#^*_}{][ \\"
	Ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.Auto
	Ocr.Configuration.TesseractVersion = TesseractVersion.Tesseract5
	Ocr.Configuration.EngineMode = TesseractEngineMode.LstmOnly
	Ocr.Language = OcrLanguage.EnglishFast
	Using Input = New OcrInput("..\Images\Purgatory.PNG")
		Dim Result = Ocr.Read(Input)
		Console.WriteLine(Result.Text)
	End Using
VB   C#

Precios y licencias

Básicamente hay tres niveles de licencias de pago que funcionan según el principio de compra única y licencia vitalicia.

Y sí, son gratuitos para fines de desarrollo.

Para más información

Funciones de IronOCR para aplicaciones .NET que ejecutan OCR en Azure y otros sistemas

  • IronOCR admite 127 idiomas internacionales. Cada idioma está disponible en calidad Rápida, Estándar y Óptima. Algunos de los paquetes de idiomas disponibles son:
    • Búlgaro
    • Armenio
    • Croata
    • Afrikaans
    • Danés
    • Checa
    • Filipino
    • En finés
    • Francés
    • Alemán
    • Hay muchos más paquetes de idiomas disponibles, para echarles un vistazo, siga el siguiente enlace. Paquetes de idiomas IronOCR
  • Funciona directamente en .NET
    • Compatibilidad con Xamarin
    • Soporte para Mono
    • Compatibilidad con Microsoft Azure
    • Soporte para Docker en Microsoft Azure
    • Admite documentos PDF
    • Admite archivos Tiff Multiframe
    • Compatible con los principales formatos de imagen
  • Se admiten los siguientes marcos .NET:
    • .NET Framework 4.5 y superior
    • .NET Estándar 2
    • .NET Core 2
    • .NET Core 3
    • .NET Core 5
  • No tienes que tener Tesseract (motor ocr de código abierto compatible con Unicode y más de 100 idiomas) instalado para que IronOCR funcione.
    • Ha mejorado la precisión con respecto a Tesseract
    • Ha mejorado la velocidad con respecto a Tesseract
  • Corrige los escaneados de baja calidad de documentos o archivos
  • Corrige los escaneados sesgados de baja calidad de documentos o archivos

¿Qué es el reconocimiento óptico de caracteres (OCR)?

Según Wikipedia: El reconocimiento óptico de caracteres es la conversión electrónica o mecánica de imágenes de texto mecanografiado e impreso en texto codificado por máquina, ya sea a partir de un documento escaneado, de una foto de un documento, de una foto de escena o de un texto de subtítulos superpuesto a una imagen. Ocr son las siglas en inglés de Reconocimiento Óptico de Caracteres. Existen esencialmente cuatro tipos de reconocimiento óptico de caracteres, que son:

  • OCR - Reconocimiento óptico de caracteres, que se dirige al texto mecanografiado a partir de un documento de entrada, un carácter o glifo. (símbolo elemental dentro de un conjunto acordado de símbolos, por ejemplo "a" en distintos tipos de letra) a la vez.
  • OWR - Optical Word Recognition (Reconocimiento óptico de palabras), que se centra en el texto mecanografiado a partir de un documento de entrada, palabra por palabra.
  • ICR - Reconocimiento Inteligente de Caracteres, que se centra en texto impreso como la letra de imprenta. (caracteres sin unión con otras letras) y texto cursivo, carácter por carácter o glifo por glifo
  • IWR - Reconocimiento Inteligente de Palabras, que se centra en el texto cursivo.