Comment comparer un élément matriciel avec ses voisins sans utiliser de boucle dans MATLAB?
J'ai une matrice dans MATLAB. Je veux vérifier l'4-connecté voisins (gauche, droite, haut, bas) pour chaque élément. Si l'élément courant est inférieure à l'un des voisins puis nous nous sommes mis à zéro, sinon il va garder sa valeur. Il peut facilement être fait avec de la boucle, mais il est très cher, et j'ai des milliers de ces matrices.
Vous pourriez le reconnaître comme nonmaxima de la répression après la détection de contours.
source d'informationauteur Shan
Vous devez vous connecter pour publier un commentaire.
Une façon de le faire est avec la fonction NLFILTER de la Boîte À Outils De Traitement D'Imagequi applique une fonction à chaque M-par-N bloc d'une matrice:
Le code ci-dessus définit une fonction anonyme qui utilise linéaire de l'indexation pour obtenir l'élément central d'un 3-en-3 submatrix
b(5)
et de le comparer à ses 4 relié voisinsb([2 4 6 8])
. La valeur de l'élément central est multiplié par la logique de résultat retourné par la fonction TOUSqui est à 1 lorsque le centre de l'élément est plus grand que tous ses voisins les plus proches, et 0 sinon.Si vous avez la boîte à outils de traitement d'image, vous pouvez le faire avec un morpological dilatation de trouver des maxima locaux et de supprimer tous les autres éléments.
modifié pour utiliser les mêmes données que @gnovice, et à corriger le code
Si vous n'avez pas accès à la Boîte À Outils De Traitement D'Imageune autre façon de le faire est par la construction de quatre matrices représentant le haut, droite, bas et gauche d'abord, les différences, pour chaque point, puis à la recherche pour les éléments correspondants dans tous les quatre matrices non-négatives (c'est à dire l'élément dépasse tous ses voisins).
Voici l'idée en panne...
Générer des données de test:
Pad de la frontière avec le zéro-éléments:
Construire les quatre premiers de la différence des matrices:
Trouver les éléments qui dépassent tous les voisins:
Créer la matrice résultante:
Après l'enveloppant tout cela dans une fonction et de le tester sur 1000 aléatoire 100x100 matrices, l'algorithme semble être très rapide: