[Python] (Line) Extraire les valeurs des images graphiques

introduction

Y a-t-il une image graphique mais pas de données ...? Si vous avez une image, extrayons-la.

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

↑ ~~ Si cela vous convient, vous ne pouvez pas vous attendre à une grande précision. .. .. ~~

Flux de processus

Obtenez le graphique souhaité en sélectionnant la gamme de couleurs   ↓ Moyenne dans le sens vertical   ↓ Interpoler pour le nombre d'échantillons souhaité   ↓ Réglage de l'échelle   ↓ production

la mise en oeuvre

** Vous pouvez l'exécuter dans Colab ici **

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

Obtenez des données d'image, ignorez l'alpha pour le moment

path = "Chemin de l'image"
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])

Découpez uniquement la plage du graphique pour un ajustement ultérieur de l'échelle

@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])

Sélectionnez le graphique que vous souhaitez extraire en sélectionnant la gamme de couleurs et ajustez le seuil pour empêcher l'entrée de parties inutiles.

@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")

Prendre la moyenne dans le sens vertical

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())

Sélection du nombre d'échantillons, élimination du bruit par moyenne mobile (convolution)

@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))

Entrez la plage du graphique qui a été coupée en premier

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

Réglage de l'échelle, sortie

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

Sortie graphique

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

↑ est un programme pour Jupyter, il ne peut donc être exécuté que si les cellules sont séparées par des parties séparées.

enfin

Il sera plus facile à utiliser si vous rendez le découpage et la sélection de la gamme de couleurs plus interactifs en utilisant HTML.

Recommended Posts

[Python] (Line) Extraire les valeurs des images graphiques
Publier une image de Python sur Tumblr
Extraire des chaînes de fichiers avec Python
[Python] [3D line graph] Plusieurs données dans un graphique, valeurs d'axe en caractères
Extraire des images des ensembles de données Cifar et CUCUMBER-9
# 5 [python3] Extraire des caractères d'une chaîne de caractères
Télécharger des images à partir de la liste d'URL en Python
[Python] Téléchargez l'image d'origine à partir de la recherche d'images Google
Python grattage Extraire l'environnement de course du site de courses de chevaux
Python: valeurs Tips-Swap
Du dessin de fichier au graphique en Python. Élémentaire élémentaire
sql à sql
LINE heroku python
MeCab de Python
Charger des images à partir d'une URL à l'aide de Pillow dans Python 3
Télécharger en masse des images à partir d'une URL spécifique avec python
Lire ligne par ligne à partir d'un fichier avec Python
Extraire des données d'une page Web avec Python
Extraire des images et des tableaux de pdf avec python pour réduire la charge de reporting
[Python] Comment supprimer les valeurs en double de la liste
Télécharger en masse des images à partir d'une URL de site spécifique avec python
[Python] Comment dessiner un graphique linéaire avec Matplotlib
[Python] Extrayez l'ID vidéo de l'URL de la vidéo YouTube [Remarque]
Extraire des caractères d'images à l'aide de l'API de reconnaissance de caractères de docomo
[Python débutant] Extrayez la préfecture et la ville de l'adresse (3 lignes).
[Python] Extraire uniquement les nombres des listes et des chaînes de caractères
Utilisez Thingsspeak de Python
Touchez MySQL depuis Python 3
Utiliser fluentd de python
Extraction de données depuis S3
Accéder à bitcoind depuis python
Changements de Python 3.0 à Python 3.5
Extrayez la quantité de caractéristiques (identité) du texte.
Changements de Python 2 à Python 3.0
Python depuis ou import
Dessin graphique avec python
Utilisez MySQL depuis Python
Exécutez Python à partir d'Excel
Installer Python à partir de la source
Exécuter des commandes depuis Python
Faites fonctionner le neutron de Python!
Utiliser MySQL depuis Python
Échange de valeurs en Python
Faire fonctionner LXC depuis Python
Manipuler riak depuis python
Forcer Python depuis Fortran
Utilisez BigQuery depuis Python.
Exécuter la commande depuis Python
Extraire le tableau de wikipedia
Dessiner un graphique avec python
[Python] Lire depuis Stdin
Utilisez mecab-ipadic-neologd de Python
[Python] Extrayez des données texte à partir de données XML de 10 Go ou plus.
Je souhaite envoyer un message de Python à LINE Bot
[Python] Lire les arguments de ligne de commande à partir du nom de fichier ou de stdin
Extraire la valeur la plus proche d'une valeur à partir d'un élément de liste en Python