2016-08-30 25 views
5

Jakieś sugestie dotyczące konwersji tych obrazów na tekst? Używam pytesseract i działa wspaniale w większości przypadków z wyjątkiem tego. Najlepiej, gdybym dokładnie przeczytał te liczby. W najgorszym przypadku mogę po prostu spróbować użyć PIL, aby określić, czy liczba po lewej stronie "/" wynosi zero. Zacznij od lewej strony i znaleźć pierwsze biały piksel, a następnieCzytanie tekstu z obrazu

enter image description here enter image description here

from PIL import Image 
from pytesseract import image_to_string 

myText = image_to_string(Image.open("tmp/test.jpg"),config='-psm 10') 
myText = image_to_string(Image.open("tmp/test.jpg")) 

Ukośnik w środku powoduje tu zagadnień. Próbowałem także użyć "Paste" PILa, aby dodać wiele dodatkowych czarnych wokół obrazu. Mogę spróbować kilku innych sztuczek PIL, ale wolałbym nie iść tą drogą, chyba że muszę.

Próbowałem użyć config = '- psm 10', ale moje 8-y przychodziły jako ":" czasami, a losowe znaki innym razem. I moje zero było już w zasięgu.

odniesienie do: pytesseract don't work with one digit image do -psm 10

_____________EDIT_______________ Dodatkowe próbki:

enter image description here 1BJ2I]

enter image description here DIS

enter image description here 10.I'10

enter image description here 20.I20

Więc robię jakieś konwersje voodoo, które wydają się działać teraz. Ale wygląda bardzo podatne na błędy:

def ConvertPPTextToReadableNumbers(text): 
    text = RemoveNonASCIICharacters(text) 
    text = text.replace("I]", "0") 
    text = text.replace("|]", "0") 
    text = text.replace("l]", "0") 
    text = text.replace("B", "8") 
    text = text.replace("D", "0") 
    text = text.replace("S", "5") 
    text = text.replace(".I'", "/") 
    text = text.replace(".I", "/") 
    text = text.replace("I'", "/") 
    text = text.replace("J", "/") 
    return text 

Ostatecznie generuje:

ConvertPPTextToReadableNumbers return text = 18/20 
ConvertPPTextToReadableNumbers return text = 0/5 
ConvertPPTextToReadableNumbers return text = 10/10 
ConvertPPTextToReadableNumbers return text = 20/20 
+0

'-psm 10' jest do jednorazowego rozpoznawania znaków, można spróbować' PSM 7' (pojedyncza linia tekstu) Ref: https://github.com/tesseract-ocr/tesseract/wiki/Command-Line -Usage – Gwen

+0

Zostawiłem tam kilka szczegółów, to co zrobiłem z psm 10 to próba wykadrowania pierwszej postaci, a następnie użycie psm 10. Udało mi się czasami wykadrować pierwszy znak, ale było niespójne.Nawet wtedy, gdy mogę samemu wykroić 8, byłoby to zinterpretowane jako: lub coś innego. I inne postacie też się nie pojawiały. Nawet gdy sam wycinam 0, to jest on pusty. – LampShade

+0

Używając psm 7, konsekwentnie czyta "0 \ 5" jako DIS, co może być wystarczająco dobre dla mojego najgorszego przypadku. Mogę po prostu sprawdzić D i będę wiedział, że to 0 /. Jeśli ktokolwiek ma lepsze rozwiązanie, zachęcamy do dzwonienia. Żałuję, że nie było sposobu, aby powiedzieć "Interpretuj wszystko jako liczby". – LampShade

Odpowiedz

2

Ogólnie rzecz biorąc, większość narzędzi OCR (jak Tesseract) są dostrojone do pracy z wysokiej rozdzielczości skanów drukowanego tekstu. Nie działają one dobrze na obrazach o niskiej rozdzielczości lub pikselach.

dwa możliwe podejścia są tu:

  1. Jeśli czcionka, tło, i układ obrazów są całkowicie przewidywalne, nie trzeba tesseract w ogóle; to tylko komplikuje sprawy. Zbuduj bibliotekę obrazów przedstawiających każdy znak, który musisz rozpoznać, i check whether parts of the image are equal to the reference image.

  2. Jeśli nie jest to opcja lub wydaje się zbyt trudna, można powiększyć obraz podzielony na piksele za pomocą jednego z the hq*x algorithms. Dodany szczegół może wystarczyć, aby Tesseract mógł niezawodnie rozpoznać postacie.

+0

Dzięki za informację. Czcionka i rozmiar są spójne, odstępy nieco się zmieniają. Zastanowię się, czy nie spróbować, jeśli moja obecna implementacja stanie się problemem. Moją jedyną troską o upscale byłoby to, że proces ten może zająć dużo czasu. Wolę coś szybciej, ponieważ mój skrypt jest czymś w czasie rzeczywistym – LampShade