所以有些背景 . 我的任务是编写一个matlab程序来计算可见光显微图像中酵母细胞的数量 . 为此,我认为第一步将是细胞分割 . 在我得到真实的实验图像集之前,我开发了一种算法,使用 watershed 测试图像集 . 看起来像这样:
分水岭的第一步是为细胞生成BW掩模 . 然后我将生成一个bwdist图像,该图像具有从BW蒙版生成的强制局部最小值 . 有了这个,我可以很容易地产生分水岭 .
正如您所看到的,我的算法依赖于成功生成BW掩码 . 因为我需要从中生成bwdist图像和标记 . 最初,我按照以下步骤生成BW掩码:
- 生成图像的局部标准差sdImage = stdfilt(grayImage,ones(9))
- 使用BW阈值生成初始BW掩码binaryImage = sdImage <8;
- 使用imclearborder来清除背景 . 使用其他一些代码在边框上添加单元格 .
Background finished. Here is my problem
但今天我收到了新的真实数据集 . 图像分辨率小得多,光照条件与测试图像集不同 . 颜色深度也小得多 . 这些使我的算法无用 . 就这个:
使用stdfilt无法生成良好的干净图像 . 而是生成这样的东西(注意:我已经调整了stdfilt函数和BW阈值的参数,以下是我能得到的最好结果):
正如您所看到的,细胞中心有一些光像素,不需要比膜更暗 . 哪个引导bw阈值生成这样的东西:
bw阈值处理后的新bw图像具有不完整的膜或分段的细胞中心,并使它们不适合其他步骤 .
我最近才开始进行图像处理,不知道该怎么办 . 如果您有任何想法请帮助我!谢谢!
为了您的方便,我附上了一个来自Dropbox的链接subset of the images
1 回答
我认为你的方法存在根本问题 . 您的算法使用
stdfilt
以便对图像进行二值化 . 但这基本上意味着你假设背景和单元内存在低位"texture" . 这适用于您的第一张图片 . 但是,在第二个图像中,单元格内部存在"texture",因此该假设被破坏 .我认为一个更强的假设是每个单元格周围都有一个“环”(对于你发布的两个图像都有效) . 所以我采取了检测此环的方法 .
所以我的方法基本上是:
检测这些环(我使用'log'过滤器,然后根据正值进行二值化 . 但是,这导致了很多"chatter"
尝试通过过滤非常小和非常大的区域来删除一些"chatter"
现在,填写这些戒指 . 但是,在单元格之间仍然存在一些"chatter"和填充区域
同样,删除小区域和大区域,但由于单元格已填充,请增加可接受范围的边界 .
仍然存在一些不良区域,大多数不良区域将成为细胞之间的区域 . 通过观察区域边界周围的曲率可以检测细胞之间的区域 . 它们很多,在数学上表示为具有负曲率的边界的大部分 . 此外,要移除"chatter"的其余部分,这些区域的边界曲率将具有较大的标准偏差,因此也要删除具有较大标准偏差的边界 .
总的来说,最困难的部分是去除细胞之间的区域和“颤动”而不去除实际的细胞 .
无论如何,这里是代码(注意有很多启发式,而且它非常粗糙,并且基于旧项目,homeworks和stackoverflow答案的代码,所以它肯定远未完成):
输出1:
输出2: