Dane OCR dotyczące słów i znaków w języku C# (współrzędne, poziom pewności, prostokąty ograniczające)
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.
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.
-
Install IronOCR with NuGet Package Manager
-
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}"); -
Wdrożenie do testowania w środowisku produkcyjnym
Rozpocznij używanie IronOCR w swoim projekcie już dziś z darmową wersją próbną
Minimalny przebieg pracy (3 kroki)
- Pobierz bibliotekę OCR dla języka C# z serwisu NuGet
- Uruchom zaawansowane OCR za pomocą
ReadDocumentAdvancedlubReadPhotona wprowadzonym tekście - Iterate
result.Wordslubresult.Charactersdla współrzędnych, poziomu pewności i prostokątów ograniczających
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
PageNumber 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
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
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
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
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:
- Przewodnik po ekstrakcji tabel: obejmuje właściwość
TableswReadDocumentAdvanceddla ustrukturyzowanych danych komórek. - Odczytywanie wyników OCR: dane słowne dla standardowego potoku.
- Korekcja jakości obrazu: filtry przetwarzania wstępnego, które podnoszą wyniki oceny pewności.
- Samouczek OCR: kompleksowa konfiguracja dla nowych użytkowników.
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.

