如何在图像时间序列中一致地对轮廓进行编号?

Posted

技术标签:

【中文标题】如何在图像时间序列中一致地对轮廓进行编号?【英文标题】:How to consistently number contours in an image time series? 【发布时间】:2020-12-28 06:05:50 【问题描述】:

我使用图像时间序列和以下两种方法自动完成了随时间测量植物面积的任务,以推断生长率:(1) Python + ArcGIS,和 (2) Python + OpenCV。

在第一种方法中,ArcGIS 允许我在图像上创建矢量网格。网格的每个单元格都包含一个植物,因此我从左上角到右下角对每个单元格进行编号。在创建植物像素 == 1 且其他所有内容 == 0 的二进制图像后,我应用区域统计来查找我的植物区域。通过这种方式,植物数量保持一致,因为我在时间序列中的所有图像上使用相同的网格,但这需要人工干预。

在第二种方法中,我使用 OpenCV 通过轮廓查找植物。每个轮廓的编号是根据其质心坐标和边界框尺寸自动完成的。目前我让它们“从上到下”排序,但它显然不像手工制作的网格那样完美。此外,植物#1 可能不会在第二或第三张图像中保持植物#1,因为每株植物在实验过程中生长和移动,并且新植物出现并改变轮廓总数(图像每小时拍摄一次)至数周)。因此,我无法比较第一张图像中的植物 #1 和后续图像中的植物 #1,因为它们甚至可能不是同一种植物。

如何使用第二种方法在整个时间序列中始终如一地对同一植物进行编号?我考虑将后续图像中的质心与之前图像中最相似的 (x,y) 坐标相关联(一旦数据采用表格形式),但这将无法提供更新后的编号轮廓图像。

【问题讨论】:

请尽量增加帖子的可读性。 如果这样更好,请告诉我。 有点不清楚问题是什么,但如果我理解正确,你想从左上角到右下角对轮廓进行排序? 不,我已经能够(大部分)对轮廓进行排序。问题在于,在随后的图像中,轮廓图像中标记为 #1 的植物会变成 #13 或 #8,具体取决于新的质心和边界框尺寸。因此,随着时间的推移,我无法将 #1 与下一个 #1 进行比较以获得增长率,因为它们实际上是不同的植物。我需要一种方法来确保首先标记为 #1 的植物在所有图像中保持相同的数量。 【参考方案1】:

该问题的解决方案在于通过 OpenCV 霍​​夫变换函数 (cv2.HoughCircles()) 自动检测圆,找到生成的霍夫圆质心,然后将它们叠加在原始 RGB 图像上以创建参考键。由于我根本没有没有任何植物的图像,因此我调整了该方法,以便找到正确数量的原点,但在没有植物的图像中结果会更好。

我将霍夫圆参考图像(列:OID、X、Y)和植物轮廓(列:CID、X、Y、面积等)的生成 csv 文件转换为 GeoPandas GeoDataFrames,并使用 Scipy 的 cKDTree 将它们组合起来通过最近邻算法。

特别感谢 JHuw 在 https://gis.stackexchange.com/questions/222315/geopandas-find-nearest-point-in-other-dataframe 中的回答,因为 Shapely 的nearest_points 函数对我不起作用。

【讨论】:

以上是关于如何在图像时间序列中一致地对轮廓进行编号?的主要内容,如果未能解决你的问题,请参考以下文章

如何在选择图像中的轮廓时避免对图像(条形)进行分组?

pyplot:如何以人类可读的方式显式地对轴进行编号

在 Java 中有效地对图像进行颜色循环

iOS 动画虚线矩形边框

如何隔离轮廓内的所有内容,对其进行缩放并测试与图像的相似性?

opencv如何读取多边形区域内的像素值?