使用scipy确定“瓶颈”图像区域
我正在做图像处理和数学形态学的工作,使用的是 scipy.ndimage,我觉得这非常有趣。我们的工作是模拟电荷在不同薄膜中的移动,我们试图利用图像分析工具来估计为什么不同的形态表现得更好。
我很快就能使用 ndimage.label 和 distance_transform_edt 来找到连接的部分,并获取它们的大小。我还实现了一个广度优先搜索算法,用来找到这些部分和代表电极的边缘之间的最短路径。
现在,我想确定“瓶颈”或“狭窄通道”区域。我甚至不确定自己是否在找对关键词,因为我在图像处理方面并不是很专业。我在下面给出了两个例子……我想找到像红色圆圈这样的特征,统计它们的数量,并确定它们的大小分布。(考虑到电荷在更宽的瓶颈中移动会更容易。)
问题是我无法给这些区域标记,因为它们不是独立的部分。距离变换给我的边缘处的数值很小……我想要的是通过这些瓶颈的最小距离。
有没有建议我该去哪里找资料或一些通用的策略?
1 个回答
我们可以使用中轴变换来计算每个点的球体半径,以便找到图像中的凹陷部分。在下面的例子中,我们利用距离函数的分水岭算法,结合距离函数本身,来获得分隔最小值(图像中的白色部分)的轮廓。这就形成了一条路径,这条路径的权重是距离函数的最大值,用来分隔两个白色部分。我在Matlab中做过这个,但我觉得在Scikit图像工具箱中也很容易实现。
图像1:
填补空洞,因为它们不是路径:
距离函数:(热图)
距离函数的分水岭(路径):
按距离函数加权的分水岭(最终路径):
图像2:
距离函数:
距离函数的分水岭(路径):
按距离函数加权的分水岭(最终路径):
正如所展示的,我们通过影响区域计算了技术上的骨架(SKIZ),使用的是距离函数的分水岭(这里使用的是城市街区距离)。需要注意的是,边缘的空洞没有被填补,因为imfill会忽略边缘的空洞。如果需要填补,可以在周围加一个框,这样就可以使用imfill来填补这些空洞。