[PYTHON] Lesen Sie das Diagrammbild mit OpenCV und ermitteln Sie die Koordinaten des Endpunkts des Diagramms

Hintergrund

Ich wollte die Differenzzahl automatisch aus dem Einbruchdiagramm auf der Pachislot-Datenseite berechnen.

graph_sample.png

↑ 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.

Code

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.

Erläuterung des allgemeinen Verarbeitungsflusses

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.

Verarbeitungsgeschwindigkeit verbessern

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! !! !!

Referenzlink

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

Lesen Sie das Diagrammbild mit OpenCV und ermitteln Sie die Koordinaten des Endpunkts des Diagramms
Lesen Sie die Koordinaten des Diagramms in der Grafik mit Python-matplotlib (Super-Anfänger)
Erhalten und schätzen Sie die Form des Kopfes mit Dlib und OpenCV mit Python
Holen Sie sich mit Python den Aktienkurs eines japanischen Unternehmens und erstellen Sie eine Grafik
[Python] Holen Sie sich die Zahlen im Diagramm mit OCR
Lesen Sie die Bildkoordinaten mit Python-matplotlib
Holen Sie sich Bildfunktionen mit OpenCV
Lesen Sie die CSV-Datei mit dem Jupiter-Notizbuch und schreiben Sie die Grafik übereinander
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Versuchen Sie, das Bild mit opencv2 zu verwischen
[Statistik] Erfassen Sie das Bild der zentralen Polbegrenzungstheorie mit einem Diagramm
Lesen Sie das Bild des Puzzlespiels und geben Sie die Reihenfolge der einzelnen Blöcke aus
So erhalten Sie den Pixelwert des Punkts aus dem Satellitenbild, indem Sie den Breiten- und Längengrad angeben
Berechnen Sie die kürzeste Route eines Diagramms mit der Dyxtra-Methode und Python
So schneiden Sie den unteren rechten Teil des Bildes mit Python OpenCV
[Bilderkennung] Lesen des Ergebnisses der automatischen Annotation mit VoTT
Holen Sie sich Artikelbesuche und Likes mit Qiita API + Python
Versuchen Sie, den Hintergrund und das sich bewegende Objekt des Videos mit OpenCV zu trennen
Was ich getan habe, als ich den Feature-Punkt mit dem optischen Fluss von opencv nicht finden konnte und als ich ihn verloren habe
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Extrahieren Sie die Farbe des Objekts im Bild mit Mask R-CNN und K-Means Clustering
Die Basis der Graphentheorie mit Matplotlib-Animation
Wavelet-Konvertierung von Bildern mit PyWavelets und OpenCV
Datenbereinigung 3 Verwendung von OpenCV und Vorverarbeitung von Bilddaten
Ich habe die Varianten von UKR gelesen und implementiert
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
[Python + OpenCV] Malen Sie den transparenten Teil des Bildes weiß
Holen Sie sich den Titel der Yahoo News und analysieren Sie die Stimmung
Extrahieren Sie die Tabelle der Bilddateien mit OneDrive & Python
Ganz rechts Koordinaten des Etiketts mit tkinter erstellt
Holen Sie sich das Bild von "Suzu Hirose" von Google Bildersuche.
Lassen Sie die Häkchen nach dem Dezimalpunkt in matplotlib weg
[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren
Visualisieren Sie den Bereich der internen und externen Einfügungen mit Python
Lesen Sie die Leistung des Smart Meters mit M5StickC (BP35C0-J11-T01 Edition) ab.
POST das Bild mit json und erhalte es mit der Flasche
[Django 2.2] Sortieren und erhalten Sie den Wert des Beziehungsziels
Holen Sie sich mit Python den Betriebsstatus von JR West
Visualisieren Sie mit OpenCV den Wertschätzungsstatus von Kunstwerken
Lesen Sie die OpenCV-Dokumentation
Ein Server, der mit Flasche.py und OpenCV die Anzahl der Personen vor der Kamera zurückgibt
Geben Sie die Bilddaten mit Flask of Python zurück und zeichnen Sie sie in das Canvas-Element von HTML
Holen Sie sich den Kauf- und Verkaufspreis der virtuellen Währung mit der API von Zaif Exchange und erstellen Sie ein Diagramm
[Python] Lesen Sie die CSV-Datei und zeigen Sie die Abbildung mit matplotlib an
Sehen Sie, wie schnell Sie mit NumPy / SciPy beschleunigen können
Lesen Sie die GRIB2-Datei der Meteorological Agency auf pygrib
Anwendung von Python: Datenbereinigung Teil 3: Verwendung von OpenCV und Vorverarbeitung von Bilddaten
Befreien Sie sich mit Python und regulären Ausdrücken von schmutzigen Daten
Die Geschichte der Anzeige von Bildern mit OpenCV oder PIL (nur)
Sprachverarbeitung 100 Knocks-29: Holen Sie sich die URL des Flaggenbildes
Lesen Sie die VTK-Datei und zeigen Sie die Farbkarte mit Jupiter an.
Beispiel für das Parsen von HTTP GET und JSON mit Pfefferpython
Schätzen Sie die Haltung des AR-Markers mit Python + OpenCV + Drohne
Machen Sie ein BLE-Thermometer und ermitteln Sie die Temperatur mit Pythonista3
Spielen Sie mit dem Passwortmechanismus von GitHub Webhook und Python
[Python] Mit OpenCV können Sie problemlos Bilddateien mit Seriennummern lesen