retour aux mémos     retour au modèle     back to SimMasto home page   retour à la page d'accueil

Vectorisation d'une image de type raster


Objectif : créer un fichier au format vecteur depuis une image au format raster (voir le complément sur les rasters et vecteurs en annexe). Le fichier au format vectoriel pourra alors être interprété par des logiciels SIG et il sera possible d'effectuer des traitements ou de l'intégrer dans un simulateur.
Entrée: Une image satellitaire
Sortie: fichier au format shapefile (.shp) qui soit assimilable par le simulateur
Outils utilisés: Google Earth, QGIS, (Gimp), Grass.

Présentation de deux méthodes possibles

Il existe différentes manières de procéder pour convertir un fichier du format raster vers le format vecteur. Les deux techni-ques présentées ont leurs propres avantages et inconvénients.

  1. Numérisation par tracé de polygones:  La première et sans doute la plus efficace pour créer un fichier-vecteur léger est de « dessiner » des polygones par dessus une carte satellitaire et d'attribuer à chacun une catégorie (bâtiment, terrain...).

Cette solution permet de créer rapidement des fichier de formes au format kml.
Puisque les formes sont définies à la main, il s'agit généralement de polygones réguliers utilisant peu de points. Les fichiers générés nécessiteront donc peu ressources lors de la simulation ou d'un traitement quelconque.
La découpe de chaque forme peut prendre du temps et lorsque les cartes à numériser ont une grande surface la découpe à la main peut prendre beaucoup de temps.
Si l'on est amené à dessiner des polygones inclus dans d'autres polygones ou se superposant partiellement, on doit effectuer un traitement supplémentaire pour fusionner les éléments (un point sur la carte ne peut appartenir qu'à un seul polygone).

  1. Vectorisation automatique par logiciel: Une deuxième solution peut être envisagée, si l'on doit travailler avec un fichier raster (que ce soit une image ou une grille d'attribut) : il est possible d'utiliser des logiciels de vectorisation capable d'isoler les zones en fonction de leurs valeurs (pour une image, on peut découper une image selon les plages de couleurs présentes).

Cette méthode peut être relativement rapide grâce aux logiciels de traitement d'image.
De plus, en utilisant un système de calques puis en les fusionnant il n'y a pas de problème de gestion de polygones imbriqués (les zones visibles seront des zones indépendantes, il n'y a pas à s'inquiéter d'éventuels chevauchements des polygones).
Cette solution donne cependant rarement un résultat satisfaisant immédiat, puisque les couleurs des pixels d'une même zone ne sont presque jamais exact (il y a des dégradés ou des flous qui provoquent de nombreuses erreurs lors de la détection de couleur).
Il faut procéder à une étape de traitement supplémentaire en attribuant à chaque zone une couleur unique.
Cette méthode pose enfin un problème de taille: les polygones générés lors de la reconnaissance des zones de même couleur sont découpés selon la même résolution que l'image d'origine, la précision est donc élevée, mais chaque polygone est défini par plusieurs centaines voire milliers de points. Le fichier est donc très lourd à gérer.

Il est possible d'effectuer des méthodes de simplification (*) ; cependant, ces opérations peuvent être très longues puisque le logiciel effectue des traitements récursifs sur tous les polygones touchés par une modification (cela peut prendre plusieurs heures et si le résultat n'est pas sa-tisfaisant il faut recommencer en changeant le seuil). De plus ces opérations de simplification réduisent la précision et ne ramènent pas le fichier à un format de polygone aussi léger que celui d'un fichier créé avec la première solution.

Première méthode : numérisation par tracé de polygone

Remarque: Dans le cas où l'on travaille sur une image définie et pas sur une carte issue de Google Earth, on peut procéder aux mêmes étapes à condition d'importer l'image dans un logiciel de traitement SIG. Il est par exemple possible de dessiner des polygones au dessus d'une carte importée dans QGIS. L’image doit être géoréférencée (voir mémo 6).

