使用Python,如何计算图像中指定尺寸对象的面积?

3
我正在研究从人类干细胞中分化出来的神经元中神经突起的退化情况。输出数据是一对图像,一个是长而健康的神经突起的“之前”图片,另一个是断裂、萎缩的神经突起的“之后”图片。我们有一个能够标记这些神经突起的图像处理套件,但该软件只能计算总神经突起面积,不能有效区分之前和之后的照片。
我试图在下面创建一个示例。左边是我们的“之前”图片,有更少、更长、更粗的线条。右边是“之后”照片,有更少、更细的线条。
目前,“A”和“B”图片的“面积”数据输出非常相似。我正在考虑是否可能编写一个程序,仅将连续的长对象视为图片A中存在。最终数据的输出只需要每张照片一个数字。即照片A可能只输出“545”,而照片B可能输出“33”。

A "before" and B "after"

我可以想到一些物体识别的版本,可以进行完全计数,但无法想到一种方法来调整程序仅识别较长的连续线而不是短斑点。
我们之所以更喜欢使用Python,是因为处理管道中的早期阶段使用Python脚本,如果可能的话,我们宁愿坚持使用一种语言。(我们在Python方面也有更多的经验)。

为什么 A 会输出 "545",而 B 输出 "33"?你在测量什么? - Gabriel
旨在量化仅限于指定长度以上的对象的面积。因此,图像“a”中所有长线的面积将被计算,但是图像“b”中的大多数对象将不会被计算,因为它们太短了。我只是随机选择了545和33来解释,我只需要一个代表健康神经元轴突面积的单个值作为输出。 - saxophone37
那么您需要估计每个黑色区域的长度,手动修正限制长度值,然后估算那些没有被长度过滤掉的区域的面积。这样正确吗? - Gabriel
你会如何处理这样一种情况:当两条或更多的“线”以给定的角度重叠在一起时?或者你能确定这种情况永远不会发生吗? - Gabriel
是的,那听起来大致正确。根据我们设置原始成像参数的方式,重叠可能会受到限制,但是它们无法完全排除(除非我们包含另一个手动处理步骤)。 - saxophone37
1个回答

2
一种简单的方法是使用边缘检测滤波器来过滤图像。然后,您可以执行一些相当基本的操作,例如将输出求和,这是图像中边缘数量的粗略度量。如果给定两个具有类似总面积的图像,则“边缘-ness”更高的图像(经过边缘滤波的图像的范数)意味着你有更多、更小的碎片。一个具有较小的滤波输出的图像需要更少、更大的碎片。(同样,这假设具有类似的总面积。)
这种方法有优点和缺点。首先,它非常简单。但是你必须定义你所说的“相似的面积”,以便比较两幅图像的滤波输出。
此外,边缘滤波方法可能会明显低估实际碎片的数量。在你展示的这些图像中,右边图像中的额外边缘仅占两幅图像中边缘的很小一部分,因为碎片是垂直于它们的长轴“分裂”的。另一方面,如果它们沿着它们的长轴“分裂”,则会得到大约两倍的边缘。
无论如何,如果这种简单的方法对您不起作用,那么在scikit-image中实现了更复杂的算法,专门为此目的而设计。例如,请查看approximate_polygon()方法。 skimage.measure模块有几种不同的方法来解决这个问题。

谢谢bnaecker,我们之前尝试过类似的方法,使用物体周长来规范化输出(即物体总面积/物体周长),但并没有发现它能带来更多的灵敏度,并且更容易受到伪影的影响(有时扫描仪会捕捉到其他细胞碎片的斑点)。我还没有浏览skimage.measure模块,感谢您指出给我! - saxophone37

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接