Próbowałem wyczyścić obrazy dla OCR: (linie)
Muszę usunąć te linie, aby czasami przetworzyć obraz i zbliżam się dość blisko, ale często próg zabiera zbyt wiele tekstu:
copy = img.copy()
blur = cv2.GaussianBlur(copy, (9,9), 0)
thresh = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,11,30)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9,9))
dilate = cv2.dilate(thresh, kernel, iterations=2)
cnts = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
area = cv2.contourArea(c)
if area > 300:
x,y,w,h = cv2.boundingRect(c)
cv2.rectangle(copy, (x, y), (x + w, y + h), (36,255,12), 3)
Edycja: Ponadto użycie stałych liczb nie będzie działać w przypadku zmiany czcionki. Czy istnieje ogólny sposób, aby to zrobić?
Odpowiedzi:
Oto pomysł. Ten problem dzielimy na kilka kroków:
Określ średni prostokątny obszar konturu. Wysuwamy próg, a następnie wyszukujemy kontury i filtrujemy, korzystając z obwiedniowego obszaru konturu. Powodem tego jest obserwacja, że każda typowa postać będzie tylko tak duża, podczas gdy duży hałas obejmie większy prostokątny obszar. Następnie określamy średnią powierzchnię.
Usuń duże kontury odstające. Powtarzamy ponownie kontury i usuwamy duże kontury, jeśli są one
5x
większe niż średnia powierzchnia konturu, wypełniając kontur. Zamiast korzystać ze stałego progu, używamy tego dynamicznego progu dla większej niezawodności.Dylatuj za pomocą pionowego jądra, aby łączyć znaki . Chodzi o to, aby wykorzystać spostrzeżenie, że znaki są wyrównane w kolumnach. Po rozszerzeniu za pomocą pionowego jądra łączymy tekst razem, aby hałas nie był uwzględniany w tym połączonym konturze.
Usuń niewielki hałas . Teraz, gdy tekst do zachowania jest połączony, znajdujemy kontury i usuwamy wszelkie kontury mniejsze niż
4x
średni obszar konturu.Bitowo i zrekonstruować obraz . Ponieważ chcieliśmy tylko, aby kontury pozostały na naszej masce, bitowo - i aby zachować tekst i uzyskać nasz wynik.
Oto wizualizacja procesu:
Mamy próg Otsu, aby uzyskać obraz binarny, a następnie znaleźć kontury, aby określić średni prostokątny obszar konturu. Stąd usuwamy duże kontury odstające podświetlone na zielono poprzez wypełnienie konturów
Następnie konstruujemy pionowe jądro i rozszerzamy, aby połączyć znaki. Ten krok łączy cały pożądany tekst, aby zachować i odizolować hałas na pojedyncze obiekty BLOB.
Teraz znajdujemy kontury i filtrujemy za pomocą obszaru konturu, aby usunąć mały szum
Oto wszystkie usunięte cząsteczki hałasu podświetlone na zielono
Wynik
Kod
Uwaga: Tradycyjne przetwarzanie obrazu ogranicza się do progowania, operacji morfologicznych i filtrowania konturów (aproksymacja konturu, powierzchnia, współczynnik kształtu lub wykrywanie plam). Ponieważ obrazy wejściowe mogą się różnić w zależności od rozmiaru tekstu znaków, znalezienie pojedynczego rozwiązania jest dość trudne. Być może warto przyjrzeć się szkoleniu własnego klasyfikatora z uczeniem maszynowym / głębokim w zakresie dynamicznego rozwiązania.
źródło