Matlab:强制分水岭分割成特定数量的段

Matlab: Force watershed to segment into a specific number of segments

为了避免Matlab中的分水岭算法过度分割,我想强制算法分割成特定数量的段(在这个例子中,算法自动分割成4个,我喜欢它细分为 2)。是否有通用的方法来定义允许的输出段数?

我目前使用的代码:

% Load the image
grayscaleImg = imread('https://i.stack.imgur.com/KyatF.png');
white_in_current_bits = 65535;

% Display the original image
figure;
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
hold on;
imshow(grayscaleImg);
title('The origianl image');

% Binarize the image.
binaryImageElement = grayscaleImg < white_in_current_bits;

% Calculate the distance transform
D = -bwdist(~binaryImageElement);

% Find the regional minima of the distance matrix:
mask = imextendedmin(D,2);

%Display the mask on top of the binary image:
figure;
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
imshowpair(binaryImageElement,mask,'blend');
title('Blend of binary image and the regional minima mask');

%Impose the regional minima on the distance transform:
D2 = imimposemin(D,mask);

%Watershed the distance transform after imposing the regional minima:
Ld2 = watershed(D2);

%Display the binary image with the watershed segmentation lines:
bw3 = binaryImageElement;
bw3(Ld2 == 0) = 0;
figure;
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
imshow(bw3);
title('Binary image after watershedding');

没有直接的方法来指定分水岭将产生的区域数量。流域将始终根据局部最小值生成一个区域。但是您可以修改图像以减少局部最小值的数量。一种方法是 H-minima transform。此函数删除深度低于阈值的所有局部最小值。

我们的想法是迭代(这可能不会很快...)超过阈值,直到您获得所需的区域数量。

% iterate over h, starting at 0
tmp = imhmin(D2,h);
Ld2 = watershed(tmp);
% count regions in Ld2, increase h and repeat

我刚刚注意到您在 D2 中施加了最小值。您使用 imextendedmin 确定这些最小值。这意味着您应用 H 最小值,找到最终的局部最小值,然后再次施加这些值。你不妨跳过这一步,直接应用H最小值变换。