去除精子细胞尾部的污渍

Getting rid of the stains along the tail of a sperm cell

我正在尝试获取边缘应该光滑的精子细胞的边界。然而,尾巴上有小斑点。我想知道有什么方法可以去除它们,并得到一个边界光滑的精子吗?附上图和我执行的一些代码(MATLAB)。

I = imread('asd3.png');
gray = rgb2gray(I);
I = adapthisteq(gray);
[counts,~] = imhist(I,6);
T = otsuthresh(counts);
BW = imbinarize(I,T);
BW2 = bwareaopen(~BW,300);
imshow(BW)
figure
subplot(221),imshow(original)
subplot(222),imshow(gray)
subplot(223),imshow(BW)
subplot(224),imshow(BW2)

我会得到一个数字:

我可以把图改成下面这样吗?

主要问题是噪声质量很大。为了去除这个质量,我使用了骨架图像:

BW = bwmorph(BW,'skel',inf);

这将为您提供树状结构的精子细胞,backbone 现在是这棵树中最长的连接路径。为了找到这个,我使用了 Brett Schoelson 的函数,你可以找到 here(或者你可以自己制作)。我发现为了使最长线的检测更加稳健,最好先稍微加厚所有内容。因此我们最终得到

I = imread('sperm.png');
BW1 = ~imbinarize(rgb2gray(I)); %Make the spermcell "true"

%Find backbone
BW2 = bwmorph(BW1,'thicken',5);
[BW3,~] = longestConstrainedPath(BW2,'thinOpt','Skel');

现在我们只需要围绕这个backbone重建sperm-cell,使用形态学打开

很容易找到头部
head = imopen(BW1,strel('disk',10,0));

尾部是通过扩大 backbone

找到的
%Thicken backbone
stats = regionprops(BW1-head,'Area');
area = stats.Area;
len = sum(BW3(:));
stem = imdilate(BW3,strel('disk',floor(0.5*area/(2*len)),0));

其中扩张量是原始尾部的粗细,可以近似为尾部面积除以长度。虽然因为神器的缘故,这太厚了,我估计一半是尾巴,另一半是神器。

有了头部和尾部,将它们相加并反转即可得到总单元格。

sperm = ~(stem+head);

这给出了

注意:假设您想要更高的准确性

1) 最长的路径并不完全正确,因为它选择了错误的结尾,这可能可以通过去除毛刺来改善。

2) 我使用了最简单的重建方法,假设尾巴宽度相等。我可以通过对原始图片进行更多测量来改善这一点。