Bonjour;
je voucrais avoir les formules mathématiques qui permettent de rendre les moments de Zernike invariables en translaion, rotation et changement d'echelle.
Merci.
Version imprimable
Bonjour;
je voucrais avoir les formules mathématiques qui permettent de rendre les moments de Zernike invariables en translaion, rotation et changement d'echelle.
Merci.
Merci pseudocode, c'est vrai que si je fais une rotation de mon image de 180° ou 90° les coefficients ne changnet pas, mais si je fais une rotation de 60° ou 30° ou n'importe quelle autre angle les coefficients changent!
Tu as raison pseudocode c'est la discrétisation des pixels lorsque je fais une rotation ou un changement d'echelle de mon objet qui modifie un peu les moments. Il faudrais peut etre essayer de modifier mes images avec un logiciel de vectorisation, et non pas avec des logiciels classiques comme Paint ou Matlab avec ses imrotate et imresize.
Merci bcp.
mais est-ce qu'ils sont réelement invariables en translation? si ma forme se trouve par exemple en haut à droite et que je la translate pour la rendre par exemple en bas à gauche est-ce que les moments de Zernike changeront?
D'abord merci beaucoup pour ces réponses qui m'ont étaient d'une grande aide dans mon travail.
ensuite j'ai un petit problème lorsque je veux normaliser les moments de Zernike dans l'intervalle [0,1]: certains moments ont une magnitude supérieur à 1. j'ai utlisé une l'image du logo de Mercedes
Voici mon programme principal en matlab:
Code:
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 im2= imread('mercedes.jpg'); im2=rgb2gray(im2); im2= edge(im2,'canny'); Z=zern(im2,[0 1 2 3 4 5 6 7 8]);%Calculer les moments de Zernike de l'ordre0 jusqu'à l'ordre8 for k=1:size(Z,2) % On va prendre la magnitude de chaque moment de Zernike pour l'invariance en Z(k)=Z(k)*conj(Z(k));%rotation end; Z=Z/Z(1,1);%Normalistaion les moments de Zernike doivent appartenir à l'intervalle [0,1] en divisant par le moment Z(0,0) pour calculer les moments de Zernike j'utilise le code: function [A_nm,zmlist,cidx,V_nm] =zern(img,n,m)%Calcul des moment de Zernike de l'image img %A_nm:est le moment de Zernike qu'on recherche (Z_nm) d = size(img); img = double(img); xstep = 2/(d(1)-1); %pas pour le balayage selon x de -1 à +1 ystep = 2/(d(2)-1); %pas pour le balayage selon y de -1 à +1 [x,y] = meshgrid(-1: xstep:1,-1: ystep:1); %découpage en grille sur les 2 axes de -1 à +1 circle1 = x.^2 + y.^2; %pour ne prendre en consideration que les points se trouvant inside = find(circle1<=1); %à l'interieur du cercle unité mask = zeros(d); %on masque tout les points qui mask(inside) = ones(size(inside)); %ne se trouvent pas dans le cercle unité [cimg,cidx] = clipimg(img,mask) ; z = clipimg(x+i*y,mask) ; p=abs(z); theta = angle(z) ;%en radians entre -pi et +pi c = 1; for order=1:length(n) n1 = n(order); if nargin<3 m = zpossible(n1); %toutes les répetitions possibles pour l'ordre n1 end for r=1:length(m) V_nmt = zpoly(n1,m(r),p,theta);%zpoly(n1,m(r),p,theta) %%Vnm(x,y)=Vnm(rho,theta)=Rnm(rho)exp(j*m*tetha) zprod = cimg.*conj(V_nmt) ; A_nm(c) = (n1+1)*sum(sum(zprod))/pi; % Znm :Moment de Zernike d'ordre n et de repétition m zmlist(c,1:2) = [n1 m(r)]; if nargout==4 V_nm(:,c) = V_nmt; end c = c+1; end end function [cimg,cindex,dim] = clipimg(img,mask) dim = size(img); cindex = find(mask~=0); cimg = img(cindex); return; function [m] = zpossible(n) %Renvois les valeurs possibles de répétition pour chaque %ordre n if ~mod(n,2) %si n est pair m = 0:2:n ; else m = 1:2:n; end return; function [V_nm,mag,phase] = zpoly(n,m,p,theta) %Calcul de Rnm(rho): polynome radial %de Zernike R_nm = zeros(size(p)); a = (n+abs(m))/2; b = (n-abs(m))/2; total = b; for s=0:total num = ((-1)^s)*factorial(n-s)*(p.^(n-2*s)); %numerateur den = factorial(s)*factorial(a-s)*factorial(b-s); %denominateur R_nm = R_nm + num/den; end mag = R_nm; phase = m*theta; V_nm = mag.*exp(i*phase); % Vnm(x,y)=Vnm(rho,theta)=Rnm(rho)exp(j*m*tetha) return;
Le résultat aprés normalisation est (l'affichage sous matlab):
comme vous voyez il y'a un moment dont la magnitude >1 (2.5350)Citation:
Columns 1 through 10
1.0000 0.0040 0.5356 0.0088 0.0293 0.0485 2.5350 0.0034 0.0488 0.0263
Columns 11 through 20
0.1366 0.0021 0.0182 0.0044 0.0094 0.0125 0.0556 0.3053 0.0010 0.0022
Columns 21 through 25
0.0005 0.0331 0.0001 0.0979 0.0035
j'ai aussi essayer avec l'image de Ford:
Voici le résultat:
Encore un autre moment qui dépasse 1 (2.7196)Citation:
Columns 1 through 10
1.0000 0.0102 2.7196 0.2045 0.0441 0.0048 0.9192 0.5624 0.0684 0.0511
Columns 11 through 20
0.0111 0.0036 0.2221 0.0750 0.1721 0.0285 0.0327 0.0083 0.0059 0.0026
Columns 21 through 25
0.0255 0.0386 0.0133 0.0802 0.0130
SVP EST CE QUE QUELQU'UN POURRAIT M'AIDER???????
comme je ne peux pas vous uploader les deux images que j'ai utilisée vous pouvez visualiser deux images asez proches de celles que j'ai utilisée:
http://www.983ckrs.ca/blogue/myriam-...cedes-logo.jpg http://www.pycomall.com/images/P/ford_400.gif
Je ne connais pas Matlab, donc je ne peux pas t'aider sur ton code. Pour la partie algorithmique, je te conseille la lecture de ce document : Improvement and Invariance Analysis of Zernike Moments
Je ne crois pas que les moments de Zernike soient invariants à la translation, d'autant qu'ils sont calculés dans une représentation polaire de l'image, et donc très liés au choix du centre. Le fait de normaliser par Z00 ne fait que les rendre invariants à l'échelle (en fait en faisant cela on ne normalise que par la surface de l'image).
Il y a des travaux pour rendre ces moments invariants à la translation. Mais plus on normalise, plus on perd en précision. Voir par exemple ici.
Merci pour les réponses, je voulais seulement savoir dans les études on dit qu'aprés avoir calculer les moments de Zernike, il faut les normaliser en;
1) prenant la magnitude de chaque moment
2) diviser par Z00.
c'est justement quand on prend la magnitude des moments que la magnitude de certains moments vont devenir > à la magnitude de Z00 par exemple si Z00=13500 et Z40=-15000 alors en prenant la magnitude |Z40|=15000 va devenir plus grand que Z00, et donc aprés en divisant par Z00 ce moment sera plus grand que 1, mais dans les études que j'ai lu ils ne parlent pas de ce probléme!!!! ils disent que tout les moments appartiennent à [0,1].
OU EST LE HIC??????
Le hic c'est que les moments de Zernike qu'ils soient normalisés ou non ne sont pas vraiment censés être bornés... Evidemment à partir des définitions on doit pouvoir établir une borne sup théorique et diviser par cette borne, mais je ne suis pas certain que ce soit très pertinent. Où as-tu lu qu'ils doivent être entre 0 et 1 ?
Dans beaucoup d'études par exemple ici:
http://citeseerx.ist.psu.edu/viewdoc...=rep1&type=pdf
Je ne vois pas où, peux-tu citer l'endroit précis ?
Dans la deuxiéme page, deuxième colonne où on peut lire:
"The magnitudes are then normalized into [0, 1] by dividing them by the
mass of the shape."
Je sais que le message date, mais je suis actuellement en train de travailler sur ces moments (pas supers pratiques à maniés ^^), et en fait, pour en revenir au problème, pour normaliser il ne faut non pas divisé par Z00, mais par la masse
Source :Citation:
Get the order (0,0) geometric moment 00 m of the
image.
m00 = ∫∫f(x,y)dxdy (9)
from physics viewpoint, 00 m is the expression of mass
or area of an image.
http://sibgrapi.sid.inpe.br/col/sid....7.56/doc/2.pdf
Page 3! :ccool:
en retour sur le même sujet, avec quel erreur ou distance peut on dire que les moments de Zernike sont invariants à la translation?
en plus, lorsque on change l'origine de l'image au barycentre cela ne remet pas en question l'invariance à la rotation?
Merci.
PseudoCode l'explique dans sa première réponse.