6

I have automated the task of measuring plant area over time to extrapolate growth rate using an image time-series and the following two methods: (1) Python + ArcGIS, and (2) Python + OpenCV.

In the first method, ArcGIS allows me to create a vector grid on the image. Each cell of the grid contains a single plant, so I number each cell starting from top-left to bottom-right. After creating a binary image in which plant pixels == 1 and everything else == 0, I apply Zonal Statistics to find my plant area. In this way the plant numbers stay consistent because I use the same grid over all the images in the time series, but it requires manual intervention.

ArcGIS method of numbering plants by manually creating a vector grid.

In the second method, I use OpenCV to find plants via contours. The numbering of each contour is done automatically based on its centroid coordinates and bounding box dimensions. Currently I have them sorted 'top-to-bottom', but it obviously isn't as perfect a sort as the manually-made grid. In addition, plant #1 may not stay plant #1 in the second or third image because each plant grows and moves over the course of the experiment, and new plants emerge and change the total number of contours (images are taken every hour for up to several weeks). Therefore, I cannot compare plant #1 in the first image and plant #1 in subsequent images because they may not even be the same plant.

How can I consistently number the same plant through the entire time-series using the second method? I considered associating centroids in subsequent images to (x,y) coordinates in the previous image that were the most similar (once the data is in tabular form), but this would fail to provide an updated numbered contour image.

Plants numbered by contours.

  • Please try to increase readability of the post. – Yunus Temurlenk Sep 10 '20 at 05:16
  • Please let me know if this is better. – rainbowtrout Sep 10 '20 at 15:13
  • It is a bit unclear what the question is but if I understand correctly you want to sort contours from top left to bottom right? – kavko Sep 10 '20 at 18:11
  • No I am able to (mostly) sort the contours already. The problem is that in subsequent images, the plant labelled as #1 in the contour image becomes a #13, or #8, depending on the new centroid and bounding box dimensions. Therefore I cannot, over time, compare #1 to the next #1 to get growth rate because they are actually different plants. I need a way to ensure the plant first labelled #1 stays that same number throughout all images. – rainbowtrout Sep 10 '20 at 18:15

1 Answers1

0

The solution to this problem lay in automatic circle detection via the OpenCV Hough Transform function (cv2.HoughCircles()), finding the resulting Hough Circle centroids and then overlaying them on the original RGB image to create a reference key. As I did not have an image without any plants in it at all, I adapted the method so it found the correct amount of origins, but the result would be better in an image with no plants.

Reference Key created from Hough Circles

I converted the resulting csv files for the hough circles reference image (columns: OID, X, Y) and plant contours (columns: CID, X, Y, Area etc.) to GeoPandas GeoDataFrames and used Scipy's cKDTree to combine them through a nearest neighbour algorithm.

Special thanks to JHuw's answer in https://gis.stackexchange.com/questions/222315/geopandas-find-nearest-point-in-other-dataframe as Shapely's nearest_points function did not work for me.