image-processing - 如何在 Octave 3.8.2 中计算红细胞/圆圈

我有一组细胞的图像,我需要计算它们。我使用 bwlabel 做了一个类似的练习,但是这个练习更具挑战性,因为有一些我不想计算的小单元格。此外,一些单元格彼此重叠。我在网上似乎有一些 MATLAB 示例,但它们都涉及不可用的功能。你有什么想法如何分离重叠的单元格吗?

这是图片:

为了更清楚:请帮助我计算红细胞(圆形)的数量,如下所示:

图像是灰度的,但我认为您可以区分哪些是红细胞。它们具有独特的双凹形状……其他一切都无关紧要。但更具体地说,这里是一张图像,其中包含我想忽略/丢弃/不计算的所有内容,以红色突出显示。

主要问题是单元格的重叠。

最佳答案

以下是执行此操作的 ImageJ 宏(这也是免费软件)。我建议您使用 ImageJ(或 Fiji)来探索这种类型的东西。然后,如果你真的需要它,你可以编写一个 Octave 程序来完成它。

run ("8-bit");
setAutoThreshold ("Default");
setOption ("BlackBackground", false);
run ("Convert to Mask");
run ("Fill Holes");
run ("Watershed");
run ("Analyze Particles...", "size=100-Infinity exclude clear add");

这种方法给出了这个结果:

它是指向并单击等效于:
  • 图像 > 类型 > 8 位
  • 图像 > 调整 > 阈值
  • 在阈值对话框中选择“默认”并取消勾选“深色背景”。然后点击“应用”。
  • 处理 > 二进制 > 填充孔
  • 进程 > 二进制 > 分水岭
  • 分析 > 分析粒子...
    7 在“分析粒子”对话框中将“100-Infinity”设置为有效粒子大小的范围

  • 在 ImageJ 上,如果您有一个二元图像,分水岭实际上执行距离变换,然后是分水岭。

    Octave 具有上述所有功能,除了分水岭(我计划很快实现)。

    如果您不能使用 ImageJ 解决您的问题(为什么不呢?它也可以在 headless 模式下运行),那么另一种方法是获取每个对象的面积,如果太高,则假设它是多个单元格。这有点取决于您的问题,以及是否可以生成平均单元格大小(和错误)的值。

    另一种替代方法是测量所识别的每个物体的圆度。重叠的单元格将不那么圆,您可以通过这种方式识别它们。

    这取决于您愿意在程序输出中接受多少错误。