Salut !
Oui pardon, c'est loin d'être clair je me rend compte... Mais il faut considérer mes derniers post,, comme tu l'as fais =)
merc je vais regarder ça plus en précision
Salut !
Oui pardon, c'est loin d'être clair je me rend compte... Mais il faut considérer mes derniers post,, comme tu l'as fais =)
merc je vais regarder ça plus en précision
Du coup c'est bon, l'algorithme marche, j'ai du virer les nan aussi. Il me renvoi pas les paramètre d'entrée mais bon, ça ne fit pas du tout mes données...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 from numpy import * x=psi.ravel() a,b,c = 20, 20, 20 y_true = a*cos(b-xbis)+c y_meas = target.ravel() #remove nan values xbis = x[~np.isnan(x)] y_meas_bis = y_meas[~isnan(xbis)] y_meas_f = y_meas_bis[~isnan(y_meas_bis)] x_f = xbis[~isnan(y_meas_bis)] def residuals(p,y,x): a,b,c = p err = y-(a*cos(b-x)+c) return err def peval(x,p): return p[0]*cos(p[1]-x)+p[2] p0 = [10,10,10] from scipy.optimize import leastsq plsq = leastsq(residuals, p0, args = (y_true,xbis),full_output = 1) fig = pl.figure() ax = pl.subplot(111) pl.plot(x,y_meas,'b.',ms=0.01) pl.plot(x_f,peval(x_f,plsq[0]),'k.',ms=0.01) ax.set_ylim([-100,100]) pl.show()
Salut!
ça m'a tout l'air d'être bancal tout ça. Avoir NaN c'est pas bon signe en général.
En voyant le graph que tu as posté, j'ai l'impression que tu cherches à fitter un nuage de point (en bleu) par une fonction de type sinusoïdale. Il me semblait que le problème était plutôt de recaler ou de déterminer le décalage entre deux images...
Est-ce que tu as envisagé d'autres pistes? Il y a plusieurs personnes ici qui me semblent assez calés en traitements d'images. Peut-être n'ont -ils pas lu ce fil.
Ju
Salut,
En fait fitter ce nuage de point par une fonction sinusoïdale revient à estimer les paramètres a,b,c qui vont nous permettre de connaitre le décalage entre les deux images (a norme du vecteur entre les deux images, b sa direction et c un biais, plus il est proche de zero mieux c'est)
L'image contient pas mal de NaN car il y a des régions avec des "trous" donc pas de données.
Merci pour ton aide =)
Ah ok.
Je vois mieux. Imaginons que l’on récupère tous les pixels non blancs et non vides. On souhaite avoir deux listes : x_meas et y_meas de même taille contenant les coordonnées des pixels (je pense que c’est faisable).
A partir de là je pense qu'il ne sera pas dur de fitter. On ne parle plus de matrices ni d'images, mais juste de vecteurs. C'est un problème courant.
EDIT
Je suis ok avec ce que tu as écris (code), dans l'ensemble. Je ne peux pas faire de test mais voici ce que j'aurais fait:
Tu pourrais aussi regrouper plusieurs points avant d'essayer de fitter une courbe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 # -*- coding: utf-8 -*- import numpy as np from scipy.optimize import leastsq import matplotlib.pyplot as plt # Ici on lit l image et on recupere la position des pixels. # Ou autre process si le nuage de point est un resultat # On doit avoir x_meas et y_meas de meme taille (les points bleus) def peval(x, p): """Function to evaluate""" return p[0]*np.cos(p[1]-x) + p[2] def residuals(p, y, x): """Compute residual vector according to parameter p""" return y - peval(x, p) # Starting values p0 = [20., 20., 20.] # Evaluation of the parameters plsq = leastsq(residuals, p0, args=(y_meas,x_meas), full_output = 1) print plsq # Plot fig = plt.figure() ax = fig.add_subplot(111) ax.scatter(x_meas, y_meas color='blue') ax.plot(x_meas, peval(x_meas,plsq[0], color='black') plt.show()
Ju
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager