[PYTHON] J'ai essayé de corriger la forme trapézoïdale de l'image

Motivation

Dans le centre commercial du quartier, de nombreuses plantes sont plantées dans le passage extérieur, et il y a une plaque avec une description des plantes ensemble. Je me demandais quel genre de plante il y avait (il semble qu'il y en ait plus de 100 sortes), alors j'ai décidé d'agréger les informations sur l'assiette. ――Cependant, il est difficile de saisir les informations de la plaque dans le smartphone et de collecter les informations. .. .. J'ai décidé de prendre une photo, de la corriger, puis d'effectuer l'OCR par souci de simplicité.

Image avant correction

Ce que j'ai fait

  1. Acquisition de l'image de la plaque
  2. Masquez et binarisez les pièces autres que la plaque
  3. Suppression du bruit
  4. Acquisition / approximation du contour Approximatif
  5. Correction de l'image de la plaque
  6. Correction trapézoïdale

1. Acquisition de l'image de la plaque

1. Masquez et binarisez les pièces autres que la plaque

Convertissez l'image au format HSV, émettez du blanc si la teinte (teinte) est incluse dans la plage qui serait une plaque, et émettez du noir pour les autres, et effectuez un masquage et une binarisation.

preprocess.py


cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

Le masque a l'air bien.

Supplément

HSV est une méthode d'expression de la couleur avec trois éléments

--Teinte

2. Suppression du bruit

Après fermeture, ouverture Fermer d'abord car les pixels de la plaque peuvent manquer

Supplément

--Dilatation

3. Obtenir le contour ・ Contour approximatif de la plaque

Obtenez un contour

Détecte et dessine les contours des objets contenus dans l'image sans bruit.

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)

Le contour a été dessiné pour cela.

Obtenez le contour de la plaque

Dans cette image, il n'y a pas d'autre contour que la plaque, Obtenez le contour (plaque) avec la plus grande surface au cas où il y aurait un contour autre que la plaque.

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]

Obtenez les coordonnées des quatre coins de la plaque

Approcher la forme de la zone avec un petit nombre de points et obtenir les coordonnées des quatre coins de la plaque.

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)

J'ai pu obtenir les coordonnées des quatre coins avec un bon feeling.

2. Correction de l'image de la plaque

1. Correction trapézoïdale

Les coordonnées des quatre coins sont divisées en haut à gauche, en bas à gauche, en haut à droite et en bas à droite, et l'image est dessinée avec une correction trapézoïdale.

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)

Résultat de la correction trapézoïdale

Résumé

Trébucher

――Au début, une détection de ligne droite était effectuée sur l'image avant correction, mais même si la ligne de la plante était obtenue ou la ligne droite de la plaque était obtenue, elle était coupée, ce qui n'était pas le résultat escompté. Après cela, j'ai essayé de masquer en fonction de la valeur RVB, mais je ne pouvais pas bien détecter le contour de la plaque car la majeure partie de la plaque était ébréchée ou la partie sans rapport avec la plaque ne pouvait pas être masquée.

Bonne chose

«Depuis que j'ai commencé par tâtonner complètement, je ne savais pas quelle méthode utiliser, et j'ai pu en conséquence essayer différentes méthodes de traitement d'image. (Bien que la théorie n'ait pas rattrapé son retard.) --Vinarisation (valeur fixe, Otsu, traitement de seuil adaptatif) --Détection linéaire (conversion Huff, conversion Huff probabiliste)

Tâche

Si la plante chevauche la plaque et que la zone de la plaque est divisée comme indiqué dans l'image ci-dessous, la correction trapézoïdale ne fonctionnera pas. (Je me demande si les plantes ne couvriront pas l'assiette lors de la prise de photos ...)

Ochi

À propos, dans Google Cloud Vision, le résultat de l'OCR est presque le même avant et après la correction, et l'OCR est presque parfait même avant la correction. Le style de Google! !! !!

Autre

Cliquez ici pour le code source https://github.com/ChihiroHozono/Plate-Text-Detector

Recommended Posts

J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de créer l'image de démarrage SD de LicheePi Nano
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé de transformer l'image du visage en utilisant sparse_image_warp de TensorFlow Addons
J'ai essayé d'obtenir les résultats de Hachinai en utilisant le traitement d'image
J'ai essayé de détecter l'iris à partir de l'image de la caméra
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
J'ai essayé de résumer les opérations de chaîne de Python
[Python] J'ai essayé de juger l'image du membre du groupe d'idols en utilisant Keras
J'ai essayé d'automatiser le travail de masquage du visage de l'image de coordination pour l'usure
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
J'ai essayé d'obtenir les informations de localisation du bus Odakyu
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
J'ai essayé de combattre le minimum local de la fonction Goldstein-Price
J'ai essayé de trier les objets de l'image du plat de steak-④ Clustering
J'ai essayé d'extraire le texte du fichier image en utilisant Tesseract du moteur OCR
J'ai essayé le serveur asynchrone de Django 3.0
J'ai essayé de résumer la commande umask
J'ai essayé de reconnaître le mot de réveil
J'ai essayé de résumer la modélisation graphique.
J'ai essayé d'estimer le rapport de circonférence π de manière probabiliste
J'ai essayé de toucher l'API COTOHA
J'ai essayé de jouer avec l'image avec Pillow
[Linux] J'ai essayé de résumer les commandes de confirmation des ressources
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
J'ai essayé de traiter l'image en "style croquis" avec OpenCV
J'ai essayé de traiter l'image dans un "style de dessin au crayon" avec OpenCV
J'ai essayé d'agrandir la taille du volume logique avec LVM
J'ai essayé de couper une image fixe de la vidéo
J'ai essayé de résumer la méthode de mise en œuvre fréquemment utilisée de pytest-mock
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de visualiser la condition commune des téléspectateurs de la chaîne VTuber
J'ai essayé de trier les objets de l'image du plat de steak-① Détection d'objets
J'ai essayé de "lisser" l'image avec Python + OpenCV
J'ai essayé Web Scraping pour analyser les paroles.
J'ai essayé la fonction de tableau croisé dynamique des pandas
J'ai essayé l'analyse par grappes de la carte météo
J'ai essayé la reconnaissance d'image de CIFAR-10 avec Keras-Learning-
J'ai essayé de déplacer l'image vers le dossier spécifié en faisant un clic droit et un clic gauche
J'ai essayé de visualiser la tranche d'âge et la distribution des taux d'Atcoder
J'ai essayé de transcrire les actualités de l'exemple d'intégration commerciale sur Amazon Transcribe
J'ai essayé de "différencier" l'image avec Python + OpenCV
J'ai essayé la reconnaissance d'image de CIFAR-10 avec la reconnaissance d'image Keras-
J'ai essayé d'informer Slack de la mise à jour de Redmine
J'ai essayé d'optimiser le séchage du linge
zoom J'ai essayé de quantifier le degré d'excitation de l'histoire lors de la conférence
J'ai essayé d'estimer la similitude de l'intention de la question en utilisant Doc2Vec de gensim
J'ai essayé de sauvegarder les données avec discorde