Я ищу области пиков в 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) :
Или при использовании того же порога отсечения, что и в приведенном выше примере (обрезано на 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 пиков определенного размера), что делает предлагаемые подходы непригодными для моего случая.
h
замаскирует пики, слишком низкий все равно приведет к чрезмерной сегментации, как видно выше). - person Honeybear   schedule 09.05.2017