[PYTHON] Ich habe versucht, die Trapezform des Bildes zu korrigieren

Motivation

――In dem Einkaufszentrum in der Nachbarschaft werden viele Pflanzen in den äußeren Durchgang gepflanzt, und es gibt einen Teller mit einer Beschreibung der Pflanzen zusammen. Ich habe mich gefragt, welche Art von Pflanzen es gibt (es scheint, dass es mehr als 100 Arten gibt), also habe ich beschlossen, die Informationen auf dem Teller zusammenzufassen. ―― Es ist jedoch schwierig, die Informationen auf der Platte in das Smartphone einzugeben und zu sammeln. .. .. Der Einfachheit halber habe ich beschlossen, ein Bild aufzunehmen, es zu korrigieren und dann eine OCR durchzuführen.

Bild vor der Korrektur

Was ich getan habe

  1. Aufnahme des Plattenbildes
  2. Maskieren und binärisieren Sie andere Teile als die Platte
  3. Geräuschentfernung
  4. Erfassung / Annäherung der Kontur Ungefähr
  5. Plattenbildkorrektur
  6. Trapezkorrektur

1. Aufnahme des Plattenbildes

1. Maskieren und binärisieren Sie andere Teile als die Platte

Das Bild wird in das HSV-Format konvertiert, und das Bild, dessen Farbton (Farbton) im Bereich der Platte enthalten ist, wird als Weiß ausgegeben, und die anderen werden als Schwarz ausgegeben, und Maskierung und Binarisierung werden durchgeführt.

preprocess.py


cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

Die Maske sieht gut aus.

Ergänzung

HSV ist eine Methode, um Farbe mit drei Elementen auszudrücken

--Farbton

2. Geräuschentfernung

Nach dem Schließen öffnen Schließen Sie zuerst, da möglicherweise die Pixel der Platte fehlen

Ergänzung

--Erweiterung

- Schließen - Verarbeitung, die sich gleich oft ausdehnt und zusammenzieht. - Öffnen - Verarbeitung, die sich gleich oft zusammenzieht und ausdehnt. 3. Konturaufnahme ・ Ungefähre Kontur der Platte

Kontur bekommen

Erkennt und zeichnet die Konturen von Objekten, die im rauschfreien Bild enthalten sind.

preprocess.py


img, contours, hierarchy = cv2.findContours(img, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPL)
img = cv2.drawContours(img, contour, -1, (0, 0, 255), 30)
cv2.imwrite(output_path, img)

Der Umriss wurde dafür gezeichnet.

Holen Sie sich die Kontur der Platte

In diesem Bild gibt es keinen anderen Umriss als die Platte. Erhalten Sie die Kontur (Platte) mit der größten Fläche, falls es eine andere Kontur als die Platte gibt.

preprocess.py


contour_areas = {}
for i, contour in enumerate(contours):
    area = cv2.contourArea(contour)
    contour_areas[i] = area

max_area = max(contour_areas.values())
max_area_idx = [i for i, v in contour_areas.items() if v == max_area][0]
max_contour = contours[max_area_idx]

Holen Sie sich die Koordinaten der vier Ecken der Platte

Nähern Sie die Form des Bereichs mit einer kleinen Anzahl von Punkten und ermitteln Sie die Koordinaten der vier Ecken der Platte.

preprocess.py


arc_len = cv2.arcLength(max_contour, True)
approx_contour = cv2.approxPolyDP(max_contour, epsilon=0.1 * arc_len, closed=True)
img = cv2.drawContours(img, approx_contour, -1, (0, 0, 255), 30)
cv2.imwrite(output_path, img)

Mit einem guten Gefühl konnte ich die Koordinaten der vier Ecken ermitteln.

2. Plattenbildkorrektur

1. Trapezkorrektur

Die Koordinaten der vier Ecken werden in oben links, unten links, oben rechts und unten rechts unterteilt, und das Bild wird mit Trapezkorrektur gezeichnet.

preprocess.py


approx = approx_contour.tolist()

left = sorted(approx, key=lambda x: x[0])[:2]
right = sorted(approx, key=lambda x: x[0])[2:]
left_down = sorted(left, key=lambda x: x[0][1])[0]
left_up = sorted(left, key=lambda x: x[0][1])[1]
right_down = sorted(right, key=lambda x: x[0][1])[0]
right_up = sorted(right, key=lambda x: x[0][1])[1]

perspective_base = np.float32([left_down, right_down, right_up, left_up])
perspective = np.float32([[0, 0], [700, 0], [700, 500], [0, 500]])

psp_matrix = cv2.getPerspectiveTransform(perspective_base, perspective)
plate_img = cv2.warpPerspective(org_img, psp_matrix, (700, 500))
cv2.imwrite(output_path, img)

Ergebnis der Trapezkorrektur

Zusammenfassung

Stolpern

