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

问题描述:

我正在使用分水岭算法来分割深色背景上的亮点。代码在下面提供,以及它生成的一些图像。如何防止分水岭算法中封闭背景区域的不准确分割?

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

% 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​​ - “Maxima”图像的结果(即调整后的原始图像的最大值和轮廓被覆盖)。 enter image description here

图像1 - 结果用于图像标题为“倒置最大值” Result for image titled 'Inverted Maxima'

图像2 - 结果为标题为“细胞分段” enter image description here

+0

没有你的原始起始图像看起来很难,但有什么办法可以确定什么像素被定义为背景?之后您可以将其作为掩码在执行分水岭操作时忽略这些区域。 – gnovice

+0

@gnovice,添加了原始图片(图片0)。我使用了这个链接中描述的方法: “我们需要修改我们的图像,使得单元格边界具有最高强度,并且背景清晰标记(我们标记为负无穷大)。通过首先找到应该近似对应于细胞核的最大值,然后我们转换图像,使得背景像素和这些最大值是图像中唯一的局部最小值:“ http://blog.pedro.si/2014 /04/basic-cell-segmentation-in-matlab.html – Sovm

我会建议像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'); 
+0

谢谢!代码起作用,我理解意图/逻辑,语法有点不熟悉,但我可以弄清楚。 – Sovm

+0

后续问题 - 什么是'RFP_watershed(〜RFP_binarized)= Inf; “在做什么?在控制台中添加'RFP_watershed(〜RFP_binarized)'会创建一个长的列矩阵... – Sovm

+1

@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

有没有魔术子弹图像,但几件事情你可以试试。

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

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

+0

恐怕答案的第一部分不起作用。问题不在于背景与前景之间的对比度不足,而是当您使用分水岭并创建倒数最大值时,程序似乎没有办法区分倒数最大值('最小值')和低背景值。第二点 - 没有办法告诉'细胞'是什么样子 - 它们是不规则的团块,而不是生物细胞。 – Sovm