Données OCR de mots et de caractères en C# (coordonnées, confiance, cadres de sélection)

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

Après avoir appliqué l'OCR à un document, le texte extrait seul ne suffit souvent pas. Pour localiser des valeurs spécifiques sur une page, exclure les détections de mauvaise qualité ou reconstituer l'ordre de lecture naturel sur des mises en page à plusieurs colonnes, vous avez besoin de coordonnées par mot, de numéros de page, d'indices de région et de scores de confiance.

Les collections Words et Characters sur AdvancedOcrResultBase exposent ces données. Tant ReadDocumentAdvanced() pour les documents tenant compte de la mise en page que ReadPhoto() pour les entrées de caméra renvoient la même granularité que celle disponible via la collection standard OcrResult.Words.

Ce guide présente cinq modèles courants : itération des données WORD, reconstruction de l'ordre de lecture, filtrage par niveau de confiance, traitement au niveau des caractères et recadrage de l'image source à partir d'un cadre de sélection.

Commencez un essai gratuit de 30 jours pour tester ces collections dans votre pipeline.

NuGet Installer avec NuGet

PM >  Install-Package IronOcr

Consultez IronOCR sur NuGet pour une installation rapide. Avec plus de 10 millions de téléchargements, il transforme le développement PDF avec C#. Vous pouvez également télécharger le DLL ou l'installateur Windows.

Guide de démarrage rapide : Lire des données de WORD et de caractères à partir d'un résultat OCR

Appelez ReadDocumentAdvanced (ou ReadPhoto) et itérez result.Words pour obtenir en quelques lignes chaque WORD reconnu avec ses coordonnées, son numéro de page et son score de confiance.

  1. Installez IronOCR avec le Gestionnaire de Packages NuGet

    PM > Install-Package IronOcr
  2. Copiez et exécutez cet extrait de code.

    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. Déployez pour tester sur votre environnement de production.

    Commencez à utiliser IronOCR dans votre projet dès aujourd'hui avec un essai gratuit

    arrow pointer


Comment itérer des mots avec des coordonnées et un niveau de confiance ?

La collection Words renvoie tous les mots détectés sur chaque page. Chaque entrée (un AdvancedWord ou AdvancedCharacter, tous deux héritant de AdvancedOcrElement) expose le texte, les coordonnées en pixels, les dimensions, la page à laquelle elle appartient, l'index de région identifiant le bloc de texte détecté qui la contient, ainsi qu'un score de confiance pour cette région.

: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

ConseilsPageNumber est basé sur 1 : la première page est 1, et non 0. Cela diffère de la plupart des collections .NET, qui utilisent un indexage à partir de zéro. RegionIndex suit la convention standard basée sur 0.

Pour transmettre des coordonnées aux API de dessin ou de recadrage, utilisez la propriété BoundingBox. Elle regroupe la position et la taille en un seul IronSoftware.Drawing.Rectangle.

Comment reconstituer l'ordre de lecture ?

Dans les mises en page à plusieurs colonnes, l'ordre d'itération de la collection Words ne correspond pas à l'ordre de lecture visuel sur la page. Les mots sont regroupés par région détectée, ce qui signifie que les colonnes et les cellules du tableau peuvent être renvoyées dans un ordre différent de celui d'origine.

Pour recréer un ordre naturel de haut en bas et de gauche à droite, triez d'abord la collection par coordonnée Y, puis par X au sein de chaque ligne. Une petite tolérance Y regroupe les WORDs situés sur la même ligne 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

Ajustez lineThreshold en fonction de votre document : une valeur de 10 à 15 pixels convient pour un texte standard de 12 points à 300 ppp. Les titres plus longs ou les saisies manuscrites nécessitent une plus grande tolérance. Ce modèle est particulièrement utile sur les pages à plusieurs colonnes et à l'intérieur des cellules de tableau, où le moteur détecte chaque colonne ou cellule comme une région distincte.

Comment filtrez-vous les mots à faible confiance ?

Pour exclure les détections de mauvaise qualité avant qu'elles n'atteignent votre base de données, votre index de recherche ou l'extraction en aval, filtrez la collecte par RegionConfidence. Le score varie de 0,0 à 1,0, les valeurs les plus élevées indiquant un niveau de confiance plus élevé dans le texte détecté.

: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

Pour les numérisations de qualité variable (impression nette dans certaines zones, sections dégradées ailleurs), cela empêche les résultats peu fiables d'atteindre les systèmes en aval. Pour augmenter les scores de confiance au niveau de la source, les filtres de prétraitement d'image (Deskew, DeNoise, Binarize) améliorent la qualité avant l'application du seuil.

Comment procédez-vous à l'itération au niveau des caractères ?

Pour les superpositions de vérification OCR, la comparaison au niveau des caractères par rapport à la vérité de référence ou l'analyse spatiale précise des champs de formulaire, utilisez la collection Characters. Elle reflète Words mais se résout en caractères individuels.