Utilisation de Google Earth: Google Earth (http://earth.google.fr/) est au départ un logiciel de cartographie, mais les options proposées permettent de faire quelques traitements de SIG (superposition de couches, ajouts d'éléments selon les zones).

Nous allons utiliser ses fonctionnalités pour obtenir une image présentant une vue aérienne puis nous allons faire un repérage des éléments intéressants en créant un fichier KML, c'est à dire en superposant une forme à chaque élément du relief et en établissant un lien entre les deux.

Pour faciliter le travail, il vaut mieux commencer par délimiter la zone de travail (que l'on pourra modifier ultérieurement, il ne s'agit que d'un repère).
Pour conserver une carte régulière, on va ensuite en extraire un polygone régulier (grâce au clipping). Il faut donc avoir une zone suffisamment large pour pouvoir éliminer les marges sans toucher à la zone qui nous intéresse. Il est donc important de prendre une zone un peu plus grande que celle que vous voulez récupérer, car lors du changement de système de coordonnées de référence (voir Module 10) la carte peut subir des déformations.

Pour dessiner un polygone, il suffit de faire un clic gauche par sommet. Le clic droit supprime un sommet. Conserver le clic gauche enfoncé permet de tracer rapidement plusieurs sommets de manière consécutive (utile pour dessiner des courbes).

Attention : il faut absolument respecter certaines règles lorsque vous dessinez vos polygones. Il faut éviter que vos polygones soient en « auto-intersection ». C’est à dire qu'une ligne entre deux points ne doit jamais entrer en intersection avec une autre ligne du même polygone.

Figure: Exemples de mauvais choix de découpe Dans cet exemple, les deux bâtiments sont recouverts par un seul polygone, mais à l'endroit où les angles des bâtiments sont en contact, le polygone est en intersection avec lui même.
Pour la numérisation de l'arbre, l'erreur a été amplifiée pour la rendre visible , mais lors de la création du polygone, on risque d'insérer des « boucles », en particulier lorsque l'on cherche a dessiner des formes courbes.

Il faut également faire attention à ne pas insérer des éléments autres que des polygones dans le dossier. Par exemple Google Earth propose d'insérer des points de repère, mais ceux ci sont enregistrés comme des géométries de types « point ». Lorsque l'on essaie de le lire dans QGIS, le format n'est pas reconnu comme un format valide car un shapefile ne peut contenir que des éléments d'un même type ( point ligne ou polygone).

Pour votre premier polygone délimitant la zone vous pouvez lui donner la description « fond » pour indiquer qu'il sera le polygone “Univers” c'est à dire le polygone qui représentera la zone par défaut. Il est ensuite possible de modifier son style pour afficher ses bordures et rendre le contenu transparent.

A ce stade, il est conseillé de tracer les polygones catégorie par catégorie pour ne pas avoir à modifier le style à chaque fois.
Par défaut, les polygones crées sont blancs et opaques, mais il est possible d'éditer leur description et leur style via leur fenêtre de propriétés.
Il vaut mieux conserver un certain degré de transparence pour pouvoir gérer les polygones inclus dans d'autres polygones.
Il est important de donner une description relativement courte et explicite pour chaque polygone. On va utiliser la description comme repère pour retrouver les catégories. Tous les polygones d'une même catégorie doivent avoir la même description. Si vous faites des erreurs de frappe vous risquez de perdre des polygones lors du traitement (le mot écrit dans la fenêtre description correspond à la future catégorie du polygone).

Attention: Selon la version utilisée, il arrive que Google Earth génère des fichiers .kml qui ne sont pas interprétés par QGIS. Dans ce cas, il suffit de modifier l'en-tête du fichier .kml en récupérant un en-tête valide d'un fichier .kml qui puisse être interprété par QGIS. Ci-dessous, exemple d’en-tête KML pour QGis :
<?xml version="1.0" encoding="utf-8" ?> <kml xmlns="http://earth.google.com/kml/2.0">

Le fichier créé est presque exploitable, mais deux problèmes doivent être résolus avant de continuer.

  1. La première source d'erreur provient du format des coordonnées. En effet Google Earth enregistre les fichiers avec un géoréférencement en latitude-longitude ce qui n'est pas pratique pour le simulateur. Dans une simulation on travaille en mètre car une distance de 1 degré ne correspond pas à la même distance selon la position géographique.
Sur l'exemple ci-contre, on peut voir qu'une distance entre deux coordonnées exprimées en latitude-longitude diffère selon la distance à l'équateur (une distance de un degré en longitude à l'équateur est plus grande qu'une distance de 1 degré près des pôles. On remarque que les distances représentées par les segments A et B représentent le même écart en terme d'angle, mais ne correspondent pas à la même distance réelle du fait de la distorsion du repère. Plus la zone étudiée est grande, plus la distorsion des distances exprimées en angle devient importante.

Même si le format latitude/longitude reste cohérent en terme de distance sur de petites surfaces, il est difficile d'y faire correspondre d'autres données comme l'aire d'un polygone ou des vitesses en kilomètres par heure. Il est donc préférable de convertir le repère pour travailler en mètre.

Il faut donc convertir le CRS au format UTM. Il est possible de faire ce changement grâce à une fonction de PostGIS, mais il faut connaître le SRID (identifiant du système de référence) du fichier de départ et celui d'arrivée.

  1. L'autre source d'erreur est invisible, mais il faut tenir compte de la superposition des polygones. En effet, dans le cas d'une simulation, il ne faut pas qu'un élément puisse se situer sur deux types de terrains en même temps.

Pour résoudre ces deux problèmes, il est possible d'utiliser PostGIS (voir Module 9)

Deuxième méthode : vectorisation automatique par logiciel

Cette solution permet de créer un fichier shapefile en convertissant un image raster d'une vue satellitaire (il est possible d'en récupérer depuis Google Earth) ou d’une carte standard.

Pour mieux comprendre les étapes du traitement, nous allons expliciter les besoins puis tacher d'y répondre point par point :

  1. Il faut pouvoir reconnaître la zone cible, c'est à dire qu'il faut géoréférencer l'image satellitaire récupérée pour pouvoir travailler (Il faut pouvoir effectuer une reconnaissance des différentes zones).
  2. Après la reconnaissance « visuelle », il faut pouvoir isoler les éléments dans différentes catégories.
  3. Les catégories étant toujours sous un format d'image, il faut les modifier pour que chaque élément puisse être reconnu en tant que zone (polygone) et puisse accepter des attributs.
  4. Une fois les catégories créées et mises dans un format compatible avec les traitements des SIG, il faut donner des attributs propres à chaque catégorie

a) Reconnaissance et choix des catégories

