I have an intensity image, similar to the image below. I would like to very quickly, segment this image, into separate peaks. Where each peak is labelled, and segmented. A notional segmentation of 3 blobs is given below by the black lines.
Definition of a peak segment is: The contour that just crosses the highest saddle point between this peak and an adjacent peak.
This has to be a well studied problem, but I can't figure it out. I have been looking at the Matlab functions:
all of which are close.... It is not hard to write an algorithm to do this (see below) using imreconstruct to operate on the tallest peak, segment out the first peak, and repeat. The algorithm below is O(N) in number of peaks. Such an algorithm can and should be O(1) in number of peaks (and this is important for my application.)
The above image was rendered in matlab with the command
Here is an algorithm that performs the segmentation:
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);
And the resulting segmentation:
To Reiterate. The question is, "Is there a matlab implementation of the peak segmentation algorithm (as described above) that can be executed in O(1) of number of peaks?"