Mam ten obraz, który zawiera tekst (liczby i alfabety). Chcę uzyskać lokalizację całego tekstu i liczb obecnych na tym obrazie. Chcę też wyodrębnić cały tekst.
Jak uzyskać cordinates, a także cały tekst (cyfry i alfabety) na moim obrazie. Na przykład 10B, 44, 16, 38, 22B itp
python
opencv
machine-learning
image-processing
deep-learning
Pulkit Bhatnagar
źródło
źródło
Odpowiedzi:
Oto potencjalne podejście wykorzystujące operacje morfologiczne do filtrowania konturów nietekstowych. Chodzi o to:
Uzyskaj obraz binarny. Załaduj obraz, skalę szarości, a następnie próg Otsu
Usuń poziome i pionowe linie. Twórz jądra poziome i pionowe za pomocą,
cv2.getStructuringElement
a następnie usuwaj linie za pomocącv2.drawContours
Usuń ukośne linie, obiekty kołowe i zakrzywione kontury. Filtruj według obszaru konturu
cv2.contourArea
i aproksymacji konturu,cv2.approxPolyDP
aby wyizolować kontury nietekstoweWyodrębnij ROI i OCR tekstu. Znajdź kontury i filtruj dla ROI, a następnie OCR za pomocą Pytesseract .
Usunięto poziome linie podświetlone na zielono
Usunięto pionowe linie
Usunięto różne kontury nietekstowe (linie ukośne, obiekty kołowe i krzywe)
Wykryte regiony tekstowe
źródło
Dobra, oto inne możliwe rozwiązanie. Wiem, że pracujesz z Pythonem - pracuję z C ++. Dam ci kilka pomysłów i mam nadzieję, że jeśli zechcesz, będziesz w stanie zastosować tę odpowiedź.
Główną ideą jest całkowite niestosowanie przetwarzania wstępnego (przynajmniej na początkowym etapie) i skupienie się na każdym znaku docelowym, uzyskanie niektórych właściwości i filtrowanie każdego obiektu blob zgodnie z tymi właściwościami.
Staram się nie używać wstępnego przetwarzania, ponieważ: 1) Filtry i etapy morfologiczne mogą obniżyć jakość obiektów blob oraz 2) Twoje docelowe obiekty blob wydają się wykazywać pewne cechy, które moglibyśmy wykorzystać, głównie: współczynnik kształtu i obszar .
Sprawdź to, wszystkie cyfry i litery wydają się być wyższe niż szersze… ponadto wydają się różnić w obrębie pewnej wartości powierzchni. Na przykład chcesz odrzucić obiekty „za szerokie” lub „za duże” .
Chodzi o to, że będę filtrować wszystko, co nie mieści się w wstępnie obliczonych wartościach. Sprawdziłem znaki (cyfry i litery) i uzyskałem minimalne, maksymalne wartości powierzchni i minimalny współczynnik kształtu (tutaj stosunek wysokości do szerokości).
Pracujmy nad algorytmem. Zacznij od przeczytania obrazu i zmiany jego rozmiaru do połowy wymiarów. Twój obraz jest zdecydowanie za duży. Konwertuj na skalę szarości i uzyskaj obraz binarny przez otsu, oto pseudo-kod:
Fajne. Będziemy pracować z tym obrazem. Musisz zbadać każdą białą kroplę i zastosować „filtr właściwości” . Korzystam z połączonych komponentów ze statystykami, aby przeglądać każdą kroplę i uzyskiwać jej powierzchnię i proporcje, w C ++ odbywa się to w następujący sposób:
Teraz zastosujemy filtr właściwości. Jest to tylko porównanie z wstępnie obliczonymi progami. Użyłem następujących wartości:
Wewnątrz
for
pętli porównaj bieżące właściwości obiektu blob z tymi wartościami. Jeśli testy są pozytywne, „malujesz” kroplę na czarno. Kontynuując wewnątrzfor
pętli:Po pętli zbuduj filtrowany obraz:
I… to wszystko. Przefiltrowano wszystkie elementy, które nie są podobne do tego, czego szukasz. Po uruchomieniu algorytmu otrzymujesz ten wynik:
Dodatkowo znalazłem ramki ograniczające obiektów blob, aby lepiej wizualizować wyniki:
Jak widać, niektóre elementy zostały wykryte. Możesz zawęzić „filtr właściwości”, aby lepiej identyfikować poszukiwane znaki. Głębsze rozwiązanie, wymagające odrobiny uczenia maszynowego, wymaga zbudowania „idealnego wektora cech”, wydobycia cech z obiektów blob i porównania obu wektorów za pomocą miary podobieństwa. Możesz również zastosować postprocessing, aby poprawić wyniki ...
Cokolwiek, człowieku, twój problem nie jest trywialny ani łatwy do skalowania, a ja tylko daję ci pomysły. Mamy nadzieję, że będziesz w stanie wdrożyć swoje rozwiązanie.
źródło
Jedną z metod jest użycie przesuwanego okna (jest to kosztowne).
Określ rozmiar znaków na obrazie (wszystkie znaki mają taki sam rozmiar jak na obrazie) i ustaw rozmiar okna. Wypróbuj tesseract w celu wykrycia (obraz wejściowy wymaga wstępnego przetwarzania). Jeśli okno wykrywa znaki kolejno, zapisz współrzędne okna. Scal współrzędne i uzyskaj region na postacie.
źródło