如何防止分水岭算法中封闭背景区域的不准确分割?
我正在使用分水岭算法来分割深色背景上的亮点。代码在下面提供,以及它生成的一些图像。如何防止分水岭算法中封闭背景区域的不准确分割?
在第二幅图像中,我用红色标记将封闭背景的区域标记为“细胞”(它们不是生物细胞,只是使用单词) - 这是不正确的,它们是部分的背景,只是被'细胞'所包围。我发现这会产生一个错误的最小值,对于如何防止这种情况有帮助?
% 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');
我会建议像the example included for the watershed
function这样做:使用背景蒙版将这些像素设置为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');
谢谢!代码起作用,我理解意图/逻辑,语法有点不熟悉,但我可以弄清楚。 – Sovm
后续问题 - 什么是'RFP_watershed(〜RFP_binarized)= Inf; “在做什么?在控制台中添加'RFP_watershed(〜RFP_binarized)'会创建一个长的列矩阵... – Sovm
@SoumitraBhoyar:由于'RFP_binarized'是一个逻辑矩阵。0和1),您可以使用它执行[逻辑索引](https://www.mathworks.com/help/matlab/math/matrix-indexing.html#bq7egb6-1)。实质上,'〜RFP_binarized'的值都是1,'Inf'的值将放在'RFP_watershed'中的相应位置。 '〜'运算符(“not”运算符)只是翻转'RFP_binarized'中的零和1。 – gnovice
有没有魔术子弹图像,但几件事情你可以试试。
一个是用一个非常大的圆盘过滤图像,创建一个看起来像背景的模糊图像。然后从原始图像中减去它。这往往会迫使实际背景为零。
另一个是大津阈值将前景与背景分开。这会创建一个二进制图像。然后使用设计为看起来像实际细胞的面罩进行形态学开放操作。
恐怕答案的第一部分不起作用。问题不在于背景与前景之间的对比度不足,而是当您使用分水岭并创建倒数最大值时,程序似乎没有办法区分倒数最大值('最小值')和低背景值。第二点 - 没有办法告诉'细胞'是什么样子 - 它们是不规则的团块,而不是生物细胞。 – Sovm
没有你的原始起始图像看起来很难,但有什么办法可以确定什么像素被定义为背景?之后您可以将其作为掩码在执行分水岭操作时忽略这些区域。 – gnovice
@gnovice,添加了原始图片(图片0)。我使用了这个链接中描述的方法: “我们需要修改我们的图像,使得单元格边界具有最高强度,并且背景清晰标记(我们标记为负无穷大)。通过首先找到应该近似对应于细胞核的最大值,然后我们转换图像,使得背景像素和这些最大值是图像中唯一的局部最小值:“ http://blog.pedro.si/2014 /04/basic-cell-segmentation-in-matlab.html – Sovm