Hello,
Je cherche à déterminer l'orientation principale d'un cylindre 3D en calculant les moments d'inertie de la FFT. Mon algo est le suivant :
1) calculer la FFT de l'image (fftn)
2) calculer le carré de son module, puis le centrer (fftshift)
3) calculer la matrice d'inertie de la matrice calculée à l'étape 2.
4) décomposer en éléments propres la matrice d'inertie, puis classer les vecteurs propres en fonction des valeurs propres
L'orientation principale est le vecteur propre correspondant à la plus grande valeur propre.
Voilà pour l'idée générale qui marche très bien en 2D. Par contre en 3D j'ai systématiquement une erreur de quelques degrés par rapport à l'orientation réelle du cylindre (que je connais par ailleurs). Avez-vous une idée de l'origine du problème ? Je précise que je suis bien conscient de l'existence d'autres méthodes plus performantes pour calculer l'orientation du cylindre (par exemple, calculer directement la matrice d'inertie de l'image elle-même et pas de sa TF), mais je voudrais quand même comprendre ce qui cloche avec FFTN.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 im_fft = fftn(a); % FFTN de l'image source 'a' (taille : 128*128*128) im_dsp = im_fft.*conj(im_fft); % module carré de la FFT im_fft_cent = fftshift(im_dsp); % centrage [eig_vals, eig_vects] = Centered_inertia(im_fft_cent,'descend',params); % fonction maison qui calcule et classe les vecteurs propres de la matrice d'inertie de la FFT de l'image disp(eig_vects(:,1)) % affiche les coordonnées cartésiennes du vecteur "orientation principale" imagesc(squeeze(sum(a,3))), axis image, colormap gray, hold on % affiche la z-projection de l'image source eig_vects=80.*eig_vects; % scaling des vecteurs propres pour plus de lisibilité à l'affichage quiver(64-eig_vects(2,1)/2,64-eig_vects(1,1)/2,eig_vects(2,1),eig_vects(1,1),'color','r','ShowArrowHead', 'off','Linewidth',2) % superpose la z-projection du vecteur "orientation principale" sur la z-projection de l'image
Je poste une capture d'écran dès que j'arrive à comprendre comment faire.
MAJ : l'image source + superposition du vecteur orientation est visible ici.
Merci !
Daniel
Partager