Lecture graphique avec Python

a marqué ce sujet comme résolu.

Bonjour,

Je suis entrain de travailler sur un projet de lecture graphique avec Python.

Je m’explique : j’essaye d’ouvrir une image de graphique avec pillow, pour ensuite repérer la teinte correspondant à la courbe et générer un fichier de points en fonction de la position des pixels de la bonne teinte dans l’image.

Jusque là, mon projet avance plutôt bien, mais je me retrouve dans une impasse : les données que j’obtiens (qui représentent la bonne courbe) sont en pixels, et j’aimerais pouvoir retrouver les données de départ. Pour cela, il faudrait que je détermine l’échelle de mes axes (en pixels par unité), mais je ne sais pas du tout comment m’y prendre !

Je n’ai pas mon code directement sous la main, je vous l’envoie dès que possible.

Bonne soirée,

@flopy78

Bonjour,

Voici le code de mon projet :

#Tous le modules nécessaires...
from numpy import *
from PIL import Image
from matplotlib import pyplot as plt
from statistics import mean

#Recherche de la teinte de la courbe :
img = Image.open("graphique.png")

img = img.convert("RGB")
colors = list()

for i in range(img.size[0]):
    for j in range(img.size[1]):
        color = img.getpixel((i,j))
        if color[2] > color[1] and color[2] > color[0] and color[1] < 120 and color[0] < 120:
            colors.append(color)
            #print(color)
colors = list(set(colors))

#extraction du fichier de points
xevol = 0
evolve = False
x = []
y = []
for i in range(img.size[0]):
    if evolve:
        x.append(xevol)
        y.append(list())
    for j in range(img.size[1]):
        color = img.getpixel((i,j))
        if color == colors[0] and not evolve:
            evolve = True
            x.append(xevol)
            y.append(list())
        if evolve:
            if color == colors[0]:
                y[-1].append(img.size[0]-j)
    if evolve:
        if not y[-1] == []:
            y[-1] = mean(y[-1])
        xevol+=1

while [] in y:
    y.remove([])


x = x[0:len(y)]

#reste à mettre les données à la bonne échelle...

#affichage du résultat via matplotlib (optionnel, mais pratique pour le développement)
plt.plot(x,y)
plt.show()

Tu as probablement "juste" besoin de déterminer une origine (en pixels) et une conversion pour ton axe des x et des y. Autrement dit,

origin = (100,75)  # origine du graphique
fac_x = 30 # pixels par unité de x
fac_y = 40 # pixels par unité de y
x_scaled, y_scaled = (x - origin[0]) / fac_x, (y - origin[1]) / fac_y

Si tu veux aller plus loin, tu peux t’inspirer de la manière de faire de WebPlotDigitizer :)

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte