[PYTHON] Lisez l'image du graphique avec OpenCV et obtenez les coordonnées du point final du graphique

Contexte

Je voulais calculer automatiquement le nombre de différence à partir du graphique d'affaissement sur le site de données de pachislot.

graph_sample.png

↑ Le graphique ressemble à ceci.

Étant donné que la coordonnée y du point final du graphique (partie du cercle rouge de l'image) était nécessaire pour le calcul, j'ai écrit le code pour lire l'image du graphique et acquérir les coordonnées en utilisant OpenCV.

code

import cv2
import numpy as np
import time

start = time.time()
file_path = 'C:\\Users\\Pictures\\sample_graph.png'
#Lecture d'image graphique
img = cv2.imread(file_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #Contenu de img:[coordonnée y,coordonnée x, [R, G, B]]
#Obtenez le nombre d'éléments sur l'axe des x et l'axe des y
i_range = img.shape[0]
j_range = img.shape[1]
#Tableau de stockage de coordonnées
graph_coordinate = [[0 for i in range(3)] for j in range(i_range * j_range)]
x_list = []
#boucle de l'axe y
for i in range(i_range):
    #boucle de l'axe des x
    for j in range(j_range):
        #Stocker chaque valeur RVB
        R, G, B = img[i, j]
        #Obtenez uniquement les coordonnées qui s'appliquent à la couleur du graphique
        if (230 <= R <= 255) and (0 <= G <= 30) and (130 <= B <= 160):
                graph_coordinate.append([i, j, img[i, j]])
                x_list.append(j)
coordinate = np.asarray(graph_coordinate)
#Trouvez la coordonnée y à partir de la valeur maximale sur l'axe x (coordonnée x à la fin du graphique)
target = np.where(coordinate[:, 1] == max(x_list))
y_axis_target = coordinate[target]
y_axis = y_axis_target[0][0]
print(f'y_axis:{y_axis}')
print('elapsed_time:{time} sec'.format(time=time.time() - start))

Le traitement lorsqu'il n'y a pas de graphique et le traitement lorsqu'il y a plusieurs objets de coordonnée y sont également poursuivis, mais ils seront longs, ils sont donc omis.

Explication du flux général de traitement

Tout d'abord, lisez le graphique et obtenez toutes les informations sur les pixels avec le type numpy.ndarray. (L'image contient des données sous la forme de [coordonnée y, coordonnée x, [R, G, B]]) ↓ Recherchez tous les pixels à partir des informations sur les pixels et stockez toutes les coordonnées des pixels qui correspondent à la couleur du graphique dans la liste. (La valeur RVB de la couleur du graphique est définie en examinant l'image à l'avance) ↓ Enfin, obtenez la coordonnée y cible à partir de la valeur maximale de l'axe des x (point final du graphique) et terminez.

C'est un flux.

Améliorez la vitesse de traitement

Cela répond aux exigences, mais la vitesse de traitement est lente en raison de la double boucle de l'instruction for.

Résultat d'exécution


y_axis:36
elapsed_time:2.9471683502197266 sec

Pour le moment, je ne voulais faire que la forme, donc je l'ai écrite avec le code ci-dessus qui est apparu immédiatement, mais comme je lis les éléments du graphique avec le type numpy, je l'ai réécrit en une forme qui puisse l'utiliser.

import cv2
import numpy as np
import time

start = time.time()
file_path = 'C:\\Users\\Pictures\\sample_graph.png'
#Lecture d'image graphique
img = cv2.imread(file_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#Obtenez la valeur RVB du pixel du point de départ du graphique (img[coordonnée y][coordonnée x])
color_pattern = img[180][45]
#Binarisation(0 or 255)
mask = cv2.inRange(img, color_pattern, color_pattern)
#Obtenir les coordonnées de la partie graphique uniquement
coordinate = np.stack(np.where(mask == 255), axis=1)
#Valeur maximale sur l'axe des x (point final du graphique)
max_x_axis = coordinate[:, 1].max()
#Trouvez la coordonnée y à partir de la valeur maximale sur l'axe des x
y_axis_target = coordinate[np.where(coordinate[:, 1] == max_x_axis)]
y_axis = y_axis_target[0][0]
print(f'y_axis:{y_axis}')
print('elapsed_time:{time} sec'.format(time=time.time() - start))

Contrairement à avant, obtenez d'abord la valeur RVB du graphique à partir du pixel au début du graphique. ** * Prérequis: la taille de l'image et les coordonnées du point de départ du graphique sont toujours constantes **

Ensuite, binarisez les pixels qui correspondent aux valeurs RVB du graphique et ceux qui ne correspondent pas. Après cela, utilisez numpy.where pour obtenir les coordonnées de la partie graphique (255) uniquement. À la fin, comme pour le code avant amélioration, la coordonnée y est calculée à partir de la valeur maximale sur l'axe des x et complétée.

Cliquez ici pour la vitesse de traitement après la réécriture.

Résultat d'exécution


y_axis:36
elapsed_time:0.015000581741333008 sec

Vitesse explosive! !! !!

Lien de référence

Traitement d'image avec Python: différences et utilisation de Pillow, NumPy, OpenCV Traitement d'image avec Python, NumPy (lire, calculer, enregistrer) Traitement d'image avec Python Comprenons les tableaux d'images et RVB! [Python] Référence Numpy, extraction, combinaison Comment sortir les coordonnées d'une couleur spécifique avec python [Python / OpenCV] Comment extraire une couleur spécifique d'une image

Recommended Posts

Lisez l'image du graphique avec OpenCV et obtenez les coordonnées du point final du graphique
Lire les coordonnées du tracé sur le graphe avec Python-matplotlib (super débutant)
Obtenez et estimez la forme de la tête en utilisant Dlib et OpenCV avec python
Obtenez le cours de l'action d'une entreprise japonaise avec Python et faites un graphique
[Python] Obtenez les nombres dans l'image graphique avec OCR
Lire les coordonnées de l'image avec Python-matplotlib
Obtenez des fonctionnalités d'image avec OpenCV
Lisez le fichier csv avec le notebook jupyter et écrivez le graphique l'un sur l'autre
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
Essayez de brouiller l'image avec opencv2
[Statistiques] Saisir l'image de la théorie de la limitation du pôle central avec un graphe
Lisez l'image du jeu de puzzle et sortez la séquence de chaque bloc
Comment obtenir la valeur en pixels du point à partir de l'image satellite en spécifiant la latitude et la longitude
Calculer l'itinéraire le plus court d'un graphe avec la méthode Dyxtra et Python
Comment couper la partie inférieure droite de l'image avec Python OpenCV
[Reconnaissance d'image] Comment lire le résultat de l'annotation automatique avec VoTT
Obtenez des visites d'articles et des likes avec l'API Qiita + Python
Essayez de séparer l'arrière-plan et l'objet en mouvement de la vidéo avec OpenCV
Ce que j'ai fait quand je ne pouvais pas trouver le point caractéristique avec le flux optique d'opencv et quand je l'ai perdu
J'ai essayé de "lisser" l'image avec Python + OpenCV
J'ai essayé de "différencier" l'image avec Python + OpenCV
Extraire la couleur de l'objet dans l'image avec le clustering Mask R-CNN et K-Means
La base de la théorie des graphes avec l'animation matplotlib
Conversion en ondelettes d'images avec PyWavelets et OpenCV
Nettoyage des données 3 Utilisation d'OpenCV et prétraitement des données d'image
J'ai lu et implémenté les variantes de UKR
J'ai essayé d'utiliser le filtre d'image d'OpenCV
[Python + OpenCV] Peignez la partie transparente de l'image en blanc
Obtenez le titre de Yahoo News et analysez les sentiments
Extraire le tableau des fichiers image avec OneDrive et Python
Coordonnées les plus à droite de l'étiquette faite avec tkinter
Obtenez l'image de "Suzu Hirose" par recherche d'images Google.
Omettre les graduations du graphique après la virgule décimale dans matplotlib
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
Capture d'image / comparaison de la vitesse OpenCV avec et sans GPU
Visualisez la gamme d'insertions internes et externes avec python
Lisez la puissance du compteur intelligent avec M5StickC (édition BP35C0-J11-T01)
POSTER l'image avec json et la recevoir avec flask
[Django 2.2] Trier et obtenir la valeur de la destination de la relation
Obtenez l'état de fonctionnement de JR West avec Python
Visualisez le statut d'appréciation des œuvres d'art avec OpenCV
Lire la documentation OpenCV
Un serveur qui renvoie le nombre de personnes devant la caméra avec bottle.py et OpenCV
Renvoyez les données d'image avec Flask of Python et dessinez-les dans l'élément canvas de HTML
Obtenez le prix d'achat et de vente de la monnaie virtuelle avec l'API de l'échange Zaif et créez un graphique
[Python] Lisez le fichier csv et affichez la figure avec matplotlib
Découvrez la puissance de l'accélération avec NumPy / SciPy
Lire le fichier GRIB2 de l'Agence météorologique sur pygrib
Application de Python: Nettoyage des données Partie 3: Utilisation d'OpenCV et prétraitement des données d'image
Débarrassez-vous des données sales avec Python et les expressions régulières
L'histoire de l'affichage d'images avec OpenCV ou PIL (uniquement)
Traitement linguistique 100 knocks-29: Obtenez l'URL de l'image du drapeau
Lisez le fichier VTK et affichez la carte des couleurs avec jupyter.
Exemple d'analyse HTTP GET et JSON avec Pepper Python
Estimer la posture du marqueur AR avec Python + OpenCV + drone
Fabriquez un thermomètre BLE et obtenez la température avec Pythonista3
Jouez avec le mécanisme de mot de passe de GitHub Webhook et Python
[Python] Lecture facile des fichiers image du numéro de série avec OpenCV