6 votes

Comment numéroter de manière cohérente les contours dans une série chronologique d'images ?

J'ai automatisé la tâche consistant à mesurer la surface des plantes au fil du temps pour extrapoler le taux de croissance en utilisant une série chronologique d'images et les deux méthodes suivantes : (1) Python + ArcGIS, et (2) Python + OpenCV.

Dans la première méthode, ArcGIS me permet de créer une grille vectorielle sur l'image. Chaque cellule de la grille contient une seule plante, je numérote donc chaque cellule en partant du haut de la gauche vers le bas de la droite. Après avoir créé une image binaire dans laquelle les pixels de la plante == 1 et tout le reste == 0, j'applique la statistique zonale pour trouver la surface de la plante. De cette façon, les numéros de plantes restent cohérents car j'utilise la même grille sur toutes les images de la série temporelle, mais cela nécessite une intervention manuelle.

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

Dans la deuxième méthode, j'utilise OpenCV pour trouver les plantes via les contours. La numérotation de chaque contour se fait automatiquement en fonction des coordonnées de son centroïde et des dimensions de la boîte englobante. Actuellement, je les ai triés "de haut en bas", mais ce n'est évidemment pas un tri aussi parfait que la grille faite manuellement. En outre, la plante n° 1 peut ne pas rester la plante n° 1 sur la deuxième ou la troisième image, car chaque plante grandit et se déplace au cours de l'expérience, et de nouvelles plantes apparaissent et modifient le nombre total de contours (les images sont prises toutes les heures pendant plusieurs semaines). Par conséquent, je ne peux pas comparer la plante n° 1 de la première image et la plante n° 1 des images suivantes, car il ne s'agit peut-être même pas de la même plante.

Comment puis-je numéroter de manière cohérente la même plante sur l'ensemble de la série chronologique en utilisant la deuxième méthode ? J'ai envisagé d'associer les centroïdes des images suivantes aux coordonnées (x,y) de l'image précédente qui étaient les plus similaires (une fois les données sous forme de tableau), mais cela ne permettrait pas d'obtenir une image de contour numérotée et mise à jour.

Plants numbered by contours.

0voto

rainbowtrout Points 61

La solution à ce problème résidait dans la détection automatique des cercles via la fonction de transformation de Hough d'OpenCV (cv2.HoughCircles()), en trouvant les centroïdes des cercles de Hough résultants et en les superposant ensuite à l'image RVB originale pour créer une clé de référence. Comme je n'avais pas du tout d'image sans plantes, j'ai adapté la méthode pour qu'elle trouve le nombre correct d'origines, mais le résultat serait meilleur dans une image sans plantes.

Reference Key created from Hough Circles

J'ai converti les fichiers csv résultants pour l'image de référence des cercles de Hough (colonnes : OID, X, Y) et les contours des plantes (colonnes : CID, X, Y, Area etc.) en GeoPandas GeoDataFrames et j'ai utilisé le cKDTree de Scipy pour les combiner à travers un algorithme de plus proche voisin.

Un merci spécial à la réponse de JHuw dans https://gis.stackexchange.com/questions/222315/geopandas-find-nearest-point-in-other-dataframe car la fonction nearest_points de Shapely n'a pas fonctionné pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X