J'essaie de reconnaître les cours d'eau à partir de photographies aériennes (disons de Google Maps). Les gouvernements locaux ont souvent des données SIG qui indiquent où se trouvent les voies navigables (et les routes, les bâtiments, etc.), mais les données sur l'eau sont souvent quelque peu inexactes, et nous pourrions être en mesure de les améliorer en utilisant l'imagerie aérienne. Nous avons donc déjà des données qui ne sont pas toujours fiables.
Je sais comment faire un traitement d'image de base sur les données (malheureusement, je n'ai pas encore d'exemples d'images à montrer ici, j'essaie d'imaginer comment je pourrais le faire, pas de code de travail pour le moment):
Je peux collecter un ensemble de valeurs de couleur en utilisant des morceaux de voie navigable dans les images et déterminer quels pixels sont les plus proches de ces couleurs, éventuellement également pour d'autres types de caractéristiques (herbe, routes, bâtiments, etc.). Si je fixe un seuil sur lequel les pixels sont "assez proches", j'obtiens un ensemble de pixels qui sont probablement des voies navigables (mais il y aura beaucoup de bruit).
Je peux transformer l'image en niveaux de gris et utiliser un algorithme de détection de bord standard pour déterminer où se trouvent les bords. Encore une fois, cela me donne un ensemble de pixels de limites similaires, mais il y aura du bruit et les bords seront trop réfléchis et / ou auront des lacunes.
Ce que je veux avoir en sortie, c'est un ensemble de polygones qui décrivent les voies navigables probables.
Intuitivement, j'aimerais utiliser les bords détectés pour créer des polygones, et les informations de couleur pour décider lesquels sont de l'eau, en utilisant éventuellement les données gouvernementales que nous avons déjà.
Existe-t-il un moyen connu de passer du résultat d'un algorithme de détection de bord à un bel ensemble de polygones fermés? Ou d'autres conseils sur la façon d'attaquer ce problème, s'il existe un meilleur moyen?
la source
Réponses:
C'est difficile à faire avec les seules informations de couleur. Les variations de couleurs entre (ou même à l'intérieur) des images aériennes et satellites peuvent être énormes. Idéalement, vous aurez besoin d'imagerie hyperspectrale ou au moins infrarouge ( voir cet article ).
En supposant que votre détection de bord peut s'accrocher aux limites de pixels, vous pouvez prendre les bordures de chaque pixel comme un polygone fermé et les assembler pour former un polygone (selon votre implémentation d'union, vous pouvez vous retrouver avec un polygone avec des anneaux ou des trous intérieurs) ou une collection de polygones. La Java Topology Suite et d' autres implémentations de la géométrie algorithmique peuvent rendre ce beaucoup plus facile pour vous. Si vous souhaitez utiliser des limites de sous-pixels, vous devrez faire très attention à ce que vous ayez un bon ensemble de valeurs epsilon afin de pouvoir accrocher des bords qui sont très proches mais pas exactement en contact.
Si vous voulez prendre les bords et les combiner vous-même, vous voudrez construire un graphique des bords qui se croisent et implémenter du code qui traverse le graphique (par exemple dans le sens antihoraire) pour trouver où il se ferme sur lui-même pour former un polygone. C'est ainsi que certaines implémentations d'union des polygones fonctionnent.
la source