J'ai une matrice composée de valeurs positives et négatives. J'ai besoin de faire ces choses.moyen le plus rapide pour calculer le voisinage des pixels
Soit u(i,j)
désignons les pixels de la matrice u
.
- Calculez les pixels qui traversent le zéro. Ce sont les pixels de la grille si
u(i-1,j)
etu(i+1,j)
sont de signes opposés ouu(i,j-1)
etu(i,j+1)
sont de signes opposés. - Ensuite, j'ai besoin de calculer la bande étroite autour de ces pixels de passage à zéro. La largeur de la bande étroite est
(2r+1)X(2r+1)
pour chaque pixel. Je prendsr=1
donc pour cela je dois réellement obtenir les 8 pixels de voisinage de chaque pixel de passage à zéro.
Je l'ai fait dans un programme. S'il vous plaît voir ci-dessous.
%// calculate the zero crossing pixels
front = isfront(u);
%// calculate the narrow band of around the zero crossing pixels
band = isband(u,front,1);
Je joins également les fonctions isfront
et isband
.
function front = isfront(phi)
%// grab the size of phi
[n, m] = size(phi);
%// create an boolean matrix whose value at each pixel is 0 or 1
%// depending on whether that pixel is a front point or not
front = zeros(size(phi));
%// A piecewise(Segmentation) linear approximation to the front is contructed by
%// checking each pixels neighbour. Do not check pixels on border.
for i = 2 : n - 1;
for j = 2 : m - 1;
if (phi(i-1,j)*phi(i+1,j)<0) || (phi(i,j-1)*phi(i,j+1)<0)
front(i,j) = 100;
else
front(i,j) = 0;
end
end
end
function band = isband(phi, front, width)
%// grab size of phi
[m, n] = size(phi);
%// width=r=1;
width = 1;
[x,y] = find(front==100);
%// create an boolean matrix whose value at each pixel is 0 or 1
%// depending on whether that pixel is a band point or not
band = zeros(m, n);
%// for each pixel in phi
for ii = 1:m
for jj = 1:n
for k = 1:size(x,1)
if (ii==x(k)) && (jj==y(k))
band(ii-1,jj-1) = 100; band(ii-1,jj) = 100; band(ii-1,jj+1) = 100;
band(ii ,jj-1) = 100; band(ii ,jj) = 100; band(ii,jj+1) = 100;
band(ii+1,jj-1) = 100; band(ii+1,jj) = 100; band(ii+1,jj+1) = 100;
end
end
end
end
Les sorties sont donnés ci-dessous :, ainsi que le temps de calcul:
%// Computation time
%// for isfront function
Elapsed time is 0.003413 seconds.
%// for isband function
Elapsed time is 0.026188 seconds.
Quand je lance le code je reçois les réponses correctes, mais le calcul pour les tâches est trop à mon goût. Y a-t-il une meilleure façon de le faire? Surtout la fonction isband
? Comment puis-je optimiser mon code davantage?
Merci d'avance.
Avez-vous envisagé des opérations morphologiques, disent [ 'bwmorph'] (http://www.mathworks.com/help/images/ref/bwmorph.html)? –
Attention: L'accès aux deux pixels voisins dans votre 'isband' est incorrectement codé; vous avez probablement copié-collé et oublié de corriger le -1 en +1 et +0. –
@RodyOldenhuis merci pour le commentaire. Oui, je l'ai copié et collé, donc c'était une erreur. Edited ma question pour le corriger. – roni