2010-11-21 9 views
4

Quelle est la meilleure méthode pour trouver des pics d'impulsion (dirac delta) dans une matrice 2d. Plus précisément, je voudrais trouver les fréquences harmoniques d'une image donnée et j'ai donc besoin de trouver des pics d'impulsion dans la valeur absolue de l'image DFT. J'ai pensé à utiliser findpeaks mais il n'y a pas de version 2d. J'ai également vu des articles plus tôt concernant la recherche de pics ordinaires en utilisant imdilate et/ou imextendedmax mais ceux-ci trouvent tous les pics dans une matrice 2D alors que je ne suis intéressé que par les pics d'impulsion. Je suis sûr que les gens DSP ont une recette commune pour cette ...Trouver des pics d'impulsion 2d dans MATLAB

S'il vous plaît Aide,

Merci

+0

Définir un "pic d'impulsion". –

+0

Je cherche des fréquences dans lesquelles la valeur absolue de la transformée de Fourier prend une valeur d'une fonction delta de Dirac à cette fréquence (infini). Évidemment, pour une DFT, vous ne vous attendez pas à voir l'infini mais un pic majeur. Le problème est de savoir comment trouver ces pics dans 2d et comment les distinguer des pics normaux (plus bas, non impulsifs). – smichak

Répondre

6

Ce que vous voulez faire est de trouver des pics avec un contraste élevé. Ainsi, vous avez besoin d'un moyen d'identifier les maxima locaux, plus un moyen de mesurer la différence entre le pic et les valeurs environnantes. Seuil sur cette différence permettra d'identifier les pics d'impulsion pour vous.

En supposant que votre signal d'entrée est appelé signal

%# dilate to find, for every pixel, the maximum of its neighbors 
dilationMask = ones(3); 
dilationMask(5) = 0; 
dilSignal = imdilate(signal, dilationMask); 

%# find all peaks 
%# peaks = signal > dilSignal; 

%# find large peaks peaks by thresholding, i.e. you accept a peak only 
%# if it's more than 'threshold' higher than its neighbors 
peaks = (signal - dilSignal) > threshold; 

peaks est un tableau logique avec 1 de partout où il y a un bon pic. Vous pouvez l'utiliser pour lire les hauteurs de pic à partir du signal avec signal(peaks), et pour trouver les coordonnées en utilisant find(peaks).

+0

OK - c'est un début ... mais comment choisir un seuil? Je suppose que cela devrait dépendre du signal d'entrée. Y a-t-il une bonne méthode/règle générale pour le choisir? – smichak

+0

Ce sont des pics de Dirac, donc le seuil est l'infini: P. Blague à part, il n'y a pas de meilleure façon de choisir un seuil. Vous pouvez essayer d'exécuter 'graythresh' sur' signal-dilSignal' s'il y a deux pics clairs, un pour le signal et un pour le bruit. Vous pouvez également définir le seuil comme 3 écarts-types robustes (écart absolu médian) du signal. Peut-être que vous pouvez même décider d'une valeur fixe si toutes vos données sont très cohérentes, et la hauteur du pic a une signification facilement identifiable. – Jonas

+0

OK - cela semble prometteur ... Je vais aller avec ça. – smichak

0

L'algorithme findpeaks() est assez trivial; Si un élément est plus grand que ses deux voisins, alors c'est un pic. Ecrire une version 2D de ceci devrait être assez simple.

2

This paper I wrote contient le code source Matlab pour la détection rapide de crête locale en 2D. Il fonctionne de la même manière que imregionalmax() dans Mathworks Image Processing Toolbox mais vous permet de spécifier un rayon de voisinage local: rayon plus grand -> pics plus clairsemés.

Puisque vous attendez des impulsions creuses, la fonction nonmaxsupp_scanline() peut vous convenir.

Questions connexes