2010-11-21 2 views
4

Каков наилучший способ нахождения импульсных импульсов (дельта дирака) в матрице 2d.Поиск 2d импульсных пиков в MATLAB

Более конкретно, я хотел бы найти гармонические частоты данного изображения, и поэтому мне нужно найти импульсные пики в изображении абсолютного значения DFT.

Я думал об использовании findpeaks, но нет версии 2d. Я также видел более ранние сообщения о поиске обычных пиков с использованием imdilate и/или imextendedmax, но они находят все пики в 2d-матрице, тогда как меня интересуют только импульсные пики. Я уверен, что DSP люди имеют общий рецепт для этого ...

Пожалуйста, помогите,

Благодарности

+0

Определите «импульсный пик». –

+0

Я ищу частоты, в которых абсолютное значение преобразования Фурье принимает значение дельта-функции Дирака на этой частоте (бесконечность). Очевидно, что для ДПФ вы не ожидаете увидеть бесконечность, но главный пик. Проблема заключается в том, как найти эти пики в 2d и как отличить их от нормальных (нижних, не импульсных) пиков. – smichak

ответ

6

Что вы хотите сделать, это найти пики с высоким контрастом. Таким образом, вам нужен способ определения локальных максимумов, а также способ измерения разницы между пиком и окружающими значениями. Порог по этой разнице будет определять импульсные пики для вас.

Предполагая, что входной сигнал называется 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 является логическим массивом с 1 везде, где есть хороший пик. Вы можете использовать его для чтения пиковых высот от сигнала с помощью signal(peaks) и найти координаты с помощью find(peaks).

+0

ОК - это начало ... но как выбрать порог? Я предполагаю, что он должен зависеть от входного сигнала. Есть ли хороший метод/эмпирическое правило для его выбора? – smichak

+0

Это пики Дирака, поэтому порог бесконечности: P. Шутя в сторону, нет единственного лучшего способа выбора порога. Вы можете попытаться запустить 'graythresh' на' signal-dilSignal', если есть два четких пика, один для сигнала и один для шума. Вы также можете установить порог как 3 стандартных стандартных отклонения (медианное абсолютное отклонение) сигнала. Возможно, вы даже можете принять решение о фиксированном значении, если все ваши данные очень согласованы, а высота пика имеет легко идентифицируемый смысл. – Jonas

+0

ОК - это звучит многообещающе ... Я пойду с этим. – smichak

0

Алгоритм findpeaks() довольно тривиально; если элемент больше, чем его соседи, то это пик. Написание двумерной версии этого файла должно быть довольно простым.

2

This paper I wrote содержит исходный код Matlab для быстрого локального обнаружения пиков в 2D. Он работает аналогично imregionalmax() в Mathworks Image Processing Toolbox, но позволяет указать локальный радиус окрестности: больший радиус -> разреженные пики.

Поскольку вы ожидаете редких импульсов, функция nonmaxsupp_scanline() подходит вам.

Смежные вопросы