【问题标题】:Assigning values in neighborhood of local maxima’s to the value of local maxima based on varying window width (non symmetric window width)根据不同的窗口宽度(非对称窗口宽度)将局部最大值附近的值分配给局部最大值的值
【发布时间】:2018-03-06 21:41:43
【问题描述】:

这个问题是我之前问题的扩展,包含一些新问题,所以我想提出一个新问题。希望没事。

https://stackoverflow.com/questions/46054811/changing-the-values-in-the-neighbourhood-of-local-maxima-to-the-local-maxima/46055833#46055833

查询:

  • 我在哪里找到局部最大值。我想制作一个窗口并根据窗口大小将值分配给邻居局部最大值的值。

  • 问题:(我希望我的窗口大小像我的原始信号一样改变,我在局部最大值附近有不同的行为。)例如,在第 8 个窗口中,局部最大值位于第 34 个位置,但我已经分配了左侧的值第 34 个位置的局部最大值的值。

  • 简而言之,我希望拥有可变且可控的窗口宽度。

请查看附图以了解我想要的输出。

我希望它能提供一些好主意。

我希望在每个局部最大窗口宽度上都有不同且非对称的手段。

我还附上了一个 nlfilter 的代码,它正在做我想做的事情,这意味着它会创建窗口并将值分配给该窗口宽度内的局部最大值,但我需要具有灵活和可变的窗口宽度。

是否可以有不同的窗口宽度或者有其他方法可以做到这一点。

enter image description here

代码:

  t = 1:35 ; 
  Y = [1 3  13  6  2 7 5 4 2 4 1 0 1 2 3 5 0 0 1 0 0 2 3 6 7 0 0 8 0 1 1 2 3 4 2];

  n = 2;

  [p l] = findpeaks(Y);

  locations = zeros(size(Y));
  locations(l) = true;
  locations = conv(locations, ones(1, 2*n+1), 'same') > 0;

  X = -inf(size(Y)); % create temporary
  X(l) = Y(l); % copy the local maxima

  X = nlfilter(X, [1 2*n+1 ], @(x) max(x)); %replace all values with it local maxima
  X(l) = Y(l); % ensure local maxima are not changed
  Y(locations) = X(locations); % copy filtered temporary to output

  figure(1)
  hold on 
  plot(t,Y,'r')

  t = 1:35 ; 
  Y = [1 3  13  6  2 7 5 4 2 4 1 0 1 2 3 5 0 0 1 0 0 2 3 6 7 0 0 8 0 1 1 2 3 4 2];
  plot(t,Y,'b')

  hold off

感谢您的宝贵回复。

进一步说明:

请看所附图片。

第二张图片是原始信号的一部分,局部最大值被称为绿点。

在第一张图片中,红线显示了我想要分配局部最大值的区域。绿点是局部最大值。所以你会看到,如果我应用固定宽度的窗口,它将不起作用,因为局部最大值之前的点小于局部最大值之后的点。

在示例中将 1 放在外面的原因是相同的,与局部最大值之后相比,在局部最大值之前我想要平坦的点很少。 与最后一个窗口 8 等其他窗口的情况相同,我在第 34 个位置有局部最大值,但为什么我在它之前选择大值只是因为我想分配局部最大值的值。

