Datos de OCR de palabras y caracteres en C# (coordenadas, confianza, cuadros delimitadores)

This article was translated from English: Does it need improvement?
Translated
View the article in English

Tras aplicar el OCR a un documento, el texto extraído por sí solo no suele ser suficiente. Para localizar valores específicos en una página, excluir detecciones de baja calidad o reconstruir el orden de lectura natural en diseños de varias columnas, se necesitan coordenadas por WORD, números de página, índices de región y puntuaciones de confianza.

Las colecciones Words y Characters en AdvancedOcrResultBase exponen estos datos. Tanto ReadDocumentAdvanced() para documentos con formato como ReadPhoto() para la entrada de la cámara devuelven la misma granularidad disponible a través de la colección estándar OcrResult.Words.

Esta guía repasa cinco patrones comunes: iterar datos de WORD, reconstruir el orden de lectura, filtrar por confianza, trabajar a nivel de caracteres y recortar la imagen de origen a partir de un cuadro delimitador.

Inicie una prueba gratuita de 30 días para probar estas colecciones en su flujo de trabajo.

NuGet Instalar con NuGet

PM >  Install-Package IronOcr

Echa un vistazo a IronOCR en NuGet para una instalación rápida. Con más de 10 millones de descargas, está transformando el desarrollo de PDF con C#. También puede descargar el DLL o el instalador de Windows.

Guía de inicio rápido: Leer datos de WORD y caracteres a partir de un resultado de OCR

Llama a ReadDocumentAdvanced (o ReadPhoto) y repite result.Words para obtener todas las palabras reconocidas con sus coordenadas, número de página y puntuación de confianza en unas pocas líneas.

  1. Instala IronOCR con el Administrador de Paquetes NuGet

    PM > Install-Package IronOcr
  2. Copie y ejecute este fragmento de código.

    var result = new IronTesseract().ReadDocumentAdvanced(new OcrInput("scan.png"));
    foreach (var word in result.Words)
        Console.WriteLine($"{word.Text} @ ({word.X},{word.Y}) conf:{word.RegionConfidence:P0}");
  3. Despliegue para probar en su entorno real

    Comienza a usar IronOCR en tu proyecto hoy mismo con una prueba gratuita

    arrow pointer


¿Cómo se repiten palabras con coordenadas y confianza?

La colección Words devuelve todas las palabras detectadas en todas las páginas. Cada entrada (un AdvancedWord o AdvancedCharacter, ambos heredados de AdvancedOcrElement) expone el texto, las coordenadas de píxeles, las dimensiones, la página a la que pertenece, el índice de región que identifica qué bloque de texto detectado lo contiene y una puntuación de confianza para esa región.

:path=/static-assets/ocr/content-code-examples/how-to/read-document-advanced-iterate-words.cs
using IronOcr;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("receipt.png");

var result = ocr.ReadDocumentAdvanced(input);

foreach (var word in result.Words)
{
    Console.WriteLine(
        $"Page {word.PageNumber} | " +
        $"Region {word.RegionIndex} | " +
        $"'{word.Text}' | " +
        $"Position: ({word.X}, {word.Y}) | " +
        $"Size: {word.Width}x{word.Height} | " +
        $"Confidence: {word.RegionConfidence:P1}"
    );
}

// ToString() override for diagnostic logging
Console.WriteLine(result.Words.First().ToString());
Imports IronOcr

Dim ocr As New IronTesseract()
Using input As New OcrInput()
    input.LoadImage("receipt.png")

    Dim result = ocr.ReadDocumentAdvanced(input)

    For Each word In result.Words
        Console.WriteLine(
            $"Page {word.PageNumber} | " &
            $"Region {word.RegionIndex} | " &
            $"'{word.Text}' | " &
            $"Position: ({word.X}, {word.Y}) | " &
            $"Size: {word.Width}x{word.Height} | " &
            $"Confidence: {word.RegionConfidence:P1}"
        )
    Next
End Using

' ToString() override for diagnostic logging
Console.WriteLine(result.Words.First().ToString())
$vbLabelText   $csharpLabel

ConsejosPageNumber se numera a partir del 1: la página uno es 1, no 0. Esto difiere de la mayoría de las colecciones .NET, que utilizan una indexación basada en cero. RegionIndex sigue la convención estándar basada en 0.

