Erkennung von gepunkteten Rahmentabellen mit ReadDocumentAdvanced

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

ReadDocumentAdvanced extrahiert Tabellendaten Zelle für Zelle, kann jedoch keine Tabellen erkennen, deren Ränder gepunktet oder gestrichelt sind (zum Beispiel border: 1px dotted black). Der Text auf der Seite kann noch lesbar sein, dennoch schlägt der Zugriff auf das Tabellenobjekt fehl, da die Engine die Tabelle nie erkennt.

Wenn Sie ReadDocumentAdvanced auf ein Dokument mit einer gepunkteten Randtabelle aufrufen und dann deren Zellen lesen, wird Folgendes ausgelöst:

Unhandled exception. System.InvalidOperationException: Sequence contains no elements

Die Lücken zwischen den Punkten brechen den Rand in diskontinuierliche Segmente, sodass die OCR-Engine keinen kontinuierlichen Kontur sehen kann, um ihn als Tabellenrand zu behandeln. Da kein Tables erkannt wurde, hat Tables.First() nichts zurückzugeben.

Lösung

Wenden Sie den Dilate()-Filter an, bevor Sie mit der Verarbeitung beginnen. Durch die Erweiterung werden die dunklen Pixel im Bild vergrößert, sodass die Lücken zwischen den Punkten geschlossen werden und der Rand als eine solide Linie gelesen wird. Die Engine kann dann das Tabellenobjekt erkennen und seine Zellen zurückgeben.

1. Tabellenerkennung aktivieren und Eingabe laden

Schalten Sie ReadDataTables ein, damit die Engine strukturierten Tabellenausgaben erzeugt, laden Sie dann Ihr Bild.

var ocr = new IronTesseract();
ocr.Configuration.ReadDataTables = true;
var input = new OcrInput();
input.Load("image-20250408-144240.png");
var ocr = new IronTesseract();
ocr.Configuration.ReadDataTables = true;
var input = new OcrInput();
input.Load("image-20250408-144240.png");
Imports IronTesseract

Dim ocr As New IronTesseract()
ocr.Configuration.ReadDataTables = True
Dim input As New OcrInput()
input.Load("image-20250408-144240.png")
$vbLabelText   $csharpLabel

Eingabentabelle mit gepunkteten Rändern, die von der OCR nicht erkannt wird

2. Vor dem Lesen erweitern

Rufen Sie Dilate() für die Eingabe auf, um den gepunkteten Rand in eine kontinuierliche Kontur zu überführen, und führen Sie dann ReadDocumentAdvanced aus.

input.Dilate();
input.SaveAsImages("export.png", AnyBitmap.ImageFormat.Png);
var res = ocr.ReadDocumentAdvanced(input);
Console.WriteLine(res.Tables.First().CellInfos.First().CellText);
input.Dilate();
input.SaveAsImages("export.png", AnyBitmap.ImageFormat.Png);
var res = ocr.ReadDocumentAdvanced(input);
Console.WriteLine(res.Tables.First().CellInfos.First().CellText);
Dim res = ocr.ReadDocumentAdvanced(input)
input.Dilate()
input.SaveAsImages("export.png", AnyBitmap.ImageFormat.Png)
Console.WriteLine(res.Tables.First().CellInfos.First().CellText)
$vbLabelText   $csharpLabel

Dilate() konvertiert die visuellen gepunkteten Linien in feste Ränder, die die Engine nachverfolgen kann, sodass res.Tables nun gefüllt ist und der Zelltext sauber gelesen wird. Der SaveAsImages-Aufruf ist optional; es lässt Sie das vergrößerte Bild inspizieren, um zu bestätigen, dass die Ränder wie erwartet geschlossen sind.

Tabelle nach Dilate() mit gepunkteten Rändern in feste Linien überführt

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen
Bereit anzufangen?
Nuget Downloads 6,136,090 | Version: 2026.7 gerade veröffentlicht
Still Scrolling Icon

Scrollst du immer noch?

Sie brauchen schnell einen Beweis? PM > Install-Package IronOcr
Führen Sie ein Beispiel aus und beobachten Sie, wie Ihr Bild zu durchsuchbarem Text wird.