【问题讨论】:

  • 如果有些机构有一些建议,请提及.. 可能对我接近结果有帮助。
  • 根据您附加的示例,如果您逐个窗口解释如何从输入中获取输出,将会很有用。
  • 非常感谢 rahnema 的回复。实际上我想应用不同的窗口,这个概念类似于我会找到局部最大值的地方,我将应用窗口并将信号平坦化在该窗口宽度内,但问题现在是不同的窗口宽度。我会说实话,我也不知道如何达到输出,所以我提出了查询,所以如果你有一些好的建议,请与我分享。它会解决我的问题。
  • 请解释你是如何产生输出的。我想说的是,您是如何在数字周围绘制矩形的。
  • 这是我想要的输出。 P = 13 7 4 5 1 7 8 4 L = 3 6 10 16 19 25 28 34 示例(13 在位置 3 所以从位置 3 最大位置我希望我的窗口向左延伸 1 个位置,向右延伸 2 个点局部最大值的意思是从位置 3 窗口应该从位置 2 3 4 5 扩展。对于第二个窗口,我的最大值在位置 6,所以我想要宽度为 1 的窗口在这里意味着只有 1 个位置朝向局部最大值的右侧和左侧。对于窗口 8我的本地最大值位置是 34,但我应用了从位置 30 到位置 35 的窗口。

标签: matlab image-processing machine-learning max signal-processing


【解决方案1】:

你可以定义一个标准,从一个峰值开始,到两边我们计算峰值邻居的方差,我们增加邻域的半径,直到相邻元素的方差大于预定义的 阈值。

这里idx_peaks 是峰值的位置,peaks 是峰值的值。应用阈值后,您可以获得每个峰值 n_before 和 n_after 的位置前后的元素数量。然后你可以find indices of neighborhood 给他们赋值。

Y = [1 3  13  6  2 7 5 4 2 4 1 0 1 2 3 5 0 0 1 0 0 2 3 6 7 0 0 8 0 1 1 2 3 4 2];
idx_peaks = [3 6 10 16 19 25 28 34];
peaks = [13 7 4 5 1 7 8 4];
threshold = 2;
cumvar = @(a)cumsum(a(:).^2)./(1:numel(a)).'-(cumsum(a(:))./(1:numel(a)).').^2;
categ = zeros(numel(Y),1);
categ(idx_peaks)=1;
forward_categ = cumsum(categ(idx_peaks(1):end));
n_after = accumarray(forward_categ,Y(idx_peaks(1):end),[],@(x)sum(cumvar(x)<threshold)-1).';
backward_categ = cumsum(flipud(categ(1:idx_peaks(end))));
n_before = flipud(accumarray(backward_categ,fliplr(Y(1:idx_peaks(end))),[],@(x)sum(cumvar(x)<threshold)-1)).';

lo = idx_peaks-n_before;
up = idx_peaks+n_after;
val = repelem(peaks,up-lo+1);
index=cumsum(accumarray(cumsum([1;up(:)-lo(:)+1]),[lo(:);0]-[0;up(:)]-1)+1);
index= index(1:end-1);
Y(index) = val

这是将阈值设置为 2 时的结果:

Y=
[1 3 13 6 2 7 4 4 4 4 4 4 1 5 5 5 1 1 1 1 1 1 1 7 7 0 0 8 4 4 4 4 4 4 4]

【讨论】:

  • 非常感谢 rahnema 1 抽出宝贵的时间和善意的姿态。给我一些时间来玩代码,然后会回复你的请求。再次感谢..
  • 非常感谢 Rahnema 1。这是我想要做的完美代码和概念,但问题是在我的原始数据中我有 1*2173 个位置和峰值,而且我的原始数据大小是 1*1600000。因此,很难将 n before 和 n after 放置在手动之前和之后的均值,所以有什么方法可以自动而不是手动完成。
  • 瑞尼玛 1 。我知道,但我在这里放了一个例子,以便其他人容易理解。我想完全按照您所做的那样做这件事,但是对于大型数据集,为此我在前后放置值时遇到了一些困难。很抱歉,因为我没有将整个数据集放在这里。如果你有一些适用于大型数据集的逻辑,那将是一件好事,这将是一个很好的姿态,它对我有用,因为我提到我的尝试没有朝着正确的方向工作。提前非常感谢。
  • 实际上我想在局部最大值附近制作一个窗口,但我希望窗口的宽度是可控的,因为在我的真实数据中,局部最大值附近的信号行为并不相似,因此可以通过使用改变最大值周围的宽度,所以我想通过观察信号来改变它的局部最大值我将能够做到这一点。
  • 我无法得到你想要的,除了你解释了你是如何围绕数字绘制矩形的。请解释为什么数组[1] 的第一个元素在第一个窗口之外。此外,您应该对数组的所有元素进行推理。请在问题中添加您的解释。
猜你喜欢
  • 2020-06-21
  • 2017-01-09
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多