Para pasar coordenadas a las API de dibujo o recorte, utilice la propiedad BoundingBox. Agrupa la posición y el tamaño en un único IronSoftware.Drawing.Rectangle.

¿Cómo se reconstruye el orden de lectura?

En diseños de varias columnas, el orden de iteración de la colección Words no coincide con el orden de lectura visual en la página. Las palabras se agrupan por región detectada, por lo que las columnas y las celdas de la tabla pueden aparecer desordenadas.

Para reconstruir un orden natural de arriba abajo y de izquierda a derecha, ordena primero la colección por coordenada Y y, a continuación, por X dentro de cada línea. Una pequeña tolerancia en la Y agrupa las WORDS situadas en la misma línea de base.

:path=/static-assets/ocr/content-code-examples/how-to/read-document-advanced-reading-order.cs
using IronOcr;
using System.Linq;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("multi-column-doc.png");

var result = ocr.ReadDocumentAdvanced(input);

int targetPage = 1;
int lineThreshold = 10; // pixel tolerance for grouping same-line words

// Sort by line (Y), then left-to-right (X)
var pageWords = result.Words
    .Where(w => w.PageNumber == targetPage)
    .OrderBy(w => w.Y / lineThreshold)
    .ThenBy(w => w.X)
    .ToList();

foreach (var word in pageWords)
{
    Console.Write($"{word.Text} ");
}
Console.WriteLine();
Imports IronOcr
Imports System.Linq

Dim ocr As New IronTesseract()
Using input As New OcrInput()
    input.LoadImage("multi-column-doc.png")

    Dim result = ocr.ReadDocumentAdvanced(input)

    Dim targetPage As Integer = 1
    Dim lineThreshold As Integer = 10 ' pixel tolerance for grouping same-line words

    ' Sort by line (Y), then left-to-right (X)
    Dim pageWords = result.Words _
        .Where(Function(w) w.PageNumber = targetPage) _
        .OrderBy(Function(w) w.Y \ lineThreshold) _
        .ThenBy(Function(w) w.X) _
        .ToList()

    For Each word In pageWords
        Console.Write($"{word.Text} ")
    Next
    Console.WriteLine()
End Using
$vbLabelText   $csharpLabel

Ajusta lineThreshold para que se adapte a tu documento: entre 10 y 15 píxeles funciona para texto estándar de 12 pt a 300 ppp. Los títulos más largos o las entradas escritas a mano requieren una mayor flexibilidad. Este patrón resulta especialmente útil en páginas de varias columnas y dentro de las celdas de las tablas, donde el motor detecta cada columna o celda como una región independiente.

¿Cómo se filtran las palabras de baja confianza?

Para excluir las detecciones de baja calidad antes de que lleguen a su base de datos, índice de búsqueda o extracción posterior, filtre la colección por RegionConfidence. La puntuación oscila entre 0,0 y 1,0, y los valores más altos indican una mayor confianza en el texto detectado.

:path=/static-assets/ocr/content-code-examples/how-to/read-document-advanced-confidence-filter.cs
using IronOcr;
using System.Linq;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("noisy-scan.png");

var result = ocr.ReadDocumentAdvanced(input);

double threshold = 0.75;

var highConfidenceWords = result.Words
    .Where(w => w.RegionConfidence >= threshold)
    .ToList();

var lowConfidenceWords = result.Words
    .Where(w => w.RegionConfidence < threshold)
    .ToList();

Console.WriteLine($"Accepted: {highConfidenceWords.Count} words");
Console.WriteLine($"Rejected: {lowConfidenceWords.Count} words");

// Log rejected words for manual review
foreach (var word in lowConfidenceWords)
{
    Console.WriteLine(
        $"  LOW CONF: '{word.Text}' at ({word.X},{word.Y}) — {word.RegionConfidence:P1}"
    );
}
Imports IronOcr
Imports System.Linq

Dim ocr As New IronTesseract()
Using input As New OcrInput()
    input.LoadImage("noisy-scan.png")

    Dim result = ocr.ReadDocumentAdvanced(input)

    Dim threshold As Double = 0.75

    Dim highConfidenceWords = result.Words _
        .Where(Function(w) w.RegionConfidence >= threshold) _
        .ToList()

    Dim lowConfidenceWords = result.Words _
        .Where(Function(w) w.RegionConfidence < threshold) _
        .ToList()

    Console.WriteLine($"Accepted: {highConfidenceWords.Count} words")
    Console.WriteLine($"Rejected: {lowConfidenceWords.Count} words")

    ' Log rejected words for manual review
    For Each word In lowConfidenceWords
        Console.WriteLine(
            $"  LOW CONF: '{word.Text}' at ({word.X},{word.Y}) — {word.RegionConfidence:P1}"
        )
    Next