Pour numériser une carte, il faut pouvoir découper tous les éléments qui nous intéressent sous forme géométrique, c'est à dire transformer la carte du format raster au format vecteur, (voir en annexe p.3 le complément sur les rasters et vecteurs). Chaque polygone pouvant contenir plusieurs centaines de points et une carte contenant souvent plusieurs milliers de polygones, il n'est pas possible de les redéfinir point par point à la main. Nous allons donc utiliser un logiciel qui va créer ces polygones en fonction des différentes zones de couleur présentes sur la carte.

Cette aide logicielle est pratique, mais le logiciel ne permet pas de remplacer l'œil humain et l'interprétation. En effet, le logiciel ne fait pas la distinction entre deux éléments qui ont la même couleur, ou qui ont une couleur proche. Ainsi la pierre et les bâtiments peuvent être confondus, de même que l'herbe et les arbres, il est parfois même nécessaire de faire des distinction entre élément visuellement semblable ( type de bâtiment, de culture...).

Pour permettre au logiciel de fonctionner correctement, nous allons commencer par une étape de dessin, où nous allons faire une reconnaissance manuelle des zones qui nous intéressent. Nous allons donner une couleur unique pour chaque catégorie et peindre l'image de façon à ce que chaque élément soit recouvert par une zone colorée propre à sa catégorie. Pour différencier les zones d'une image, nous allons utiliser un logiciel de traitement d'image. Le plus célèbre est PhotoShop, mais nous allons nous servir de GIMP qui présente des fonctionnalités similaires et qui à l'avantage d'être libre.

Nous allons créer un calque transparent et indépendant pour chaque catégorie et dessiner des polygones pour chaque élé-ment. On va faire en sorte que les polygones se superposent aux éléments de la carte en dessinant sur le calque au dessus de l'image (voir la figure suivante).

