如果要统计图像中不同区域内的颗粒数量,该怎么做?
在前面我们已经介绍了如何找点(Find Maxima),可以快速获得点的坐标和数量。但那种是对整张图像进行的操作。有些时候,我们希望统计的是感兴趣区域内的颗粒数量。比如统计细胞内的颗粒信号数量。这个时候怎么做呢?
其实 Find Maxima 是支持 ROI 的,也就是当有某个 ROI 或者 selection 处于 active 状态,那么 Find Maxima 只会对 ROI 内部的区域进行 spot 搜索定位。
以上是纯手动操作进行的演示:选区,点击Find Maxima,然后找个记事本记下有多少个颗粒。但如果选区比较多,我们就要一遍又一遍地重复上述几个步骤。这样做效率很低,所以我们最好能够对其中的某些部分进行自动化。
事实上,我们可以很容易地分析出,上述步骤中,选区是手动的,而 Find Maxima 是自动的。所以可以集中手动选区,保存到 ROI 管理器中,然后对ROI进行遍历,自动 Find Maxima,从而完成一套半自动的处理流程。这样做的好处就是,我们不用来回地在多个步骤中切换,只需要做好人工选取感兴趣区域即可。
作为教程,为了让大家能够更好地掌握这种拆解问题的基本思路,所以这里说得多一点。而且作为ImageJ进阶教程,还有为引导大家编程入门的企图,希望用户能够从手动,逐步转向半自动到全自动的大数据分析。那么这样一个过程,本质上就是不断拆解问题,利用现成的算法,一小部分一小部分地实现自动化。所以能否把一个问题恰当地拆解,对于学习编程来说至关重要。
这里作为演示,我就先通过一段简单的代码自动生成若干规则的矩形ROI。一方面是因为懒,另外一方面这样也可以多讲一点和 ImageJ Macro 编程的内容。
比如:我要把这个图像大致均等划分为 5x3 这么多个矩形区域,怎么弄呢?先看效果。
再放代码:
简单说明一下:
- 通过内置函数
getWidth()
和getHeight()
获得当前图像窗口的宽和长(像素单位) - 确定要均等分割的数量,然后根据这个自动计算分区的长和宽,并且取整数
- 行列遍历,两层for循环,通过内置
makeRectangle()
创建矩形ROI - 为了方便后续操作,保存到ROI管理器
- 为了方便演示,增加了wait() 等待时间
然后我们就可以按照ROI 进行分区统计了,先放效果:
再放对应的代码:
简单说明一下:
- 可以通过命令获得当前ROI管理器中存在多少个选区
- 然后按顺序对ROI进行遍历选中
- 然后调用 Find Maxima命令,其中 prominence可以根据实际情况调整,output指定为 Count
- 同时把ROI的序号也加入到 Results中
通过这前后两段代码可以看到,创建选区好像比针对选区进行测量还要复杂一点。这很正常。在真实的数据分析中,创建选区有另外一个说法叫做图像分割。在小规模数据分析时代,我们通常靠人工手动分割感兴趣的不规则形状区域,只要被统计区域数量能满足比如 t 检验要求的N值(通常小于100)即可。而在大数据分析时代,手动分割已经逐渐被各类兴起的卷积神经网络所替代,例如U-Net之类的。这个后面有时间也可以谈一谈。
不过我想提醒的是,即便神经网络模型已经变得很好用,在对大规模数据进行批量处理之前,还是需要人工手动对少量数据抽样进行预分析。这是因为抽样预分析能够比较快速,直接地了解数据大致情况,这有助于帮助确定大规模数据分析的关键步骤方法。
此处评论已关闭