|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||||||||||||||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 837 ![]() |
Bonjour,
Parmis toutes les objets mathématiques qu'il est souvent necessaire de calculer sur les pixels d'une image, il y en a deux qui reviennent assez souvent: - Le vecteur Gradient, c'est a dire les derivées partielles du 1er ordre de l'intensité: Code :
Code :
De part la nature discrete d'une image numérisée, les derivées sont approximées par des différences d'intensité au voisinage du pixel. Ces calculs vont dont etre tres sensibles au bruit. Pour limiter les effets du bruit, il est d'usage de lisser préalablement l'image (en la convoluant par une Gaussienne) avant de calculer les derivées. Et c'est la que la magie de la convolution intervient car: Code :
- Réduire les calculs de derivées partielles de l'intensité à des convolutions. - Précalculer les noyaux de convolution, car ils sont indépendants de l'image. Calculons les dérivées partielles de la Gaussienne: Code :
Code :
Derivées partielles du 2nd ordre Code :
1. Modifiez la valeur centrale du noyau afin que la somme des coefficients de la matrice soit égale a zero. Cela permet de s'assurer que la dérivée partielle sera nulle sur une zone d'intensité uniforme. 2. Choisissez une taille minimum de 3x3 pour le Gradient et 5x5 pour la Hessienne. En effet, plus la dérivée est d'un ordre élevé, plus il faut de points pour la calculer. 3. La valeur de sigma² permet de moduler la force du lissage (generalement une valeur entre 1 et 3 pour le Gradient, et entre 2 et 5 pour la Hessienne) Exemple de code en Java: Code Java :
Code Java :
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
||||||||||||||||
|
00
|
|
|
#2 |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 837 ![]() |
![]() A gauche: la norme du vecteur Gradient, Noyau 3x3, sigma²=1.4 (echelle Logarithmique) A droite: la trace de la matrice Hessienne (Laplacien), Noyau 5x5, sigma²=2.0 (effet emboss)
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|
00
|
|
|
#3 |
|
Membre régulier
![]() Étudiant Inscription : décembre 2006 Messages : 177 ![]() |
Bonjour,
Par rapport à ces codes peux-tu m'expliquer d'où provient la classe channel ? Par la même occasion, connais-tu les histogrammes pondérés et si ces codes pourraient s'y appliquer ? Merci. |
|
|
00
|
|
|
#4 | |||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 837 ![]() |
Citation:
Une implémentation minimaliste possible est: Code java :
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|||
|
00
|
|
|
#5 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2008 Messages : 22 ![]() |
Bonjour,
Si j'ai bien compris.. dans un contexte d'une image : G(x,y) represente la valeur du pixel au point (x,y). Le gradient de chaque pixel nous donne: grad(G(x,y)) = (dG/dx,dG/dy) Donc, pour chaque valeur de pixel j'aurais un couple de valeur!! Ce que je ne comprends pas, comment reproduire l'imagedu "gradient de l'image" avec ces nouveaux valeurs.. Merci d'avance |
|
|
00
|
|
|
#6 | |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 837 ![]() |
Citation:
Donc à partir d'un couple de valeur (a,b) on calcule la valeur n=racine(a²+b²). C'est cette valeur "n" qui est utilisée dans l'image.
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|
|
10
|
|
|
#7 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2008 Messages : 22 ![]() |
Superrr
![]() Merci beaucoup... Je passe mnt au codage.. |
|
|
00
|
|
|
#8 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2008 Messages : 22 ![]() |
Hello..
Je me suis basé sur le code disponible dans ce post pour programmer une fonction qui évalue le gradient d'une image. Mon but est de trouver le point de recalage avec une grande précision en utilisant les transformées de Fourier des images. Lorsque j'applique le gradient sur les deux images, j'ai un phénomène bizarroïde: quand j'évalue la norme du gradient comme vous avez suggéré n=racine(a²+b²). ça donne de mauvaise résultats. lorsque je prend seulement le gradient vertical n = a; j'obtiens le résultat voulu dans un axe, et résultat entier dans l'autre. ex: pour (dx = 13.89 et dy = 4.33) j'obtiens (dx = 14 et dy = 4.35) pour (dx = 15.39 et dy = 27.7) j'obtiens (dx = 15.40 et dy = 28) etc.. Quelq'un comprend ce qui se passe?? Code C :
|
||
|
|
00
|
|
|
#9 |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 837 ![]() |
Si c'est un problème de précision des valeurs retournées, tu peux prendre un noyau plus grand (halfwindow=2, 3, ...).
Par contre cela va atténuer les hautes frequences de l'image, et donc tu risques de perdre en précision sur les petites variations.
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|
00
|
|
|
#10 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2008 Messages : 22 ![]() |
Je ne pense pas que c'est un probleme de precision.
Car la precision est tres bonne (0.01 a 0.05) Cependant, lorsque la precision est bonne dans un axe, elle ne l'est pas dans l'autre qui affiche bizarrement un "entier" au lieu d'une valeur "double". Voici un exemple des resultats : dxTheo dyTheo dxExp dyExp Err dx Err dy (0.33, 3.4) (0.00,3.45) Erreur : [0.33 0.05] (1.08 3.29) (1) 3.31) Erreur [0.08 0.02] (2 5.85) (2) 5.79) Erreur [0 0.06] (18.38 3.12) (18.39 3) Erreur [0.01 0.12] (22.25 16.37) (22 16.42) Erreur [0.25 0.05] (13.89 4.33) (14 4.35) Erreur [0.11 0.02] (36.2 47.31) (36 47.33) Erreur [0.2 0.02] (15.39 27.7) (15.4 28 Erreur [0.01 0.3] (16.27 15.28) (16.37 15) Erreur [0.1 0.28] (0.31 4) (0.31 4) Erreur [0 0] |
|
|
00
|
|
|
#11 |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 837 ![]() |
Tu peux donner les valeurs de ton image (les voisinages 3x3) utilisés pour tes calculs ?
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|
00
|
|
|
#12 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2008 Messages : 22 ![]() |
Voici un exemple des valeurs de l'image
22813.000000 22813.000000 22812.999997 22813.000000 22813.000000 22812.999997 22812.141112 22812.141112 22812.137753 |
|
|
00
|
|
|
#13 | ||||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 837 ![]() |
Voila ce que je trouve:
Code :
Code :
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
||||
|
00
|
|
|
#14 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2008 Messages : 22 ![]() |
Moi j'obtiens :
Pour Gx: 22812.137753 22812.141112 22812.141112 -0.349673 0.000000 0.349673 22812.999997 22813.000000 22813.000000 * -0.499766 0.000000 0.499766 22812.999997 22813.000000 22813.000000 -0.349673 0.000000 0.349673 Pour Gy: 22812.137753 22812.141112 22812.141112 -0.349673 -0.499766 -0.349673 22812.999997 22813.000000 22813.000000 * 0.000000 0.000000 0.000000 22812.999997 22813.000000 22813.000000 0.349673 0.000000 0.349673 gx : 0.001177 gy : 1.031076 norme : 1.031077 angle : 89.934590 |
|
|
00
|
|
|
#15 |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 837 ![]() |
Il y a sans doute une erreur de copier/coller dans ton noyau Gy (il n'est pas symetrique). Sinon, on obtient le meme genre de résultat aux arrondis et à la valeur de sigma2 près.
Donc je ne vois pas dans quel cas tu obtiens "toujours" un nombre entier.
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|
00
|
|
|
#16 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2008 Messages : 22 ![]() |
Je pense que j'ai trouve ou est le probleme..
En regardant ma matrice de correlation je vois un pic qui apparait au point (0,0) ce qui me fausse mes calculs.. Je pense que c a cause des conditions aux limites de l'image.. vu que j'utilise un tableau d'une seule dimension tab[largeur*hauteur] au lieu d'une matrice tab[largeur][hauteur].. je reverifie les conditions au bords.. |
|
|
00
|
|
|
#17 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2008 Messages : 22 ![]() |
J'ai verifie le code.. et j'ai mis les conditions suivantes pour la gestion des bords :
(j'ai un tableau unidimensionnel qui represente l'image) if (x<0) x=largeur-1; if (x>=largeur) x=largeur-1; if (y<0) y=hauteur-1; if (y>=hauteur) y=0; return pixels[y*largeur+x]; quand j'ai les trois pics correctes c merveilleux mais parfois j'ai tjrs pic au point (0,0).. Pensez vous que les conditions sont erronees? |
|
|
00
|
|
|
#18 | ||||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 837 ![]() |
Citation:
Quel rapport avec le calcul du Gradient/Hessienne ?Citation:
Code C :
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
||||
|
00
|
|
|
#19 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2008 Messages : 22 ![]() |
[QUOTE=pseudocode;3718427]Correlation ?
Quel rapport avec le calcul du Gradient/Hessienne ?Merci pseudo code.. Je mesure de shift entre deux images en utilisant la methode de correlation de phase. Pour des meilleurs resultats, je dois travailler sur le gradient des images au lieu de travailler sur les images elles meme.. |
|
|
00
|
|
|
#20 |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 837 ![]() |
Ah... Ton problème n'a donc plus rien à voir avec le calcul du gradient ?
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|
00
|
Copyright © 2000-2013 - www.developpez.com