End Using
$vbLabelText   $csharpLabel

En el caso de escaneos de calidad variable (impresión nítida en algunas zonas y secciones degradadas en otras), esto evita que los resultados de baja fiabilidad lleguen a los sistemas posteriores. Para aumentar los índices de confianza en el texto original, los filtros de preprocesamiento de imágenes (Deskew, DeNoise, Binarize) mejoran la calidad antes de aplicar el umbral.

¿Cómo se realiza la iteración a nivel de caracteres?

Para superposiciones de verificación OCR, comparaciones a nivel de caracteres con respecto a la verdad de referencia o análisis espaciales precisos en campos de formulario, utilice la colección Characters. Es un reflejo de Words, pero se resuelve en caracteres individuales.

:path=/static-assets/ocr/content-code-examples/how-to/read-document-advanced-characters.cs
using IronOcr;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("form-field.png");

var result = ocr.ReadDocumentAdvanced(input);

foreach (var ch in result.Characters)
{
    Console.WriteLine(
        $"'{ch.Text}' | " +
        $"Box: ({ch.X}, {ch.Y}, {ch.Width}, {ch.Height}) | " +
        $"Page {ch.PageNumber}"
    );
}

// ToString() override provides diagnostic-friendly output
Console.WriteLine(result.Characters.First().ToString());
Imports IronOcr

Dim ocr = New IronTesseract()
Using input = New OcrInput()
    input.LoadImage("form-field.png")

    Dim result = ocr.ReadDocumentAdvanced(input)

    For Each ch In result.Characters
        Console.WriteLine($"'{ch.Text}' | Box: ({ch.X}, {ch.Y}, {ch.Width}, {ch.Height}) | Page {ch.PageNumber}")
    Next

    ' ToString() override provides diagnostic-friendly output
    Console.WriteLine(result.Characters.First().ToString())
End Using
$vbLabelText   $csharpLabel

Por favor notaTanto Words como Characters se calculan de forma diferida y se almacenan en caché. El primer acceso activa el cálculo; Los accesos posteriores devuelven el resultado almacenado en caché, por lo que repetir la operación por segunda vez no supone ningún coste.

¿Cómo se recorta la imagen original utilizando un BoundingBox?

Para extraer la región visual de una WORD con fines de verificación, anotación o creación de datos de entrenamiento etiquetados, pase la propiedad BoundingBox a AnyBitmap.CropRegion(). El cuadro delimitador se corresponde directamente con la posición de la palabra en la imagen original.

:path=/static-assets/ocr/content-code-examples/how-to/read-document-advanced-crop-boundingbox.cs
using IronOcr;
using IronSoftware.Drawing;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("invoice.png");

var result = ocr.ReadDocumentAdvanced(input);

// Load the original image for cropping
var originalImage = AnyBitmap.FromFile("invoice.png");

// Find a specific word and crop its region
var targetWord = result.Words.FirstOrDefault(w => w.Text == "Total");
if (targetWord != null)
{
    Rectangle cropRect = targetWord.BoundingBox;
    AnyBitmap croppedRegion = originalImage.CropRegion(cropRect);
    croppedRegion.SaveAs("total-region.png");

    Console.WriteLine(
        $"Cropped '{targetWord.Text}' from " +
        $"({cropRect.X}, {cropRect.Y}, {cropRect.Width}, {cropRect.Height})"
    );
}
Imports IronOcr
Imports IronSoftware.Drawing

Dim ocr As New IronTesseract()
Using input As New OcrInput()
    input.LoadImage("invoice.png")

    Dim result = ocr.ReadDocumentAdvanced(input)

    ' Load the original image for cropping
    Dim originalImage = AnyBitmap.FromFile("invoice.png")

    ' Find a specific word and crop its region
    Dim targetWord = result.Words.FirstOrDefault(Function(w) w.Text = "Total")
    If targetWord IsNot Nothing Then
        Dim cropRect As Rectangle = targetWord.BoundingBox
        Dim croppedRegion As AnyBitmap = originalImage.CropRegion(cropRect)
        croppedRegion.SaveAs("total-region.png")

        Console.WriteLine(
            $"Cropped '{targetWord.Text}' from " &
            $"({cropRect.X}, {cropRect.Y}, {cropRect.Width}, {cropRect.Height})"
        )
    End If
