Convolution matrice 2D [C] - C - Programmation
Marsh Posté le 26-06-2006 à 11:13:52
nickoko a écrit : up... |
Pourquoi souhaites-tu utiliser une méthode de convolution? Ca me paraît compliqué.
du (f(x+h)-f(x))/h ne te convient pas?
Si tu ne l'as pas déjà fait, tu peux aller faire un tour du coté des numerical recipes
http://www.library.cornell.edu/nr/cbookcpdf.html
Sinon j'ai souvenir d'un bon bouquin rouge d'analyse numérique, aux éditions Masson qui parle des différences à droite, à gauche et centrées pour les dérivées discrètes. Si tu as accès à une bibliothèque, ce bouquin est bien.
Marsh Posté le 26-06-2006 à 11:23:30
le probleme avec ta dérivée (ou 1/2(x(n)+x(n-1)), c'est qu'il va y avoir un décalage entre le pixel de départ et la dérivée.
Marsh Posté le 26-06-2006 à 11:30:13
ok, donc ce qui te gène c'est les bords du tableau.
pour le premier élément du tableau, tu peux prendre une différence à droite
pour le dernier élément, une différence à gauche
et pour tout le reste, une différence centrée.
Marsh Posté le 26-06-2006 à 11:42:41
ma dérivée sera faussée sur un des deux bords alors. de signe différent des autres non?
Marsh Posté le 26-06-2006 à 11:55:41
nickoko a écrit : ma dérivée sera faussée sur un des deux bords alors. de signe différent des autres non? |
non!
Pour le premier élément de ton tableau, tu prends une différence à droite. Tu te sers donc de ton point x0 et de ton point x1
derivee(x0)=(f(x1)-f(x0))/pas
Pour le dernier élément de ton tableau, une différence à gauche, tu te sers de xn et x(n-1)
derivee(xn)=(f(xn)-f(xn-1))/pas
Pour les autres éléments, tu peux le faire sur 3 points
derivee(xi)=f(xi+1)-f(xi-1)/2pas
Fais toi un petit dessin sur papier en traçant les tangentes, tu verras, c'est OK.
Marsh Posté le 26-06-2006 à 12:43:30
Maintenant, pour te donner le rapport entre la méthode des différence centrées et ta convolution par la matrice [-1 0 1]:
Ta convolution, elle consiste à "faire glisser" ta matrice sur ton tableau en les multipliant entre eux. Autrement dit, en convoluant, pour chaque point xi, tu prend le point x(i-1) à qui tu affectes le poids -1, le point xi que tu pondères par zéro, et le point xi+1 que tu pondères par 1. Ca revient exactement à utiliser la formule des différences centrées, puisque ça fait f(xi+1)-f(xi-1).
Et ça pose exactement le même problème, puisqu'en début de tableau et fin de tableau, ça ne fonctionnera pas, d'où l'intérêt des différences à gauche et à droite.
Je te déconseille d'utiliser cette méthode de convolution pour faire la dérivée. C'est trop compliqué d'une part, et en plus il manque un facteur 1/2 à cette matrice.
Marsh Posté le 26-06-2006 à 13:52:52
merci pour ta précision.
comment choisir le pas? c'est l'écart réel entre 2 pixels? (la résolution d'un pixel est de 3km2 à l'équateur mais augmente si on s'en eloigne)
Marsh Posté le 26-06-2006 à 14:12:20
nickoko a écrit : merci pour ta précision. |
Si on a le choix, il faut choisir le pas de manière à ce que ton calcul de dérivée converge, c'est à dire qu'en prenant un tableau à n échantillons ou à 2n échantillons, le calcul de la dérivée donne le même résultat (à la précision que tu souhaites pour ton calcul). C'est très empirique.
Si tu n'as pas le choix, tu prends effectivement la distance entre les centres de chaque pixel, donc racine(3)km dans chacune des directions, oui.
Marsh Posté le 26-06-2006 à 09:50:50
Bonjour,
Je cherche à obtenir, à partir d'un tableau de valeurs, un autre tableau représentant les dérivées discretes du premier.
Apres recherche, j'ai vu qu'il fallait convoluer le tableau de valeur avec la matrice [-1 0 1].
Par contre, je ne vois pas comment programmer l'algo...
Quelqu'un a t'il déja effectué ce travail? Ou sait-il le faire?
Merci d'avance pour votre aide