: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

Veuillez noterWords et Characters sont tous deux calculés de manière différée et mis en cache. Le premier accès déclenche le calcul ; les accès suivants renvoient le résultat mis en cache, de sorte qu'une deuxième itération ne coûte rien.

Comment recadrer l'image d'origine à l'aide d'un BoundingBox ?

Pour extraire la région visuelle d'un WORD à des fins de vérification, d'annotation ou de création de données d'entraînement étiquetées, transmettez la propriété BoundingBox à AnyBitmap.CropRegion(). Le cadre de sélection correspond directement à la position du WORD dans l'image source.

: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

Ce modèle s'adapte aux opérations en masse : itérer sur chaque WORD, recadrer chaque boîte et exporter un ensemble de données étiquetées pour l'entraînement de polices personnalisées ou des pipelines d'apprentissage automatique en aval. Les coordonnées correspondent à l'image post-traitement ; Si des filtres tels que EnhanceResolution ont modifié les dimensions, le cadre de sélection correspond à l'image traitée, et non à l'original sur le disque.

Prochaines étapes

Le pipeline avancé offre le même niveau de détail spatial que IronTesseract.Read(), avec en plus des fonctionnalités avancées de mise en page. Sujets connexes :

Commencez votre essai de 30 jours gratuit ou consultez les options de licence.

Questions Fréquemment Posées

Qu'est-ce que l'OCR avancé en C# ?

L'OCR avancé en C# désigne le processus d'utilisation de la reconnaissance optique de caractères pour extraire des données détaillées de mots et de caractères, y compris les coordonnées, les niveaux de confiance, et les boîtes de délimitation, en utilisant le pipeline avancé de IronOCR.

Comment puis-je accéder aux données de mots en utilisant IronOCR ?

Vous pouvez accéder aux données de mots dans IronOCR en itérant à travers la collection AdvancedWord, qui fournit des informations détaillées sur la position de chaque mot et le score de confiance dans le document scanné.

Quelle est l'importance des boîtes de délimitation dans l'OCR ?

Les boîtes de délimitation sont cruciales dans l'OCR car elles définissent l'emplacement exact et les dimensions des éléments de texte reconnus sur l'image scannée, permettant une extraction précise du texte et une manipulation de l'image.

Puis-je filtrer les résultats OCR par score de confiance ?

Oui, en utilisant IronOCR vous pouvez filtrer les résultats OCR par score de confiance pour s'assurer que seul le texte avec une haute précision de reconnaissance est pris en compte pour un traitement ultérieur.

Comment puis-je reconstruire l'ordre de lecture dans les résultats OCR ?

La reconstruction de l'ordre de lecture dans les résultats OCR est possible en analysant la séquence des objets AdvancedWord et AdvancedCharacter fournis par IronOCR, qui reflètent le flux de lecture naturel du document.

Est-il possible de recadrer les images source en utilisant IronOCR ?

IronOCR vous permet de recadrer les images source en se basant sur l'analyse des données textuelles, qui inclut les boîtes de délimitation et les coordonnées des mots et caractères reconnus.

Qu'est-ce que les collections AdvancedWord et AdvancedCharacter ?

Les collections AdvancedWord et AdvancedCharacter dans IronOCR sont des structures de données qui stockent des informations détaillées sur chaque mot et caractère reconnu, y compris leurs coordonnées, niveaux de confiance, et boîtes de délimitation.

Comment IronOCR gère-t-il la reconnaissance des caractères ?

IronOCR gère la reconnaissance des caractères en utilisant un pipeline avancé qui analyse les caractéristiques de chaque caractère, fournissant des données détaillées telles que sa position, sa taille, et sa confiance de reconnaissance.

Quel type de documents peut être traité avec IronOCR ?

IronOCR peut traiter une large gamme de types de documents, y compris les PDFs, les images scannées et les photos, en extrayant les données textuelles avec une grande précision et détail.

Y a-t-il un essai gratuit disponible pour IronOCR ?

Oui, Iron Software propose un essai gratuit d'IronOCR, permettant aux utilisateurs de tester ses fonctionnalités et capacités avant de prendre une décision d'achat.

Darrius Serrant
Ingénieur logiciel Full Stack (WebOps)

Darrius Serrant est titulaire d'un baccalauréat en informatique de l'université de Miami et travaille comme ingénieur marketing WebOps Full Stack chez Iron Software. Attiré par le codage dès son plus jeune âge, il a vu l'informatique comme à la fois mystérieuse et accessible, en faisant le ...

Lire la suite
Prêt à commencer?
Nuget Téléchargements 6,136,090 | Version : 2026.7 vient de sortir
Still Scrolling Icon

Vous faites encore défiler ?

Vous voulez une preuve rapidement ? PM > Install-Package IronOcr
lancez un échantillon regardez votre image se transformer en texte consultable.