在2D数据中查找峰(区域)

Hon*_*ear 8 algorithm matlab image-processing detection watershed

我希望在2D数据中找到峰值区域(如果你愿意,可以通过Hough变换创建灰度图像或2D景观).由峰区域我指的是本地最大峰值,但不是一个单一的点,但周围的一部分贡献区域与它去.我知道,这是一个模糊的定义,但也许或下面的图像会让你直截了当地说出我的意思.

标记为红色(1-4)的峰是我想要的,粉红色(5-6)示例中的"灰色区域",如果没有找到那些较小的峰值,如果它们是.

3D中的最佳结果

图像包含1-20个峰值区域,高度不同.上面的冲浪图的2D数据如下所示,可能的结果(橙色对应峰值1,绿色对应峰值2 a/b,......).可以在描述链接中找到用于测试的单个图像:

图像左:输入图像 - - - - 中:( okaish)结果 - - - - :结果覆盖在图像上.

输入,结果和重叠结果

上面的结果是使用简单的阈值(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
Run Code Online (Sandbox Code Playgroud)

像这些(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
Run Code Online (Sandbox Code Playgroud)

我现在的问题是: 是否有一种算法可以填充景观并给我生成的水池(用于灌注各种水量)来做我用上述方法尝试实现的目标?或者欢迎任何其他建议.我正在实现MATLAB(或者如果需要Python),但我可以使用任何代码或pseude-code.

为了将此问题此问题区分开来,我的最大值不会被零值分隔.我想要的是类似的,但没有任何建议有帮助(爬山/模拟退火只会给你一点......).

这个问题也很有意思,但它解决了约束问题(假设恰好有一定大小的5个峰值),这使得建议的方法对我的情况没有用.

Ozc*_*can 5

在这种找峰问题中,我主要使用形态学运算。由于霍夫变换结果大部分都是嘈杂的,我更喜欢先模糊它,然后应用高顶帽和扩展极大值变换。然后,对于每个局部最大值,使用自适应阈值找到其周围的区域。这是示例代码:

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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述