Wykrywanie tabel z kropkowanymi granicami z ReadDocumentAdvanced

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

ReadDocumentAdvanced wyodrebnia dane tabeli, komórka po komórce, ale nie moze wykryc tabel z kropkowanymi lub kreskowanymi granicami (przyklad border: 1px dotted black). Tekst na stronie moze byc nadal czytelny, ale dostep do obiektu tabeli sie nie powiedzie, poniewaz silnik nigdy nie rozpoznaje tabeli.

Gdy wywolujesz ReadDocumentAdvanced na dokumencie z kropkowana granica tabeli, a nastepnie odczytujesz jego komorki, wyrzuca:

Unhandled exception. System.InvalidOperationException: Sequence contains no elements

Przerwy miedzy kropkami dziela granice na nieciagle segmenty, wiec silnik OCR nie widzi ciaglego konturu, ktory moznaby uznac za granice tabeli. Brak wykrytej Tables, Tables.First() nie ma nic do zwrocenia.

Rozwiązanie

Zastosuj filtr Dilate() przed przetwarzaniem. Dylatacja rozszerza ciemne piksele na obrazie, zamykajac luki miedzy kropkami, aby granica odczytywac sie jako jedna solidna linia. Wtedy silnik moze wykryc obiekt tabeli i zwrocic jego komorki.

1. Wlacz odczyt tabel i zaladuj dane wejsciowe.

Wlacz ReadDataTables, aby silnik zbudowal strukturalny wynik tabeli, a nastepnie zaladuj obraz.

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

Tabela wejsciowa z kropkowanymi granicami, ktore OCR nie jest w stanie wykryc

2. Dylatacja przed odczytem

Wywolaj Dilate() na wejsciu, aby scalic kropkowana granice w ciagly kontur, a nastepnie uruchom ReadDocumentAdvanced.

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() konwertuje kropkowane linie wizualne na solidne granice, ktore silnik moze sledzic, wiecres.Tables jest teraz wypelnione, a odczyt tekstu komorek przebiega czysto. Wywolanie SaveAsImages jest opcjonalne; pozwala to na sprawdzenie obrazu z dylatacja, aby potwierdzic, ze granice zamknely sie zgodnie z oczekiwaniami.

Tabela po Dilate() z kropkowanymi granicami scala sie w solidne linie

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

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.