首页 文章

如何防止分水岭算法中封闭背景区域的不准确分割?

提问于
浏览
2

我正在使用分水岭算法来分割暗背景上的亮点 . 下面提供了代码,以及它生成的一些图像 .

在第二张图片中,我用红色标记了封闭背景的区域,这些区域被分割为“细胞”(它们不是生物细胞,只是使用了这个词) - 这是不正确的,它们是背景的一部分,只是被'细胞'所包围 . 我发现这会产生一个错误的最小值,有关如何防止这种情况的任何帮助?

% Improve contrast, binarize
RFP_adjust = imadjust(RFP_blur, stretchlim(RFP_blur, 0.001));
figure, imshow(RFP_adjust), title('Contrast adjust');
RFP_binarized = imbinarize(RFP_adjust);
RFP_perimeters = bwperim(RFP_binarized);
% figure, imshow(RFP_binarized), title('Otsu thresholding');

    %2B - SEGMENTATION BY WATERSHED METHOD
    % Discover putative cell centroids and process
RFP_maxs = imextendedmax(RFP_adjust,  3000);
RFP_maxs = imclose(RFP_maxs, strel('disk',5));
RFP_maxs = imfill(RFP_maxs, 'holes');
RFP_maxs = bwareaopen(RFP_maxs, 5);
RFP_max_overlay = imoverlay(RFP_adjust, RFP_perimeters | RFP_maxs, [1 .3 .3]);
figure, imshow(RFP_max_overlay), title('Maxima');

    % Obtain complement - maxima become low-points (required for watershed)
RFP_comp = imcomplement(RFP_adjust);
RFP_imposemin = imimposemin(RFP_comp, ~RFP_binarized | RFP_maxs);
figure, imshow(RFP_imposemin), title('Inverted Maxima');

    % Apply watershed
RFP_watershed = watershed(RFP_imposemin);
mask = im2bw(RFP_watershed, 1);
overlay3 = imoverlay(RFP_adjust, mask, [1 .3 .3]);
figure, imshow(overlay3), title('Segmented cells');

    % Segment
RFP_cc = bwconncomp(RFP_watershed);
RFP_label_matrix = labelmatrix(RFP_cc);
whos labeled;
RFP_label = label2rgb(RFP_label_matrix, @spring, 'c', 'shuffle');
figure, imshow(RFP_label), title('Cells segmented');

图像0 - Headers 为'Maxima'的图像的结果(即调整后的原始图像,其中最大值和轮廓重叠) .
enter image description here

图1 - Headers 为'inverted maxima'
Result for image titled 'Inverted Maxima'
的图像结果

图片2 - Headers 为'Cells segmented'
enter image description here
的图片的结果

2 回答

  • 0

    我建议像_412833中所做的那样:使用背景蒙版将这些像素设置为 Inf ,执行分水岭操作,然后将结果中的背景像素设置为0.我相信您可以更改代码的分水岭部分所以要做到这一点:

    % Apply watershed
    RFP_watershed = RFP_imposemin;             % Added
    RFP_watershed(~RFP_binarized) = Inf;       % Added
    RFP_watershed = watershed(RFP_watershed);  % Modified
    RFP_watershed(~RFP_binarized) = 0;         % Added
    mask = im2bw(RFP_watershed, 1);
    overlay3 = imoverlay(RFP_adjust, mask, [1 .3 .3]);
    figure, imshow(overlay3), title('Segmented cells');
    
  • 1

    没有灵丹妙药,但你可以尝试一些事情 .

    一种是用非常大的圆盘过滤图像,创建看起来像背景的模糊图像 . 然后从原始图像中减去它 . 这将倾向于迫使实际背景为零 .

    另一个是Otsu阈值将前景与背景分开 . 这会创建一个二进制图像 . 然后使用设计为看起来像实际细胞的面具进行形态学打开操作 .

相关问题