Dane OCR dotyczące słów i znaków w języku C# (współrzędne, poziom pewności, prostokąty ograniczające)

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

Po uruchomieniu OCR na dokumencie sam wyodrębniony tekst często nie wystarcza. Aby zlokalizować konkretne wartości na stronie, wykluczyć wykrycia niskiej jakości lub odtworzyć naturalną kolejność czytania w układach wielokolumnowych, potrzebne są współrzędne poszczególnych słów, numery stron, indeksy regionów oraz wskaźniki pewności.

Kolekcje Words i Characters w AdvancedOcrResultBase udostępniają te dane. Zarówno ReadDocumentAdvanced() dla dokumentów z zachowaniem układu, jak i ReadPhoto() dla danych z kamery zwracają ten sam poziom szczegółowości, jaki jest dostępny w standardowej kolekcji OcrResult.Words.

W niniejszym przewodniku omówiono pięć typowych wzorców: iterowanie danych WORD, rekonstrukcja kolejności czytania, filtrowanie według pewności, praca na poziomie znaków oraz przycinanie obrazu źródłowego z ramki ograniczającej.

Rozpocznij bezpłatny 30-dniowy okres probny, aby przetestować te kolekcje w swoim procesie.

NuGet Zainstaluj za pomocą NuGet

PM >  Install-Package IronOcr

Sprawdź IronOCR na NuGet dla szybkiej instalacji. Z ponad 10 milionami pobrań, przekształca rozwój PDF z C#. Możesz również pobrać DLL lub instalator Windows.

Szybki start: Odczyt danych WORD i znakowych z wyników OCR

Wywołaj ReadDocumentAdvanced (lub ReadPhoto) i powtórz result.Words, aby w kilku wierszach uzyskać wszystkie rozpoznane słowa wraz z ich współrzędnymi, numerem strony i wynikiem pewności.

  1. Install IronOCR with NuGet Package Manager

    PM > Install-Package IronOcr
  2. Skopiuj i uruchom ten fragment kodu.

    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. Wdrożenie do testowania w środowisku produkcyjnym

    Rozpocznij używanie IronOCR w swoim projekcie już dziś z darmową wersją próbną

    arrow pointer


Jak powtarzać słowa z uwzględnieniem współrzędnych i pewności?

Kolekcja Words zwraca każde wykryte słowo na każdej stronie. Każdy wpis (AdvancedWord lub AdvancedCharacter, oba dziedziczące po AdvancedOcrElement) zawiera tekst, współrzędne pikseli, wymiary, stronę, do której należy, indeks regionu identyfikujący wykryty blok tekstu, w którym się znajduje, oraz wynik pewności dla tego regionu.

: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

PoradyPageNumber jest oparty na 1: strona pierwsza to 1, a nie 0. Różni się to od większości kolekcji .NET, które stosują indeksowanie od zera. RegionIndex jest zgodny ze standardową konwencją numeracji od 0.

Aby przekazać współrzędne do interfejsów API rysowania lub przycinania, należy użyć właściwości BoundingBox. Łączy pozycję i rozmiar w jeden IronSoftware.Drawing.Rectangle.

Jak odtworzyć kolejność czytania?

W układach wielokolumnowych kolejność iteracji kolekcji Words nie odpowiada wizualnej kolejności czytania na stronie. WORDy są pogrupowane według wykrytego regionu, więc kolumny i komórki tabeli mogą być zwracane w nieuporządkowanej kolejności.

Aby odtworzyć naturalną kolejność od góry do dołu i od lewej do prawej, należy najpierw posortować zbiór według współrzędnej Y, a następnie według współrzędnej X w obrębie każdego wiersza. Niewielka tolerancja Y grupuje słowa znajdujące się na tej samej linii bazowej.

: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

Dostosuj lineThreshold do swojego dokumentu: 10–15 pikseli wystarczy dla standardowego tekstu 12pt przy rozdzielczości 300 DPI. W przypadku większych nagłówków lub wpisów odręcznych dopuszczalna jest większa swoboda. Ten wzorzec jest szczególnie przydatny na stronach wielokolumnowych oraz w komórkach tabel, gdzie silnik wykrywa każdą kolumnę lub komórkę jako odrębny region.

Jak filtrować słowa o niskim poziomie pewności?

Aby wykluczyć wykrycia niskiej jakości, zanim trafią one do bazy danych, indeksu wyszukiwania lub dalszego procesu ekstrakcji, należy filtrować zbiór według RegionConfidence. Wynik mieści się w przedziale od 0,0 do 1,0, przy czym wyższe wartości wskazują na większą pewność co do wykrytego tekstu.

: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

W przypadku skanów o zróżnicowanej jakości (wyraźny druk w niektórych obszarach, pogorszona jakość w innych) zapobiega to przedostawaniu się wyników o niskim poziomie pewności do systemów niższego szczebla. Aby podnieść wyniki zaufania w tekście źródłowym, filtry przetwarzania wstępnego obrazu (Deskew, DeNoise, Binarize) poprawiają jakość przed zastosowaniem progu.

Jak przeprowadza się iterację na poziomie znaków?

W przypadku nakładek weryfikacyjnych OCR, porównywania na poziomie znaków z danymi referencyjnymi lub precyzyjnej analizy przestrzennej pól formularzy należy użyć kolekcji Characters. Odzwierciedla Words, ale rozkłada się na poszczególne znaki.

: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

