Найдите пик (области) в 2D-данных

Я ищу области пиков в 2D-данных (если хотите, в изображениях в оттенках серого или в 2D-ландшафтах, созданных с помощью преобразования Хафа). Под областью пика я подразумеваю локально максимальный пик, но НЕ отдельную точку, а часть окружающего < strong> содействующий регион, связанный с ним. Я знаю, это расплывчатое определение, но, возможно, слово гора или изображения ниже дадут вам интуитивное представление о том, что я имею в виду.

Пики, отмеченные красным (1-4), - это то, что я хочу, а пики розовым (5-6) - примеры «серой зоны», где было бы хорошо, если эти более мелкие пики не обнаружены, но также хорошо, если они есть. .

«Оптимальный

Изображения содержат от 1 до 20 остроконечных областей разной высоты. 2D данные для вышеуказанного графика прибоя показаны ниже с возможным результатом (оранжевый соответствует пику 1, зеленый соответствует пику 2 a / b, ...). Одиночные изображения для тестов можно найти по ссылкам описания:

Изображение слева: входное изображение - - - - средний: (окаиш) результат - - - - справа < / em>: результат накладывается на изображение.

ввод, результат и результат наложения

Результат выше был получен с использованием простого порогового значения (код MATLAB):

% thresh_scale = 15;                     % parameter: how many thresholding steps 
% thresh_perc = 6;                       % parameter: threshold at which we clip
thresh = multithresh(H,thresh_scale);    
q_image = imquantize(H, thresh);         

q_image(q_image <= thresh_perc) = 0;     % regions under threshold are thrown away
q_image(q_image > thresh_perc) = 1;      % ... while all others are preserved
q_image = imbinarize(q_image);           % binarize for further processing
B = bwareaopen(q_image, nhood_minsize);  % Filter really small regions
[L, L_num] = bwlabel(B); % <- result     % Label connected components

Некоторые значения, подобные этим (15 и 6), часто работают нормально, если есть несколько похожих пиков, но это не согласуется, если пиков больше или они сильно различаются. В основном у меня две проблемы, которые также нельзя исправить простой настройкой параметров:

  • более высокие пики могут маскировать более низкие (но четко различимые) пики. Поскольку порог относится к самому высокому пику, другие пики могут упасть ниже.
  • в некоторых случаях впадина между двумя пиками находится выше порога, объединяя несколько пиков в один (как это можно наблюдать с пиком 2 a / b).

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

Каким-то образом я представил, что заполнение негатива ландшафта определенным количеством воды даст мне области, которые я ищу: бассейны, которые заполняются и расширяются в зависимости от формы окружающих областей. Я как будто проливаю воду на изображение ниже, и в результате получаются лужи с водой, которые я ищу.

негативное изображение (дополнение), готово влить в него воду

Я думал, что это то, что делают алгоритмы затопления или водораздела, но затопление кажется чем-то совершенно другим, и результаты водораздела совсем не то, что я имел в виду, также при применении некоторой предварительной обработки, которая, как я думал, может помочь (обрезано на 1/10) :

водораздел перерезан порогом 1/10

Или при использовании того же порога отсечения, что и в приведенном выше примере (обрезано на 6/15):

водораздел перерезан порогом 6/15

Производится с помощью этого кода (MATLAB):

thresh = multithresh(H, 10);    % set to either 10 || 15 for the examples
q_image = imquantize(H, thresh);
mask = false(size(q_image));    % create clipping mask...
mask(q_image > 1) = true;       % ... to remove lowest 10% || lowest 6/15
                                % show with: figure, imshow(mask);

% OPTIONAL: Gaussian smoothing
H = imgaussfilt(H, 2);  % apply before adding Inf values
% OPTIONAL: H-minima transform
H = imhmin(H, 10);      % parameter is threshold for suppressing shallow minima
H = -H;                 % Complement the image
H(~mask) = Inf;         % force "ground" pixels to Inf

L = watershed(D);    
L(~mask) = 0;                               % clip "ground" from result
imshow(label2rgb(L,'lines',[.5 .5 .5]));    % show result

Мой вопрос сейчас: Есть ли алгоритм, который заполняет ландшафт и дает мне результирующие водяные бассейны (для разного количества налитой воды), чтобы делать то, что я пробовал для достижения с помощью вышеуказанных методов? Или любое другое предложение приветствуется. Я реализую MATLAB (или, если нужно, Python), но могу работать с любым кодом или псевдокодом.

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

