Per rilevare i contorni di una immagine 3D sto provando a realizzare l'algoritmo di canny in 3D tramite matlab
http://unaviolarosa.altervista.org/files/edge_detection.pdf
Il filtro proposto da questo algoritmo è ben approssimato dalla derivata di Gaussiana secondo x, y e z. Nel mio script io
[list=]
calcolo una approssimazione della derivata di Gaussiana tramite meshgrid
faccio la convoluzione dell'immagine di partenza prima con una Gaussiana, poi con la matrice calcolata al passo precedente
dovrei calcolare i massimi locali dell'oggetto ottenuto al passo precedente secondo il gradiente di crescita
[/list]
ed è qui che mi fermo perché pur calcolando il gradiente non riesco a seguire l'algoritmo 2D ed a riportarlo nel 3D.
Nel pdf proposto in precedenza ho trovato questa dicitura:
Per trovare i pixel dove le norme del gradiente sono massimi locali abbiamo applicato l'interpolazione, tale funzione in MATLAB è interp2.
Ora dato che esiste la funzione interp3 in matlab vorrei utilizzare un approccio simile a questo, ma non so come utilizzare l'interpolazione per calcolare i massimi di una matrice...
Qualcuno sa aiutarmi??
Se può servire inserisco le parti salienti del codice
- Codice: Seleziona tutto
width=7;
[x,y,z]=meshgrid(-width:width,-width:width,-width:width);
dgau3Dx = -x.*exp(-(x.*x+y.*y+z.*z)/(2*sigma^2))/((2*pi)^(3/2)*sigma^5);
dgau3Dy = -y.*exp(-(x.*x+y.*y+z.*z)/(2*sigma^2))/((2*pi)^(3/2)*sigma^5);
dgau3Dz = -z.*exp(-(x.*x+y.*y+z.*z)/(2*sigma^2))/((2*pi)^(3/2)*sigma^5);
%apply directional derivatives
Ix = imfilter(I, dgau3Dx, 'conv','replicate');
Iy = imfilter(I, dgau3Dy, 'conv','replicate');
Iz = imfilter(I, dgau3Dz, 'conv','replicate');
%operatore Derivate of Gaussian
DroG=(exp(-(x.*x+y.*y+z.*z)/(2*sigma^2))/(2*pi*sigma^4)).*(-x-y-z);


