Je voulais calculer automatiquement le nombre de différence à partir du graphique d'affaissement sur le site de données de pachislot.
↑ 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.
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.
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.
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! !! !!
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