我已经使用图像时间序列和以下两种方法自动化了测量植物面积的任务,以推断生长速度:(1) Python + ArcGIS和(2) Python + OpenCV。
在第一种方法中,ArcGIS允许我在图像上创建一个矢量网格。网格的每个单元格包含一个植物,所以我从左上角到右下角对每个单元格进行编号。在创建了一个包含植物像素== 1和其他所有像素== 0的二进制图像之后,我应用Zonal Statistics来查找我的植物区域。通过这种方式,植物编号保持一致,因为我对时间序列中的所有图像使用相同的网格,但它需要手动干预。

在第二种方法中,我使用OpenCV通过轮廓来查找植物。每个轮廓的编号都是根据其质心坐标和边界框尺寸自动完成的。目前我对它们进行了“从上到下”的排序,但它显然不像手工制作的网格那样完美。此外,植物#1可能不会停留在第二或第三张图像中的植物#1,因为在实验过程中,每个植物都会生长和移动,并且会出现新的植物并改变轮廓的总数(图像每小时拍摄一次,持续数周)。因此,我不能比较第一张图像中的植物#1和后续图像中的植物#1,因为它们甚至可能不是同一植物。
如何使用第二种方法在整个时间序列中一致地对同一植物进行编号?我考虑将后续图像中的质心关联到前一图像中最相似的(x,y)坐标(一旦数据以表格形式存在),但这将无法提供更新的编号轮廓图像。

发布于 2020-10-03 07:59:33
此问题的解决方案在于通过RGB霍夫变换函数(cv2.houghCircle())自动检测圆,找到生成的霍夫圆质心,然后将它们叠加到原始OpenCV图像上以创建参考关键点。因为我没有一张没有任何植物的图像,所以我采用了这种方法,这样它就可以找到正确的原点数量,但在没有植物的图像中效果会更好。

我转换了hough circles参考图像(列: OID,X,Y)和植物轮廓(列: CID,X,Y,Area等)的结果csv文件。GeoPandas GeoDataFrames,并使用Scipy的cKDTree通过最近邻算法将它们组合在一起。
特别感谢JHuw在https://gis.stackexchange.com/questions/222315/geopandas-find-nearest-point-in-other-dataframe中的回答,因为Shapely的nearest_points函数对我不起作用。
https://stackoverflow.com/questions/63817871
复制相似问题