End Using
$vbLabelText   $csharpLabel

Este patrón se adapta a operaciones masivas: iterar cada WORD, recortar cada cuadro y exportar un conjunto de datos etiquetado para el entrenamiento de fuentes personalizadas o para procesos de aprendizaje automático posteriores. Las coordenadas reflejan la imagen tras el preprocesamiento; Si filtros como EnhanceResolution cambian las dimensiones, el cuadro delimitador se ajusta a la imagen procesada, no a la original en el disco.

Próximos pasos

El proceso avanzado proporciona el mismo nivel de detalle espacial que IronTesseract.Read(), con inteligencia de diseño adicional. Temas relacionados:

Comienza tu prueba gratuita de 30 días o consulta las opciones de licencia.

Preguntas Frecuentes

¿Qué es OCR y por qué es importante?

OCR, o Reconocimiento Óptico de Caracteres, es una tecnología que convierte diferentes tipos de documentos, como documentos en papel escaneados, PDFs o imágenes capturadas por una cámara digital, en datos editables y buscables. El OCR es importante porque automatiza la extracción de datos, reduce la entrada manual de datos y hace que la información sea fácilmente accesible y editable.

¿Cómo mejora IronOCR el proceso de OCR?

IronOCR mejora el proceso de OCR brindando capacidades de reconocimiento de texto precisas y de alta velocidad. Soporta múltiples idiomas e incluye características como preprocesamiento de imágenes para mejorar la precisión del reconocimiento de texto.

¿Puede IronOCR manejar documentos de varias páginas?

Sí, IronOCR puede procesar documentos de varias páginas de manera eficiente, extrayendo texto de cada página y permitiendo a los usuarios trabajar con todo el documento como una unidad cohesiva.

¿Qué formatos de archivo admite IronOCR?

IronOCR soporta una amplia gama de formatos de archivos incluyendo PDF, TIFF, JPEG, PNG, y BMP, permitiendo flexibilidad en los tipos de documentos que puede procesar.

¿Es IronOCR adecuado para reconocer texto en imágenes de baja calidad?

Sí, IronOCR incluye características avanzadas de preprocesamiento de imágenes que mejoran la calidad de imágenes de baja resolución o de mala calidad, aumentando la precisión del reconocimiento de texto.

¿IronOCR soporta múltiples idiomas?

IronOCR soporta múltiples idiomas, convirtiéndose en una herramienta versátil para aplicaciones globales que requieren reconocimiento de texto en diferentes idiomas.

¿Puede integrarse IronOCR en aplicaciones existentes?

IronOCR está diseñado para integrarse fácilmente en aplicaciones existentes usando C#, permitiendo a los desarrolladores agregar funcionalidad de OCR a su software con un esfuerzo mínimo.

¿Cuáles son los beneficios de usar IronOCR para la gestión de documentos?

Usar IronOCR para la gestión de documentos agiliza el flujo de trabajo al convertir documentos escaneados en texto buscable y editable, reduciendo la necesidad de entrada manual de datos y mejorando la accesibilidad del documento.

¿Cómo puede IronOCR mejorar la precisión de los datos?

IronOCR mejora la precisión de los datos a través de sus algoritmos de reconocimiento avanzados y características de corrección de imágenes, asegurando que el proceso de extracción de texto sea tanto confiable como preciso.

¿Hay una prueba gratuita disponible para IronOCR?

Sí, Iron Software ofrece una prueba gratuita de IronOCR, permitiendo a los usuarios probar sus características y capacidades antes de tomar una decisión de compra.

Darrius Serrant
Ingeniero de Software Full Stack (WebOps)

Darrius Serrant tiene una licenciatura en Ciencias de la Computación de la Universidad de Miami y trabaja como Ingeniero de Marketing WebOps Full Stack en Iron Software. Atraído por la programación desde joven, vio la computación como algo misterioso y accesible, convirtiéndolo en el ...

Leer más
¿Listo para empezar?
Nuget Descargas 5,887,215 | Versión: 2026.5 just released
Still Scrolling Icon

¿Aún desplazándote?

¿Quieres una prueba rápida? PM > Install-Package IronOcr
ejecuta una muestra y observa cómo tu imagen se convierte en texto buscable.