Этот вопрос тоже интересен, но он решает проблему с ограничениями (предположим, что именно 5 пиков определенного размера), что делает предлагаемые подходы непригодными для моего случая.


person Honeybear    schedule 08.05.2017    source источник
comment
Это не очень эффективно, но вы можете выбрать высоту от 1 до 0 с некоторым шагом, например 0,1, затем для каждой высоты рассчитываете количество вершин. Если новый пик встречается в первый раз, когда вы сохраняете его высоту, если соединяются 2 пика, то это либо два пика (оба достаточно высокие, занимают площадь на средней высоте), либо один пик (достаточно высокий только один, объединить и продолжить) или один потенциальный пик (ни один из них еще не достаточно высокий, объедините пики и продолжайте, принимая более высокую точку в качестве новой вершины горы для расчета высоты отдельно стоящей горы).   -  person maraca    schedule 09.05.2017
comment
Преобразование H-минимумов часто используется вместе с водоразделом. Он удаляет локальные минимумы с меньшей глубиной, чем параметр h. Существуют эквивалентные алгоритмы, которые удаляют минимумы, связанные с объемами меньше определенного значения. Я думаю, это то, что вы ищете.   -  person Cris Luengo    schedule 09.05.2017
comment
@maraca: Вы вдохновили меня на работу над вариантом, основанным на этой идее. Я думаю, что это приводит к усовершенствованному алгоритму водораздела: порог сверху вниз (например, заполнение обратного ландшафта) и маркировка вновь обнаруженных пиков (например, обратных бассейнов). Равнина водораздела не объединяет пики (бассейны), поэтому слияние - это уточнение. Вы предлагаете использовать среднюю высоту области в качестве критерия объединения. Применение фильтра h-минимума к входу водораздела было бы похоже на изменение размера шага или использование критериев слияния минимальной высоты. Я думаю об использовании комбинированных критериев слияния, но не смогу реализовать это в ближайшее время.   -  person Honeybear    schedule 09.05.2017
comment
@CrisLuengo: Знаете ли вы реализации / документы, касающиеся тех алгоритмов, которые удаляют минимумы с небольшими объемами? Пока ничего не нашел. Подход H-минимума, который я пробовал (результаты можно увидеть выше), но он недостаточно гибкий, если присутствуют как высокие, так и низкие пики (слишком высокий параметр h замаскирует пики, слишком низкий все равно приведет к чрезмерной сегментации, как видно выше).   -  person Honeybear    schedule 09.05.2017


Ответы (1)


В таких задачах поиска пиков я в основном использую морфологические операции. Так как результаты преобразования Хафа в основном зашумлены, я предпочитаю сначала размыть его, а затем применить преобразование «верхняя шляпа» и преобразование расширенных максимумов. Затем для каждого локального максимума найдите область вокруг него с адаптивным пороговым значением. Вот пример кода:

im=imread('udIuy.png');

% blur
im=imgaussfilt(im,1);

% tophat transform
im2=imtophat(im,strel('disk',5));

% extended maximums
im3=imextendedmax(im2,10);

% Extract each blob
s=regionprops(im3,'Centroid','PixelIdxList');

figure,imagesc(im),axis image

for i=1:numel(s)
    x=ceil(s(i).Centroid);
    tmp=im*0;
    tmp(s(i).PixelIdxList)=1;
    tmp2=tmp.*im2;

% The maximum amplitude and location

    [refV,b]=max(tmp2(:));
    [x2,y2]=ind2sub(size(im),b);

% select the region around local max amplitude    
    tmp=bwselect(im2>refV*0.6,y2,x2,4);  

    [xi,yi]=find(tmp);
    hold on, plot(yi,xi,'r.')
    hold on, text(y2+10,x2,num2str(i),'Color','white','FontSize',16)    
end

введите описание изображения здесь

person Ozcan    schedule 09.05.2017
comment
Вау, спасибо, это на самом деле довольно хорошо обобщается на большинство других примеров, которые у меня есть. Раньше я работал с некоторыми морфологическими фильтрами, но у меня не было tophat- filter и extended-maxima-filters в моем репертуаре . - person Honeybear; 10.05.2017