【问题标题】:Find peak (regions) in 2D data在 2D 数据中查找峰值(区域)
【发布时间】:2017-05-10 03:26:21
【问题描述】:

我希望在 2D 数据中找到 峰值区域(如果您愿意,可以通过 Hough 变换创建灰度图像或 2D 风景)。 峰值区域我的意思是局部最大峰值,但不是一个点,而是周围的一部分贡献区域。我知道,这是一个模糊的定义,但也许 mountain 这个词或下面的图片会让你直观地理解我的意思。

标记为红色 (1-4) 的峰是我想要的,粉红色 (5-6) 的峰是“灰色区域”的示例,如果没有找到那些较小的峰也可以,但也可以如果是的话。

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

左图input image - - - - 中:(okaish)result - - - - :结果叠加在图像上。

上面的结果是使用简单的阈值(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),但我可以使用任何代码或伪代码。

为了与this question 区分开来,我的最大值没有用零值分隔。我想要的是类似的,但没有任何建议有帮助(爬山/模拟退火只会给你一分......)。

This question 也很有趣,但它解决了限制问题(假设恰好有 5 个特定大小的峰),这使得建议的方法对我的情况没有用处。

【问题讨论】:

  • 效率不高,但您可以通过一些步骤选择高度 1 到 0,例如0.1,然后为每个高度计算峰数。如果在第一次保存它的高度时遇到一个新峰,如果 2 个峰连接,那么它们要么是两个峰(都足够高,在中间高度占据面积),要么是一个峰(只有一个足够高,融合并继续)或一个潜在的山峰(它们都还不够高,融合山峰并继续,将更高的点作为新的山顶进行“独立山高”计算)。
  • H-minima 变换通常与分水岭一起使用。它删除了比参数 h 更“深度”的局部最小值。有一些等效算法可以消除与小于某个值的体积相关的最小值。我想这就是你要找的。​​span>
  • @maraca:你启发了我基于这个想法开发一个变体。我认为这导致了一种改进的分水岭算法:从上到下的阈值(如填充反向景观)并标记新发现的峰(如反向盆地)。平原流域不会合并山峰(盆地),因此合并是细化。您建议使用“区域中间高度”作为合并标准。将 h-minima 过滤器应用于分水岭输入就像改变步长或使用“最小高度”合并标准。我正在考虑使用组合的合并条件,但无法很快实现。
  • @CrisLuengo:你知道关于那些去除小体积最小值的算法的实现/论文吗?到目前为止我什么也没找到。我尝试过的 H-minima 方法(结果可以在上面看到),但是如果同时存在高峰值和低峰值,它就不够灵活(太高 h 参数会掩盖峰值,太低仍然会导致过度分割如上所示)。
  • 我在很多地方都看到过这个,例如这里:arxiv.org/pdf/1202.0216.pdf。但我不知道任何实现。

标签: algorithm matlab image-processing detection watershed


【解决方案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

【讨论】:

  • 哇,谢谢,这实际上很好地概括了我拥有的大多数其他示例。我之前使用过一些形态过滤器,但我的曲目中没有tophat-filterextended-maxima-filters
猜你喜欢
  • 2011-05-13
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 2023-02-17
  • 2014-05-15
  • 1970-01-01
相关资源
最近更新 更多