―― Zuerst wurde das Bild vor der Korrektur geradlinig erkannt, aber selbst wenn die Linie der Pflanze oder die gerade Linie der Platte erhalten wurde, wurde sie abgeschnitten, was nicht das beabsichtigte Ergebnis war. ―― Danach habe ich versucht, basierend auf dem RGB-Wert zu maskieren, aber ich konnte den Umriss der Platte nicht gut erkennen, da der größte Teil der Platte abgebrochen war oder der Teil, der nicht mit der Platte zusammenhängt, nicht maskiert werden konnte.

Gute Sache

――Da ich anfing, vollständig zu tappen, wusste ich nicht, welche Methode ich verwenden sollte, und als Ergebnis konnte ich verschiedene Bildverarbeitungsmethoden ausprobieren. (Obwohl die Theorie nicht aufgeholt hat.) --Vinarisierung (Festwert, Otsu, adaptive Schwellenwertverarbeitung)

Aufgabe

Wenn Pflanzen die Platte überlappen und der Bereich der Platte wie in der Abbildung unten gezeigt geteilt wird, funktioniert die Trapezkorrektur nicht. (Ich frage mich, ob die Pflanzen beim Fotografieren den Teller nicht bedecken ...)

Ochi

Übrigens ist in Google Cloud Vision das OCR-Ergebnis vor und nach der Korrektur nahezu gleich, und die OCR ist auch vor der Korrektur nahezu perfekt. Googles Stil! !! !!

Andere

Klicken Sie hier für den Quellcode https://github.com/ChihiroHozono/Plate-Text-Detector

Recommended Posts

Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, das SD-Boot-Image von LicheePi Nano zu erstellen
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, das Gesichtsbild mit sparse_image_warp von TensorFlow Addons zu transformieren
Ich habe versucht, die Trefferergebnisse von Hachinai mithilfe der Bildverarbeitung zu erhalten
Ich habe versucht, Iris aus dem Kamerabild zu erkennen
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
[Python] Ich habe versucht, das Mitgliederbild der Idolgruppe mithilfe von Keras zu beurteilen
Ich habe versucht, die Gesichtsverdeckungsarbeit des Koordinationsbildes für das Tragen zu automatisieren
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, den Abschnitt zu schätzen.
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich habe versucht, das lokale Minimum der Goldstein-Preis-Funktion zu bekämpfen
Ich habe versucht, Objekte aus dem Bild des Steak-Sets zu sortieren
Ich habe versucht, den Text in der Bilddatei mit Tesseract der OCR-Engine zu extrahieren
Ich habe den asynchronen Server von Django 3.0 ausprobiert
Ich habe versucht, den Befehl umask zusammenzufassen
Ich versuchte das Weckwort zu erkennen
Ich habe versucht, die grafische Modellierung zusammenzufassen.
Ich habe versucht, das Umfangsverhältnis π probabilistisch abzuschätzen
Ich habe versucht, die COTOHA-API zu berühren
Ich habe versucht, mit Pillow mit dem Bild zu spielen
[Linux] Ich habe versucht, die Ressourcenbestätigungsbefehle zusammenzufassen
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" zu verarbeiten
Ich habe versucht, das Bild mit OpenCV im "Bleistift-Zeichenstil" zu verarbeiten
Ich habe versucht, die Größe des logischen Volumes mit LVM zu erweitern
Ich habe versucht, ein Standbild aus dem Video auszuschneiden
Ich habe versucht, die häufig verwendete Implementierungsmethode von pytest-mock zusammenzufassen
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe versucht, den allgemeinen Zustand der VTuber-Kanalbetrachter zu visualisieren
Ich habe versucht, die Objekte aus dem Bild des Steak-Sets zu sortieren. ① Objekterkennung
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe Web Scraping versucht, um die Texte zu analysieren.
Ich habe die Pivot-Table-Funktion von Pandas ausprobiert
Ich habe versucht, die Wetterkarte einer Clusteranalyse zu unterziehen
Ich habe versucht, Bilder mit CIFAR-10 mit Keras-Learning- zu erkennen.
Ich habe versucht, das Bild durch Klicken mit der rechten und linken Maustaste in den angegebenen Ordner zu verschieben
Ich habe versucht, die Altersgruppe und die Ratenverteilung von Atcoder zu visualisieren
Ich habe versucht, die Beispielnachrichten zur Geschäftsintegration in Amazon Transcribe zu übertragen
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Ich habe versucht, Bilder von CIFAR-10 mit Keras-Bilderkennung zu erkennen.
Ich habe versucht, Slack über das Update von Redmine zu informieren
Ich habe versucht, beim Trocknen der Wäsche zu optimieren
zoom Ich habe versucht, den Grad der Aufregung der Geschichte auf der Konferenz zu quantifizieren
Ich habe versucht, die Ähnlichkeit der Frageabsicht mit Doc2Vec von gensim abzuschätzen
Ich habe versucht, die Daten mit Zwietracht zu speichern