2017-03-06 78 views
2

我有下面的图片是胰腺细胞enter image description here如何使用matlab正确地镶嵌细胞图像?

的照片,我想什么做的是能够得到每个细胞(红色长丝)的膜,然后做一个细分,以得到一个想法长丝的长度。 到目前为止,我曾尝试使用MATLAB的网站上给出的例子,但结果是不是真的好...

I = imread('picture.tiff'); 
I_gray = rgb2gray(I); 
[~, threshold] = edge(I_gray, 'sobel'); 
fudgeFactor = .5; 
BWs = edge(I_gray,'sobel', threshold * fudgeFactor); 
se90 = strel('line', 3, 90); 
se0 = strel('line', 3, 0); 
BWsdil = imdilate(BWs, [se90 se0]); 

enter image description here

我一直在寻找了几个小时等方式做到这一点,但没有任何满意的结果...有没有办法做到这一点?也许除matlab之外的其他软件可能更高效。先谢谢您!

+2

几个小时?只* *小时*?所以,你想实现一个研究水平的方法来自动分割细胞,你搜索*小时*?我的意思是,人们有4年的博士学位才​​能正确地做这件事。你的第一步应该是一个图像处理书/课程。 –

+2

长丝似乎很红,如果我是你,我会尝试利用这些信息。 – UJIN

+0

我知道这很复杂,我不会给我个人的情况,但是我正在研究的这个项目是我博士学位(我是物理学家,而不是生物学家)的一个侧面项目部分,我没有太多时间专注于。我试图使用这样一个事实,即灯丝非常红,但它永远不会结束那么好... – Hyppolite

回答

3

我不知道任何关于单元格或镶嵌或其他任何东西。但是如果你想在非统一背景中检测到这些斑点,那么我可能会提供帮助。由于背景不均匀,您需要单独分析这些斑点。您不能只设置一个固定阈值来一次检测所有斑点。首先,您将分别检测每个斑点,然后使用单个阈值。这里是例子

原始图像

im=imread('gxGkH.jpg'); 
figure,imagesc(im);axis image; 

enter image description here

我只选择蓝色,分析

imb=im(:,:,3); 
figure,imagesc(imb);axis image; 

enter image description here

1)模糊化图像,因为模糊的斑点后会有在其中心

sigma=7; 
kernel = fspecial('gaussian',4*sigma+1,sigma); 
im2=imfilter(imb,kernel,'symmetric'); 

figure,imagesc(im2);axis image; 

enter image description here

2)局部 最大值/最小值使用分水岭变换来分隔每个斑区域

% L = watershed(im2); 
L = watershed(max(im2(:))-im2); 
[x,y]=find(L==0); 

绘制边界

figure,imagesc(im2),axis image 
hold on, plot(y,x,'r.') 

enter image description here

3)在这里,我单独分析每个斑,找到一个大津阈值 各一滴,然后我发现了斑点,并结合所有检测

tmp=zeros(size(imb)); 

for i=1:max(L(:)) 
    ind=find(L==i); 
    mask=L==i; 
    [thr,metric] =multithresh(imb(ind),1); 
    if metric>0.7 
    tmp(ind)=imb(ind)>thr; 
    end 
end 

删除一些噪音

tmp=imopen(tmp,strel('disk',1)); 
figure,imagesc(tmp),axis image 

enter image description here

如果背景具有较高的对比度,那么斑点,那么你将不需要在分水岭变换中反转图像。

2

我不确定这是否会让你更接近问题的解决方案,但是我会做的就是这样。你要知道,这是一个非常简单和原始的方法:

image = imread('picture.tiff'); % load image 
image = rgb2hsv(image); % convert to hsv colorspace 
image = image(:,:,1); % take the hue channel 

binary_im = imbinarize(image); % make binary image 

二进制图像看起来应该是这样:

enter image description here

现在你可以使用数学形态学的噪音消除。首先创建一个结构化元素,然后你用二进制图像卷积它:

现在
str_el = strel('disk', 5, 0); % create a round, 5px radius, str_el 
closed_im = imclose(binary_im, str_el); % close image with str_el 

你的新形象应该是这样的:

enter image description here

在这一点上,你可以用另一种形态操作该发现骨架:

skeleton = bwmorph(closed_im, 'skel', Inf); % Find skeleton image 

的骨干图像应该是这样的:

enter image description here

当然,这种方法是远远准确,但可以给你长丝长度的整体信息,特别是如果你能摆脱最终的噪声(骨架的附录)。

+0

这确实不准确,但因为我可以重复处理大量图像,所以可能就足够了。我会努力的!非常感谢你 ! – Hyppolite