我试图获得一个精子细胞的边界,该细胞的边缘应该是光滑的。但是,尾巴上有小斑点。我想知道是否有什么方法可以去除它们,并获得光滑的边界精子?附上图和我执行的一些代码(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)
我将得到一个数字:
我可以将数字提高到以下吗?
答案 0 :(得分:2)
主要问题是噪声的质量很大。为了消除这种质量,我使用了骨架图像:
BW = bwmorph(BW,'skel',inf);
这将为您提供树状结构的精子细胞,而现在的主干是该树中最长的连接路径。为了找到这个,我使用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');
现在我们只需要在此骨架周围重建精子细胞,就可以使用形态学开放性轻松找到头部
head = imopen(BW1,strel('disk',10,0));
通过扩张骨架发现尾巴
%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)通过假设尾巴的宽度相等,我使用了最简单的重建方法。如果我对原始图片进行更多的测量,则可以改善这一点。