[Python] (Linie) Extrahieren Sie Werte aus Diagrammbildern

Einführung

Gibt es ein Diagramm, aber keine Daten ...? Wenn Sie ein Bild haben, extrahieren wir es.

image.png pandas 0.7.3 documentation -Plotting with matplotlib             \downarrow array([-0.4028436 , -0.09518499, 0.21247362, ..., 39.12322275, 39.12322275, 39.12322275])             + image.png

↑ ~~ Wenn dies in Ordnung ist, können Sie nicht viel Genauigkeit erwarten. .. .. ~~

Prozessablauf

Erhalten Sie das gewünschte Diagramm, indem Sie den Farbbereich auswählen   ↓ Durchschnitt in vertikaler Richtung   ↓ Interpolieren Sie für die Anzahl der gewünschten Samples   ↓ Skaleneinstellung   ↓ Ausgabe

Implementierung

** Sie können es hier in Colab ausführen **

import numpy as np
import matplotlib.pyplot as plt
from ipywidgets import interact
import requests
from PIL import Image
import io

Holen Sie sich Bilddaten, ignorieren Sie Alpha vorerst

path = "Bildpfad"
im = plt.imread(path)
if im.shape[2] == 4:im = im[:,:,:-1]
if im.max() > 1:im /= 255
h, w, _ = im.shape
plt.imshow(im[::-1])

Schneiden Sie nur den Bereich des Diagramms für eine spätere Anpassung des Maßstabs

@interact(x_min=(0, w), x_max=(0, w), y_min=(0,h), y_max=(0,h))
def Plot(x_min=0, x_max=w, y_min=0, y_max=h):
    global imag
    plt.figure(figsize=(7, 7))
    imag = im[min(y_min,y_max-1):max(y_min+1, y_max), min(x_min,x_max-1):max(x_min+1, x_max)]
    plt.imshow(imag[::-1])

Wählen Sie das Diagramm aus, das Sie durch Auswahl des Farbbereichs extrahieren möchten, und passen Sie den Schwellenwert an, um zu verhindern, dass unnötige Teile eingegeben werden.

@interact(x=(0, imag.shape[1]), y=(0,imag.shape[0]), thresh=(1,10))
def Plot(x, y, thresh):
    global p
    p = ((imag - imag[y, x]) ** 2).sum(axis=2) < (1 / (1<<thresh))
    print(p.sum())
    plt.imshow(p[::-1])
    plt.plot([x, x], [0, imag.shape[0]], color="r")
    plt.plot([0, imag.shape[1]], [imag.shape[0]-y, imag.shape[0]-y], color="r")

Nehmen Sie den Durchschnitt in vertikaler Richtung

p = np.pad(p, 1, "constant")
sx = np.arange(len(p[0]))[p.argmax(axis=0)!=0]
sy = []

for i in p.T:
    j = np.where(i!=0)[0]
    if j.tolist():
        sy.append(j.mean())

Auswahl der Anzahl der Proben, Entfernung des Rauschens durch gleitenden Durchschnitt (Faltung)

@interact(sample=(5, 1250), conv_size=(1, 21, 2))
def fit(sample, conv_size):
    global y
    x = np.linspace(sx.min(), sx.max(), sample)
    y = np.convolve(np.pad(np.interp(x, sx, sy), (conv_size-1)//2, "edge"), np.ones(conv_size) / conv_size, "valid")
    plt.plot(x, y)
    plt.xlim(0,len(p[0]))
    plt.ylim(0, len(p))

Geben Sie den Bereich des Diagramms ein, das zuerst geschnitten wurde

yl = list(map(int,input("Y-range of trimmed graph?         ").split(",")))

Skaleneinstellung, Ausgabe

y_out = y * (yl[1] - yl[0]) / p.shape[0] + yl[0]
y_out

Grafikausgabe

plt.plot(y_out)
plt.ylim(*yl)

↑ ist ein Programm für Jupyter und kann daher nur ausgeführt werden, wenn die Zellen durch separate Teile getrennt sind.

schließlich

Die Verwendung ist einfacher, wenn Sie das Trimmen und die Auswahl des Farbbereichs mithilfe von HTML interaktiver gestalten.

Recommended Posts

[Python] (Linie) Extrahieren Sie Werte aus Diagrammbildern
Poste ein Bild von Python auf Tumblr
Extrahieren Sie mit Python Zeichenfolgen aus Dateien
[Python] [3D-Liniendiagramm] Mehrere Daten in einem Diagramm, Achsenwerte in Zeichen
# 5 [python3] Extrahiert Zeichen aus einer Zeichenfolge
Laden Sie Bilder von der URL-Liste in Python herunter
[Python] Laden Sie das Originalbild von der Google Bildsuche herunter
Python-Scraping Extrahieren Sie die Rennumgebung von der Pferderennseite
Python: Tips-Swap-Werte
Von der Datei zur Diagrammzeichnung in Python. Grundstufe Grundstufe
SQL zu SQL
LINE Heroku Python
MeCab von Python
Laden Sie Bilder von der URL mit Pillow in Python 3
Massen-Download-Bilder von einer bestimmten URL mit Python
Lesen Sie mit Python Zeile für Zeile aus der Datei
Extrahieren Sie mit Python Daten von einer Webseite
Extrahieren Sie Bilder und Tabellen mit Python aus PDF, um die Berichtslast zu verringern
[Python] So entfernen Sie doppelte Werte aus der Liste
Massen-Download-Bilder von einer bestimmten Site-URL mit Python
[Python] Wie zeichnet man mit Matplotlib ein Liniendiagramm?
[Python] Extrahiere die Video-ID aus der YouTube-Video-URL [Hinweis]
Extrahieren Sie Zeichen aus Bildern mithilfe der Zeichenerkennungs-API von docomo
[Python-Anfänger] Extrahieren Sie die Präfektur und die Stadt aus der Adresse (3 Zeilen).
[Python] Extrahieren Sie nur Zahlen aus Listen und Zeichenfolgen
Verwenden Sie thingspeak aus Python
Berühren Sie MySQL in Python 3
Verwenden Sie fließend Python
Daten aus S3 extrahieren
Greifen Sie über Python auf Bitcoind zu
Änderungen von Python 3.0 zu Python 3.5
Extrahieren Sie die Merkmalsmenge (Identität) aus dem Text.
Änderungen von Python 2 zu Python 3.0
Python aus oder importieren
Diagrammzeichnung mit Python
Verwenden Sie MySQL aus Python
Führen Sie Python aus Excel aus
Installieren Sie Python von der Quelle
Führen Sie Befehle aus Python aus
Bedienen Sie Neutronen von Python!
Verwenden Sie MySQL aus Python
Werte in Python austauschen
Betreiben Sie LXC von Python aus
Manipuliere Riak aus Python
Erzwinge Python aus Fortran
Verwenden Sie BigQuery aus Python.
Führen Sie den Befehl von Python aus
Tabelle aus Wikipedia extrahieren
Zeichnen Sie ein Diagramm mit Python
[Python] Von Stdin lesen
Verwenden Sie mecab-ipadic-neologd von Python
[Python] Extrahieren Sie Textdaten aus XML-Daten von 10 GB oder mehr.
Ich möchte eine Nachricht von Python an LINE Bot senden
[Python] Befehlszeilenargumente aus Dateiname oder Standard lesen
Extrahieren Sie den Wert, der einem Wert am nächsten kommt, aus einem Listenelement in Python