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
PM > Install-Package IronOcr -
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} | " +
$"Region {word.RegionIndex} | " +
$"'{word.Text}' | " +
$"Position: ({word.X}, {word.Y}) | " +
$"Size: {word.Width}x{word.Height} | " +
$"Confidence: {word.RegionConfidence: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} | " &
$"Region {word.RegionIndex} | " &
$"'{word.Text}' | " &
$"Position: ({word.X}, {word.Y}) | " &
$"Size: {word.Width}x{word.Height} | " &
$"Confidence: {word.RegionConfidence:P1}"
)
Next
End Using
' ToString() override for diagnostic logging
Console.WriteLine(result.Words.First().ToString())
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.RegionConfidence >= threshold)
.ToList();
var lowConfidenceWords = result.Words
.Where(w => w.RegionConfidence < 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.RegionConfidence:P1}"
);
}
Imports IronOcr
Imports System.Linq
Dim ocr As New IronTesseract()
Using input As 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.RegionConfidence >= threshold) _
.ToList()
Dim lowConfidenceWords = result.Words _
.Where(Function(w) w.RegionConfidence < 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.RegionConfidence: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.CropRegion(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.CropRegion(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
Co to jest OCR i dlaczego jest ważny?
OCR, czyli Optical Character Recognition, to technologia, która konwertuje różne typy dokumentów, takie jak zeskanowane papierowe dokumenty, PDF-y lub obrazy uchwycone przez aparat cyfrowy, na dane edytowalne i przeszukiwalne. OCR jest ważny, ponieważ automatyzuje ekstrakcję danych, redukuje ręczne wprowadzanie danych i sprawia, że informacje są łatwo dostępne i edytowalne.
Jak IronOCR ulepsza proces OCR?
IronOCR ulepsza proces OCR, dostarczając dokładne i wysokiej prędkości funkcje rozpoznawania tekstu. Wspiera wiele języków i zawiera funkcje takie jak pre-processing obrazu, aby poprawić dokładność rozpoznawania tekstu.
Czy IronOCR obsługuje dokumenty wielostronicowe?
Tak, IronOCR może efektywnie przetwarzać dokumenty wielostronicowe, wyodrębniając tekst z każdej strony i umożliwiając użytkownikom pracę z całym dokumentem jako spójną jednostką.
Jakie formaty plików wspiera IronOCR?
IronOCR obsługuje szeroki zakres formatów plików, w tym PDF, TIFF, JPEG, PNG i BMP, umożliwiając elastyczność w typach dokumentów, które może przetwarzać.
Czy IronOCR jest odpowiedni do rozpoznawania tekstu w obrazach niskiej jakości?
Tak, IronOCR zawiera zaawansowane funkcje pre-processingu obrazu, które poprawiają jakość niskiej rozdzielczości lub słabej jakości obrazów, zwiększając dokładność rozpoznawania tekstu.
Czy IronOCR obsługuje wiele języków?
IronOCR obsługuje wiele języków, co czyni go wszechstronnym narzędziem dla globalnych aplikacji wymagających rozpoznawania tekstu w różnych językach.
Czy IronOCR można zintegrować z istniejącymi aplikacjami?
IronOCR jest zaprojektowany do łatwej integracji z istniejącymi aplikacjami używając C#, co pozwala programistom dodać funkcjonalność OCR do swojego oprogramowania z minimalnym wysiłkiem.
Jakie są korzyści z używania IronOCR do zarządzania dokumentami?
Używanie IronOCR do zarządzania dokumentami upraszcza przepływ pracy przez konwertowanie zeskanowanych dokumentów na przeszukiwalny i edytowalny tekst, redukując konieczność ręcznego wprowadzania danych i poprawiając dostępność dokumentów.
Jak IronOCR może poprawić dokładność danych?
IronOCR poprawia dokładność danych dzięki swoim zaawansowanym algorytmom rozpoznawania i funkcjom korekcji obrazów, zapewniając, że proces ekstrakcji tekstu jest zarówno niezawodny, jak i precyzyjny.
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.