Zwróć uwagęZarówno Words, jak i Characters są obliczane w trybie leniwym i buforowane. Pierwsze wywołanie uruchamia obliczenia; kolejne wywołania zwracają wynik z pamięci podręcznej, więc powtórzenie operacji nie wiąże się z żadnymi kosztami.

Jak przyciąć oryginalny obraz za pomocą BoundingBox?

Aby wyodrębnić obszar wizualny słowa w celu weryfikacji, adnotacji lub tworzenia oznaczonych danych szkoleniowych, należy przekazać właściwość BoundingBox do AnyBitmap.CropRegion(). Prostokąt ograniczający odpowiada bezpośrednio pozycji słowa na obrazku źródłowym.

: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

Ten wzorzec można skalować do operacji masowych: iteruj każde WORD, przytnij każdy blok i wyeksportuj oznaczony zbiór danych do szkolenia niestandardowych czcionek lub dalszych procesów uczenia maszynowego. Współrzędne odnoszą się do obrazu po przetworzeniu wstępnym; jeśli filtry takie jak EnhanceResolution zmieniły wymiary, ramka ograniczająca odpowiada przetworzonemu obrazowi, a nie oryginałowi na dysku.

Kolejne kroki

Zaawansowany potok zapewnia taki sam poziom szczegółowości przestrzennej jak IronTesseract.Read(), a dodatkowo oferuje inteligentne funkcje układu. Tematy powiązane:

Rozpocznij bezpłatny 30-dniowy okres probny lub zapoznaj się z opcjami licencyjnymi.

Często Zadawane Pytania

Czym jest zaawansowane OCR w C#?

Zaawansowane OCR w C# odnosi się do procesu wykorzystania optycznego rozpoznawania znaków do wyodrębniania szczegółowych danych o słowach i znakach, w tym współrzędnych, poziomów pewności i ramek granicznych, przy użyciu zaawansowanej ścieżki IronOCR.

Jak uzyskać dostęp do danych o słowach za pomocą IronOCR?

Możesz uzyskać dostęp do danych o słowach w IronOCR poprzez iterację kolekcji AdvancedWord, która zapewnia szczegółowe informacje o położeniu każdego słowa i jego ocenie pewności w zeskanowanym dokumencie.

Jakie jest znaczenie ramek granicznych w OCR?

Ramki graniczne są kluczowe w OCR, ponieważ definiują dokładne położenie i wymiary rozpoznanych elementów tekstowych na zeskanowanym obrazie, umożliwiając precyzyjne wyodrębnianie tekstu i manipulację obrazem.

Czy mogę filtrować wyniki OCR wg oceny pewności?

Tak, używając IronOCR, możesz filtrować wyniki OCR wg oceny pewności, aby zapewnić, że do dalszego przetwarzania brany jest pod uwagę tylko tekst o wysokiej dokładności rozpoznania.

Jak odtworzyć kolejność czytania w wynikach OCR?

Rekonstrukcja kolejności czytania w wynikach OCR jest możliwa dzięki analizie sekwencji obiektów AdvancedWord i AdvancedCharacter dostarczanych przez IronOCR, które odzwierciedlają naturalny przepływ czytania w dokumencie.

Czy możliwe jest przycinanie obrazów źródłowych za pomocą IronOCR?

IronOCR pozwala na przycinanie obrazów źródłowych na podstawie analizy danych tekstowych, które obejmują ramki graniczne i współrzędne rozpoznanych słów i znaków.

Czym są kolekcje AdvancedWord i AdvancedCharacter?

Kolekcje AdvancedWord i AdvancedCharacter w IronOCR to struktury danych, które przechowują szczegółowe informacje o każdym rozpoznanym słowie i znaku, w tym ich współrzędne, poziomy pewności i ramki graniczne.

Jak IronOCR zarządza rozpoznawaniem znaków?

IronOCR zarządza rozpoznawaniem znaków, wykorzystując zaawansowaną ścieżkę, która analizuje cechy każdego znaku, dostarczając szczegółowe dane takie jak jego pozycja, rozmiar i pewność rozpoznania.

Jakiego typu dokumenty można przetwarzać z IronOCR?

IronOCR może przetwarzać szeroki zakres typów dokumentów, w tym PDF-y, zeskanowane obrazy i zdjęcia, wyodrębniając dane tekstowe z wysoką dokładnością i szczegółowością.

Czy dostępna jest bezpłatna wersja próbna IronOCR?

Tak, Iron Software oferuje bezpłatną wersję próbną IronOCR, umożliwiając użytkownikom przetestowanie jego funkcji i możliwości przed podjęciem decyzji o zakupie.

Darrius Serrant
Inżynier oprogramowania Full Stack (WebOps)

Darrius Serrant posiada tytuł licencjata z informatyki z Uniwersytetu Miami i pracuje jako Full Stack WebOps Marketing Engineer w Iron Software. Już od młodych lat zainteresował się kodowaniem, postrzegając informatykę jako zarówno tajemniczą, jak i dostępną, co czyni ją doskonałym medium dla kreatywności ...

Czytaj więcej
Gotowy, aby rozpocząć?
Nuget Pliki do pobrania 6,136,090 | Wersja: 2026.7 właśnie wydany
Still Scrolling Icon

Wciąż przewijasz?

Czy chcesz szybko dowodu? PM > Install-Package IronOcr
uruchom próbkę obserwuj, jak twój obraz staje się tekstem z możliwością wyszukiwania.