image - 如何使用 matlab 正确地分割细胞图像?

标签 image matlab cells tesselation

我有下面的图片,是胰腺细胞的照片enter image description here

我想做的是能够获得每个细胞的膜(红色细丝),然后进行镶嵌以了解细丝的长度。 到目前为止,我已经尝试使用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 之外的其他软件可能会更有效。提前谢谢您!

最佳答案

我对细胞或镶嵌或其他什么一无所知。但如果你想检测非均匀背景中的那些 Blob ,那么我可能会有所帮助。由于背景不均匀,您需要单独分析 Blob 。您不能仅设置固定阈值来一次检测所有 Blob 。首先,您将单独检测每个 Blob ,然后使用单独的阈值。这是示例

原图

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) 模糊图像,因为模糊后 Blob 将具有局部 最大值/最小值位于其中心

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

figure,imagesc(im2);axis image;

enter image description here

2)使用分水岭变换来分离每个 Blob 区域

% 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) 在这里,我单独分析每个 Blob 并找到一个大津阈值 每个 Blob ,然后我检测 Blob 并合并所有检测

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

如果背景的对比度高于 Blob ,则无需在分水岭变换中反转图像。

关于image - 如何使用 matlab 正确地分割细胞图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42626416/

相关文章:

matlab - 如何在 Matlab 中创建指向矩阵的句柄/指针数组?

matlab - 从win64到win32的pnet通信

arrays - 将整数单元格范围转换为 Excel 单元格范围

IOS:停止在 UITableView 中错误地重用单元格

Java将原始字节编码为图像简单图像格式/文件

matlab - 两个数学上相同的表达式在零附近的精度误差

iOS - 检测到附件 URL,但未针对不同项目显示

android - 如何使用 Intent 将 View 或布局转换为图像并共享?

python - 快速找到大图像中连通分量的最小和最大坐标