[C] Convolution matrice 2D

Convolution matrice 2D [C] - C - Programmation

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

Reply

Marsh Posté le 26-06-2006 à 09:50:50   

Reply

Marsh Posté le 26-06-2006 à 10:20:48    

Reply

Marsh Posté le 26-06-2006 à 11:13:52    


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.

Reply

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.


Message édité par nickoko le 26-06-2006 à 11:45:09
Reply

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.

Reply

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?

Reply

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.

Reply

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.
 

Reply

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)

Reply

Marsh Posté le 26-06-2006 à 14:12:20    

nickoko a écrit :

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)


 
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.


Message édité par GrosBocdel le 26-06-2006 à 14:14:23
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed