Innanzitutto, leggere l'immagine tramite
from scipy.misc import imread
im = imread("thefile.png")
Questo dà una matrice numpy 3D con la terza dimensione essendo i canali di colore (RGB + alfa). La curva è nel canale blu, ma la griglia è anche lì. Ma nel canale rosso, hai la griglia e non la curva. Quindi usiamo
a = im[:,:,2] - im[:,:,0]
Ora, vogliamo la posizione del massimo lungo ogni colonna. Con una precisione di pixel, è data da
y0 = np.argmax(a, axis=0)
Il risultato di questo è zero quando non c'è curva blu nella colonna, cioè all'esterno della cornice. Su può ottenere i limiti del frame da
xmin, xmax = np.where(y0>0)[0][[0,-1]
Con questo, potrebbe essere possibile ridimensionare l'asse x.
Quindi, si desidera la risoluzione subpixel. Concentriamoci una singola colonna
f=a[:,x]
Usiamo una singola iterazione del metodo di Newton definire la posizione di un extrema
y1 = y0 - f'[y]/f''[y]
noti che non possiamo iterare ulteriormente a causa del campionamento discreto. Ciononostante, vogliamo una buona approssimazione delle derivate, quindi useremo uno schema a 5 punti per entrambi.
coefprime = np.array([1,-8, 0, 8, -1], float)
coefsec = np.array([-1, 16, -30, 16, -1], float)
y1 = y0 - np.dot(f[y0-2:y0+3], coefprime)/np.dot(f[y0-2:y0+3], coefsec)
P.S. : Thorsten Kranz era più veloce di me (almeno qui), ma la mia risposta ha la precisione subpixel e il mio modo di estrarre la curva blu è probabilmente più comprensibile.
Interessante domanda, sto lavorando a una soluzione, ma la precisione sub-pixel è improbabile. –
Solo semi-automatico ma ancora pertinente alla domanda, questa web app può fare miracoli: http://arohatgi.info/WebPlotDigitizer/ –