Ich wollte die Differenzzahl automatisch aus dem Einbruchdiagramm auf der Pachislot-Datenseite berechnen.
↑ Die Grafik sieht folgendermaßen aus.
Da die y-Koordinate des Endpunkts des Diagramms (roter Kreisteil des Bildes) für die Berechnung erforderlich war, habe ich den Code geschrieben, um das Diagrammbild zu lesen und die Koordinaten mit OpenCV zu erfassen.
import cv2
import numpy as np
import time
start = time.time()
file_path = 'C:\\Users\\Pictures\\sample_graph.png'
#Grafikbild lesen
img = cv2.imread(file_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #Inhalt von img:[y-Koordinate,x-Koordinate, [R, G, B]]
#Ermitteln Sie die Anzahl der Elemente auf der x- und y-Achse
i_range = img.shape[0]
j_range = img.shape[1]
#Koordinatenspeicherarray
graph_coordinate = [[0 for i in range(3)] for j in range(i_range * j_range)]
x_list = []
#y-Achsenschleife
for i in range(i_range):
#x-Achsenschleife
for j in range(j_range):
#Speichern Sie jeden RGB-Wert
R, G, B = img[i, j]
#Rufen Sie nur die Koordinaten ab, die für die Diagrammfarbe gelten
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)
#Suchen Sie die y-Koordinate aus dem Maximalwert auf der x-Achse (x-Koordinate am Ende des Diagramms).
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))
Die Verarbeitung, wenn kein Graph vorhanden ist, und die Verarbeitung, wenn mehrere Objekte mit y-Koordinaten vorhanden sind, werden ebenfalls fortgesetzt, sie sind jedoch lang, sodass sie weggelassen werden.
Lesen Sie zuerst das Diagramm und erhalten Sie alle Pixelinformationen mit dem Typ numpy.ndarray. (Das Bild enthält Daten in Form von [y-Koordinate, x-Koordinate, [R, G, B]]) ↓ Durchsuchen Sie alle Pixel anhand der Pixelinformationen und speichern Sie alle Koordinaten der Pixel, die mit der Diagrammfarbe in der Liste übereinstimmen. (Der RGB-Wert der Diagrammfarbe wird festgelegt, indem Sie ihn vorab anhand des Bildes untersuchen.) ↓ Schließlich erhalten Sie die Ziel-y-Koordinate aus dem Maximalwert der x-Achse (Endpunkt des Diagramms) und vervollständigen.
Es ist ein Fluss.
Dies erfüllt die Anforderungen, aber die Verarbeitungsgeschwindigkeit ist aufgrund der Doppelschleife der for-Anweisung langsam.
Ausführungsergebnis
y_axis:36
elapsed_time:2.9471683502197266 sec
Vorerst wollte ich nur die Form erstellen, also habe ich sie mit dem obigen Code geschrieben, der sofort angezeigt wurde. Da ich jedoch die Elemente des Diagramms mit dem Typ numpy lese, habe ich sie in eine Form umgeschrieben, die sie verwenden kann.
import cv2
import numpy as np
import time
start = time.time()
file_path = 'C:\\Users\\Pictures\\sample_graph.png'
#Grafikbild lesen
img = cv2.imread(file_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#Ermitteln Sie den RGB-Wert des Diagrammstartpunktpixels (Abb[y-Koordinate][x-Koordinate])
color_pattern = img[180][45]
#Binarisierung(0 or 255)
mask = cv2.inRange(img, color_pattern, color_pattern)
#Holen Sie sich nur die Koordinaten des Diagrammteils
coordinate = np.stack(np.where(mask == 255), axis=1)
#Maximalwert auf der x-Achse (Endpunkt des Diagramms)
max_x_axis = coordinate[:, 1].max()
#Finden Sie die y-Koordinate aus dem Maximalwert auf der x-Achse
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))
Im Gegensatz zu zuvor erhalten Sie zuerst den RGB-Wert des Diagramms vom Pixel am Anfang des Diagramms. ** * Voraussetzung: Bildgröße und Diagrammstartpunktkoordinaten sind immer konstant **
Binärisieren Sie als Nächstes die Pixel, die mit den RGB-Werten im Diagramm übereinstimmen, und diejenigen, die dies nicht tun. Verwenden Sie danach numpy.where, um nur die Koordinaten des Diagrammteils (255) abzurufen. Am Ende wird wie beim Code vor der Verbesserung die y-Koordinate aus dem Maximalwert auf der x-Achse berechnet und vervollständigt.
Klicken Sie hier, um die Verarbeitungsgeschwindigkeit nach dem Umschreiben anzuzeigen.
Ausführungsergebnis
y_axis:36
elapsed_time:0.015000581741333008 sec
Explosive Geschwindigkeit! !! !!
Bildverarbeitung mit Python: Unterschiede und Verwendung von Pillow, NumPy, OpenCV Bildverarbeitung mit Python, NumPy (lesen, berechnen, speichern) Bildverarbeitung mit Python Lassen Sie uns Bildarrays und RGB verstehen! [Python] Numpy Reference, Extraction, Combine So geben Sie die Koordinaten einer bestimmten Farbe mit Python aus [Python / OpenCV] So extrahieren Sie eine bestimmte Farbe eines Bildes
Recommended Posts