matlab中的O(1)峰值分割算法?

信息处理 图像处理 matlab 图像分割 峰值检测
2022-02-20 21:16:32

我有一个强度图像,类似于下图。我想非常快地将这张图片分割成单独的峰。每个峰都被标记和分段。下面用黑线给出了 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 实现?”

1个回答

我不知道你为什么需要imreconstruct多次打电话。这里描述了您通常使用形态重建的方式:您基本上从源图像中减去一些常数(峰值阈值),然后重建它。您得到的是与原始图像相同的图像,除了峰值:

在此处输入图像描述

因此,您只需获取差异并二值化,或按像素比较两个图像。