首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止分水岭算法中封闭背景区域的不准确分割?

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

Stack Overflow用户
提问于 2017-05-22 18:26:39
回答 2查看 404关注 0票数 2

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

在第二张图片中,我用红色的十字标记了封闭的背景区域,这些区域被分割成“细胞”(它们不是生物细胞,只是使用单词)--这是不正确的,它们是背景的一部分,只是被‘cell’所包围。我看到这造成了一个错误的最小值,有什么帮助来防止这个吗?

代码语言:javascript
复制
    % 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-结果的图像标题为‘极大值’(即调整的原始图像与最大值和轮廓覆盖)。

图像1-图像标题为“倒排最大值”的结果

图像2-图像标题为“单元分割”的结果

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-22 19:27:44

我建议类似于在 function中所做的事情:使用背景掩码将这些像素设置为Inf,执行分水岭操作,然后将结果中的背景像素设置为0。我相信您可以像这样更改代码的分水岭部分,以实现以下目标:

代码语言:javascript
复制
% 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
EN

Stack Overflow用户

发布于 2017-05-22 19:20:35

没有魔法子弹,只有一些你可以尝试的东西。

一种是用一个很大的圆形圆盘过滤图像,创建一个看起来像背景的模糊图像。然后从原始图像中减去它。这往往会迫使实际背景为零。

另一种是Otsu阈值,将前景和背景分开。它创建了一个二进制图像。然后,使用设计成像实际细胞的掩膜进行形态学开放操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44119709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档