去除精子细胞尾部的污渍
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) 我使用了最简单的重建方法,假设尾巴宽度相等。我可以通过对原始图片进行更多测量来改善这一点。
我正在尝试获取边缘应该光滑的精子细胞的边界。然而,尾巴上有小斑点。我想知道有什么方法可以去除它们,并得到一个边界光滑的精子吗?附上图和我执行的一些代码(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) 我使用了最简单的重建方法,假设尾巴宽度相等。我可以通过对原始图片进行更多测量来改善这一点。