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} | " +
        $"'{word.Text}' | " +
        $"Position: ({word.X}, {word.Y}) | " +
        $"Size: {word.Width}x{word.Height} | " +
        $"Confidence: {word.Confidence: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} | " &
            $"'{word.Text}' | " &
            $"Position: ({word.X}, {word.Y}) | " &
            $"Size: {word.Width}x{word.Height} | " &
            $"Confidence: {word.Confidence:P1}"
        )
    Next

    ' ToString() override for diagnostic logging
    Console.WriteLine(result.Words.First().ToString())
End Using
$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.Confidence >= threshold)
    .ToList();

var lowConfidenceWords = result.Words
    .Where(w => w.Confidence < 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.Confidence:P1}"
    );
}
Imports IronOcr
Imports System.Linq

Dim ocr = New IronTesseract()
Using input = 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.Confidence >= threshold) _
        .ToList()

    Dim lowConfidenceWords = result.Words _
        .Where(Function(w) w.Confidence < 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.Confidence: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.Clone(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.Clone(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 el OCR avanzado en C#?

El OCR avanzado en C# se refiere al proceso de utilizar el reconocimiento óptico de caracteres para extraer datos detallados de palabras y caracteres, incluyendo coordenadas, niveles de confianza y cuadros delimitadores, utilizando la canalización avanzada de IronOCR.

¿Cómo puedo acceder a los datos de palabras usando IronOCR?

Puede acceder a los datos de palabras en IronOCR iterando a través de la colección de AdvancedWord, que proporciona información detallada sobre la posición y la puntuación de confianza de cada palabra en el documento escaneado.

¿Cuál es la importancia de los cuadros delimitadores en OCR?

Los cuadros delimitadores son cruciales en OCR ya que definen la ubicación y dimensiones exactas de los elementos de texto reconocidos en la imagen escaneada, permitiendo una extracción precisa de texto y manipulación de imágenes.

¿Puedo filtrar los resultados de OCR por puntuación de confianza?

Sí, usando IronOCR, puede filtrar los resultados de OCR por puntuación de confianza para asegurarse de que solo el texto con alta precisión de reconocimiento sea considerado para procesamiento posterior.

¿Cómo reconstruyo el orden de lectura en los resultados de OCR?

La reconstrucción del orden de lectura en los resultados de OCR es posible analizando la secuencia de objetos AdvancedWord y AdvancedCharacter proporcionados por IronOCR, que reflejan el flujo de lectura natural del documento.

¿Es posible recortar imágenes de origen usando IronOCR?

IronOCR le permite recortar imágenes de origen basándose en el análisis de datos de texto, que incluye los cuadros delimitadores y las coordenadas de las palabras y caracteres reconocidos.

¿Qué son las colecciones de AdvancedWord y AdvancedCharacter?

Las colecciones AdvancedWord y AdvancedCharacter en IronOCR son estructuras de datos que almacenan información detallada sobre cada palabra y carácter reconocidos, incluyendo sus coordenadas, niveles de confianza y cuadros delimitadores.

¿Cómo maneja IronOCR el reconocimiento de caracteres?

IronOCR maneja el reconocimiento de caracteres utilizando una canalización avanzada que analiza las características de cada carácter, proporcionando datos detallados como su posición, tamaño y confianza de reconocimiento.

¿Qué tipo de documentos pueden ser procesados con IronOCR?

IronOCR puede procesar una amplia gama de tipos de documentos incluyendo PDFs, imágenes escaneadas y fotos, extrayendo datos de texto con alta precisión y detalle.

¿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 6,136,090 | Versión: 2026.7 recién lanzado
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.