Erkennung von gepunkteten Rahmentabellen mit ReadDocumentAdvanced
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")

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)
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.


