Używam tesseract do konwersji dokumentów na tekst. Jakość dokumentów jest bardzo różna, a ja szukam wskazówek, jakie przetwarzanie obrazu może poprawić wyniki. Zauważyłem, że tekst, który jest silnie pikselizowany - na przykład ten generowany przez faksy - jest szczególnie trudny do przetworzenia przez tesserakt - prawdopodobnie wszystkie te postrzępione krawędzie znaków mylą algorytmy rozpoznawania kształtów.
Jakie techniki przetwarzania obrazu poprawiłyby dokładność? Używałem rozmycia Gaussa, aby wygładzić piksele obrazy i zauważyłem niewielką poprawę, ale mam nadzieję, że istnieje bardziej szczegółowa technika, która zapewni lepsze wyniki. Powiedz filtr dostrojony do czarno-białych obrazów, który wygładzi nieregularne krawędzie, a następnie filtr, który zwiększy kontrast, aby postacie były bardziej wyraźne.
Jakieś ogólne wskazówki dla kogoś, kto jest nowicjuszem w przetwarzaniu obrazu?
źródło
W żadnym wypadku nie jestem ekspertem od OCR. Ale w tym tygodniu musiałem przekonwertować tekst z jpg.
Zacząłem od pokolorowanego, RGB 445x747 pikseli jpg. Natychmiast wypróbowałem na tym tesseract i program prawie nic nie przekonwertował. Następnie wszedłem do GIMP i wykonałem następujące czynności. obraz> tryb> obraz w skali szarości> skalowanie obrazu> filtry 1191x2000 pikseli> ulepszanie> wyostrzająca maska z wartościami promienia = 6,8, ilości = 2,69, próg = 0 Następnie zapisałem jako nowy plik jpg w jakości 100%.
Tesseract był wtedy w stanie wyodrębnić cały tekst do pliku .txt
Gimp to twój przyjaciel.
źródło
Trzy punkty poprawiające czytelność obrazu: 1) Zmień rozmiar obrazu ze zmienną wysokością i szerokością (pomnóż 0,5 i 1 i 2 z wysokością i szerokością obrazu). 2) Przekonwertuj obraz na format skali szarości (czarno-biały). 3) Usuń piksele szumu i wyraźniej (filtruj obraz).
Zobacz poniższy kod:
OBRAZ WEJŚCIOWY
OBRAZ WYJŚCIOWY
źródło
Z reguły stosuję następujące techniki wstępnego przetwarzania obrazu przy użyciu biblioteki OpenCV:
Ponowne skalowanie obrazu (zalecane, jeśli pracujesz z obrazami o rozdzielczości mniejszej niż 300 dpi):
Konwersja obrazu do skali szarości:
Stosowanie dylatacji i erozji w celu usunięcia szumu (możesz bawić się rozmiarem jądra w zależności od zestawu danych):
Stosowanie rozmycia, które można zrobić, używając jednej z następujących linii (z których każda ma swoje wady i zalety, jednak rozmycie mediany i filtr dwustronny zwykle działają lepiej niż rozmycie gaussowskie):
Niedawno napisałem dość prosty przewodnik po Tesseraccie, ale powinien on umożliwić ci napisanie pierwszego skryptu OCR i wyjaśnienie niektórych przeszkód, które napotkałem, gdy sprawy były mniej jasne, niż chciałbym w dokumentacji.
Jeśli chcesz je sprawdzić, tutaj udostępniam Ci linki:
Pierwsze kroki z Tesseract - Część I: Wprowadzenie
Pierwsze kroki z Tesseract - Część II: Wstępne przetwarzanie obrazu
źródło
To było trochę temu, ale nadal może być przydatne.
Z mojego doświadczenia wynika, że czasami pomaga zmiana rozmiaru obrazu w pamięci przed przekazaniem go do tesseraktu.
Wypróbuj różne tryby interpolacji. Post https://stackoverflow.com/a/4756906/146003 bardzo mi pomógł.
źródło
To, co było dla mnie BARDZO POMOCNE na tej drodze, to kody źródłowe projektu Capture2Text. http://sourceforge.net/projects/capture2text/files/Capture2Text/ .
BTW: Wyrazy uznania dla jego autora za udostępnienie tak żmudnego algorytmu.
Zwróć szczególną uwagę na plik Capture2Text \ SourceCode \ leptonica_util \ leptonica_util.c - na tym polega istota preprocesji obrazu dla tego narzędzia.
Jeśli uruchomisz pliki binarne, możesz sprawdzić transformację obrazu przed / po procesie w folderze Capture2Text \ Output \.
Wspomniane rozwiązanie PS wykorzystuje Tesseract do OCR i Leptonica do preprocesingu.
źródło
Wersja Java dla kodu Sathyaraja powyżej:
źródło
Dokumentacja Tesseract zawiera kilka dobrych szczegółów na temat poprawiania jakości OCR poprzez etapy przetwarzania obrazu.
Do pewnego stopnia Tesseract automatycznie je stosuje. Można również powiedzieć Tesseractowi, aby zapisał obraz pośredni do wglądu, tj. Sprawdzenia, jak dobrze działa wewnętrzne przetwarzanie obrazu (szukaj
tessedit_write_images
w powyższym odnośniku).Co ważniejsze, nowy system sieci neuronowych w Tesseract 4 zapewnia znacznie lepsze wyniki OCR - ogólnie, a zwłaszcza w przypadku obrazów z pewnym szumem. Jest to możliwe
--oem 1
np. Jak w:(ten przykład wybiera język niemiecki)
Dlatego warto najpierw przetestować, jak daleko można się posunąć dzięki nowemu trybowi Tesseract LSTM, zanim zastosuje się kilka niestandardowych kroków wstępnego przetwarzania obrazu.
źródło
Adaptacyjne progowanie jest ważne, jeśli oświetlenie jest nierówne na całym obrazie. Moje wstępne przetwarzanie przy użyciu GraphicsMagic jest wspomniane w tym poście: https://groups.google.com/forum/#!topic/tesseract-ocr/jONGSChLRv4
GraphicsMagic ma również płaską funkcję dla progu adaptacyjnego czasu liniowego, którą spróbuję wkrótce.
Inną metodę progowania przy użyciu OpenCV opisano tutaj: http://docs.opencv.org/trunk/doc/py_tutorials/py_imgproc/py_thresholding/py_thresholding.html
źródło
Zrobiłem to, aby uzyskać dobre wyniki z obrazu, który ma niezbyt mały tekst.
A jeśli nadal nie daje dobrych wyników, przeskaluj obraz do 150% lub 200%.
źródło
Czytanie tekstu z dokumentów graficznych przy użyciu dowolnego silnika OCR wiąże się z wieloma problemami w celu uzyskania dobrej dokładności. Nie ma stałego rozwiązania dla wszystkich przypadków, ale oto kilka rzeczy, które należy wziąć pod uwagę, aby poprawić wyniki OCR.
1) Obecność szumu z powodu złej jakości obrazu / niepożądanych elementów / plam w obszarze tła. Wymaga to pewnych operacji przetwarzania wstępnego, takich jak usuwanie szumów, które można łatwo wykonać za pomocą filtru Gaussa lub normalnych metod filtru medianowego. Są one również dostępne w OpenCV.
2) Niewłaściwa orientacja obrazu: z powodu złej orientacji silnik OCR nie segmentuje poprawnie linii i słów na obrazie, co daje najmniejszą dokładność.
3) Obecność wierszy: Podczas wykonywania segmentacji słów lub wierszy silnik OCR czasami próbuje również łączyć słowa i wiersze ze sobą, przetwarzając w ten sposób niewłaściwą treść i dając błędne wyniki. Są też inne kwestie, ale te podstawowe.
Ta aplikacja post OCR jest przykładem przypadku, w którym można zastosować wstępne przetwarzanie obrazu i przetwarzanie końcowe w wyniku OCR, aby uzyskać lepszą dokładność OCR.
źródło
Rozpoznawanie tekstu zależy od wielu czynników, aby uzyskać dobrą jakość wydruku. Wyjście OCR w dużym stopniu zależy od jakości obrazu wejściowego. Dlatego każdy silnik OCR zawiera wytyczne dotyczące jakości obrazu wejściowego i jego rozmiaru. Te wskazówki pomagają silnikowi OCR w uzyskiwaniu dokładnych wyników.
Napisałem szczegółowy artykuł na temat przetwarzania obrazu w Pythonie. Prosimy kliknąć poniższy link, aby uzyskać więcej wyjaśnień. Dodano również kod źródłowy Pythona, aby zaimplementować ten proces.
Napisz komentarz, jeśli masz sugestię lub lepszy pomysł na ten temat, aby go ulepszyć.
https://medium.com/cashify-engineering/improve-accuracy-of-ocr-using-image-preprocessing-8df29ec3a033
źródło
możesz zrobić redukcję szumów, a następnie zastosować progowanie, ale możesz bawić się konfiguracją OCR, zmieniając wartości --psm i --oem
spróbuj: --psm 5 --oem 2
Możesz również spojrzeć na poniższy link, aby uzyskać więcej informacji tutaj
źródło