Avant de commencer à découper l'image en différentes parties, il faut choisir quelles sont les catégories et les classer par ordre de pertinence. En effet il faut décider quels sont les éléments qui doivent recouvrir les autres (par exemple les bâti-ments recouvrent les zones de terrain). Cette distinction est utile puisque lors de la découpe on va pouvoir étendre les zones qui ont une basse priorité d'affichage.

Il faut que chaque élément soit défini. Dans ce cas, si on ne décompose l'image qu'en deux catégories, on va définir un calque par défaut qui représente la plus grande partie de l'image, c'est à dire le terrain. On va donc entièrement recouvrir cette zone par un polygone de même dimension que l'image mais d'une couleur unique représentant le terrain. On va ensuite créer les éléments particuliers en utilisant d'autres calques. Dans cet exemple, on va considérer que le bâtiment central est une zone remarquable dont les propriétés écrasent celle de la couche inférieure (le bâtiment est sur le terrain).

Une fois les différents calques créés, il suffit de les fusionner pour obtenir une image avec des zones parfaitement délimitées et sans dégradés :

En procédant ainsi, on est sûr de ne pas créer d'espace vide entre le terrain et les bâtiments, et on n'a pas à découper la forme du bâtiment dans le calque terrain

Note concernant la découpe : La numérisation d'une carte est un élément clé de l'optimisation pour la simulation. Il faut être suffisamment rigoureux pour que le terrain modélisé soit comparable au terrain réel. Plus on donne de détail plus la simulation sera précise. Mais il y a néanmoins un inconvénient à être précis, la taille du fichier numérique créé va devenir rapidement encombrante.

En effet lorsqu'on effectue la numérisation d'une carte raster vers une carte vecteur, on individualise chaque élément en tant que forme géométrique (polygone). Mais chaque élément polygone contient une définition de son apparence géométrique sous la forme d'une suite de points délimitant ses frontières. Par exemple un polygone carré pourra être défini par le code suivant :

Il faut 5 points, pour fermer le carré

Maintenant si nous voulons numériser un bâtiment ayant une forme particulière:

Nous avons plusieurs façons pour le numériser :

  1. Représentation par un carré : le plus simple, mais peut suffire si on travaille à une échelle suffisamment grande et que la précision est réduite => utilise 4 points
  2. Découpage « à la main » en utilisant des contours réguliers (découpage par polygo-nes), celle utilisée dans la numérisation de la première méthode. Cette technique est la plus précise mais aussi la plus longue, surtout si on doit numériser un grand nombre d'éléments => utilise environ 35 points
  3. Sélection par plage de couleur (baguette magique) cette technique est très rapide et très puissante, mais elles inclu parfois des zones non désirées et le polygone créé est très irrégulier => utilise plusieurs centai-nes voire millier de points

Avant de commencer à découper une carte, il faut prendre en compte la surface à numériser, et l'utilisation prévue. Pour l'intégration du shapefile dans un simulateur, le fichier doit être suffisamment petit, la deuxième solution est plus « efficace » mais peut prendre du temps.

b) Découpe

Pour découper une carte, plusieurs méthodes permettent de gagner du temps. Selon l'image sur laquelle vous travaillez, vous pouvez essayer d'augmenter le contraste avec les outils GIMP ou PhotoShop pour améliorer l'efficacité des outils de sélection utilisant la détection de zones ayant des couleurs proches.

