Datos de OCR de palabras y caracteres en C# (coordenadas, confianza, cuadros delimitadores)
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.
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.
-
Instala IronOCR con el Administrador de Paquetes NuGet
-
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}"); -
Despliegue para probar en su entorno real
Comienza a usar IronOCR en tu proyecto hoy mismo con una prueba gratuita
Flujo de trabajo mínimo (3 pasos)
- Descarga la biblioteca OCR para C# desde NuGet
- Ejecuta un OCR avanzado con
ReadDocumentAdvancedoReadPhotoen tu entrada - Iterar
result.Wordsoresult.Characterspara coordenadas, confianza y cuadros delimitadores
¿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
PageNumber 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
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
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
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
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:
- Guía de extracción de tablas: trata la propiedad
TablesenReadDocumentAdvancedpara datos de celdas estructurados. - Lectura de resultados de OCR: datos de palabras para el proceso estándar.
- Corrección de la calidad de la imagen: filtros de preprocesamiento que aumentan los índices de confianza.
- Tutorial de OCR: configuración completa para nuevos usuarios.
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.

