我有一个强度图像,类似于下图。我想非常快地将这张图片分割成单独的峰。每个峰都被标记和分段。下面用黑线给出了 3 个 blob 的概念分割。
峰段的定义是:刚好穿过该峰与相邻峰之间的最高鞍点的轮廓。
这必须是一个经过充分研究的问题,但我无法弄清楚。我一直在研究 Matlab 函数:
所有这些都很接近....编写一个算法来执行此操作(见下文)并不难,使用 imreconstruct 对最高峰进行操作,分割出第一个峰,然后重复。下面的算法在峰值数量上是 O(N)。这样的算法可以而且应该是 O(1) 的峰值数量(这对我的应用很重要。)

上图是在matlab中用命令渲染的
imagesc(peaks)
这是一个执行分割的算法:
a = peaks;
peakValsX = [21, 25, 35];
peakValsY = [20, 38, 25];
N = numel(peakValsX);
clear('peakImgs', 'peakMask');
for ix = 1 : N;
aptImg = zeros(size(a));
aptImg(peakValsY(ix), peakValsX(ix)) = a(peakValsY(ix),peakValsX(ix));
peakImgs(:,:,ix) = imreconstruct(aptImg,a);
% All we've done is eliminated the other peaks.
assert(all(reshape(peakImgs(:,:,ix) <= a,[],1)));
end
for ix = 1 : N
peakMask(:,:,ix) = ix*(max(peakImgs(:,:,setdiff(1:N, ix)),[],3) < a);
end
peakMaskResult = max(peakMask,[],3);
imagesc(peakMaskResult);
以及由此产生的分割:

重申。问题是,“是否有可以在 O(1) 的峰数中执行的峰分割算法(如上所述)的 matlab 实现?”