Ensuite vous avez plusieurs moyens pour séparer les zones, la plus longue consiste à dessiner chaque polygone à l'aide de l'outil de sélection au lasso (raccourcis GIMP ' f ' ). Vous découpez une zone depuis le calque correspondant à la couche cible, puis vous appliquez le pot de peinture (raccourcis GIMP =' shift + b '( une couleur par calque)

Remarque importante sur le choix des couleurs:

le logiciel que nous allons utiliser pour la reconnaissance des couleurs récu-père des images et les traite en tant que fichier constitué de trois couches (rouge, vert, bleu). La reconnaissance des poly-gones ne s'effectue que sur une de ces trois couches au choix de l'utilisateur. La création des polygones est indépendante de la couleur, mais le logiciel attribue à chaque polygone la valeur de la composante du filtre choisi. On reconnaît ensuite la catégorie des polygones d'après cette valeur attribuée à la couleur de la composante. Il est donc très important que deux éléments disjoints n'aient pas la même valeur de la composante choisie pour la découpe.

Pour mieux comprendre, si nous créons une carte très simple contenant deux catégories, (bâtiment et terrain), pour les distinguer nous choisissons deux couleurs (jaune et violet). Les codes couleurs en hexadécimal sont FFFF00 et FF00FF (voir la note sur le codage RGB dans le glossaire). Lorsque l'on va importer le fichier raster (dans GRASS par exemple), le fichier va être décomposé en trois couches. En prenant la couche « rouge » pour effectuer la dé-coupe, les polygones seront créés, mais posséderont tous la valeur 255 (la composante maximale de rouge). Il ne sera alors pas possible de faire la distinction entre les deux couleurs de départ. Les polygones terrains et les polygones bâtiments seront confondus. Pour éviter ce problème, il est préférable de définir dès le début un tableau de couleurs en faisant en sorte que chaque couleur possède des composantes uniques.

Dans le cas de zone homogène , comme les champs ou les bâtiments, vous pouvez utiliser l'outil de sélection par plage de couleur, ou baguette magique (raccourci u), Cet outil se révèle très utile lorsque vous devez découper des régions de couleurs homogènes mais avec des formes complexes (comme une route). En réglant le seuil de sélection et en utilisant les touches ctrl et maj (pour fusionner des sélections par zones de couleurs ou les soustraire) pendant la sélection, le travail est grandement facilité. Enfin pour les formes régulières les outils de sélection par polygone permettent d'isoler rapidement les champs et les bâtiments rectangulaires.

Il est vivement conseillé de garder un enregistrement de l'image à un format conservant les calques, pour permettre de faire des modifications ultérieures.

Exemple: en partant d'une image satellitaire, on isole les éléments par couche (les zones noires sont transparentes). Puis on fusionne les calques.

Avant d'utiliser le logiciel permettant de créer les polygones en fonction des zones de couleurs, il faut géoréférencer l'image:

Le jeu de données créé est encore vide, nous allons importer la carte

Il faut faire la distinction entre les cartes importées dans QGIS et celles importées dans le répertoire de travail de GRASS.

Attention : Pour certaines fonctions de Grass, il est nécessaire que les couches concernées soient affichées (ou sélectionnées) dans QGIS.

La fenêtre qui s'ouvre va vous permettre d'utiliser les fonctionnalités de GRASS. L'onglet « Parcourir » vous permet de visualiser les éléments présents dans le répertoire de travail (pour l'instant il est vide)

La fenêtre ouvre alors un nouvel onglet qui vous permet d'utiliser le module.

Avant de la convertir en vecteur, il est préférable de changer la résolution de travail pour ne pas perdre de précision durant la conversion.

Cette commande va recopier les propriétés du raster (dont la résolution) dans les propriétés de la région courante. On va se servir de ces propriétés pour créer le fichier vecteur.

Si la commande marche correctement, l'invite de commande se réaffiche aussitôt sans erreur (il n'y a pas de confirmation de la commande).

Dans le champs Raster Input file, seules les cartes que vous avez importé dans le plan de travail GRASS et sélectionné comme étant la région courante apparaissent (vous ne devriez en avoir qu'une seule, qui correspond à la couche que vous avez sélectionné).

Normalement les paramètres sont par défaut les paramètres courants de GRASS sinon sélectionnez le nom du projet, et du secteur. Le nom de la couche que vous venez de créer doit être accessible, ajoutez-la dans QGIS.

A ce stade, vous devez pouvoir voir votre couche vectorisée, les polygones ont été créés.

Si tout s'est bien passé, vous avez à présent une carte vectorisée où chaque élément est associé à une catégorie. Vous pouvez définir le nom et les attributs des polygones d'une des catégories en utilisant une jointure sur l'attribut value (pour les jointures, voir mémo AFAIRE).

 


(*) Pour la simplification d'un shapefile, dans la console Grass, il est possible d'utiliser la commande : v.clean input= « nom du shapefile à simplifier » output= « nom du shapefile simplifié » tool=rmarea threast = « le seuil de tolérance ». retour

Mémo 8 - Auteur Q.Baduel, MAJ  09.01.12 par jlefur

retour aux mémos     retour au modèle     back to SimMasto home page   retour à la page d'accueil