• 10 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 17/12/2019

Entraînez-vous en évaluant la déforestation en Amazonie

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

À vous de jouer !

Dans cette activité, vous allez :

  • Concevoir vos propres opérateurs de Morphologie Mathématique ;

  • Découvrir la bibliothèque OpenCV en Python ;

  • Mettre en œuvre la morphologie mathématique sur des images satellites.

Par souci d'uniformisation, vous travaillerez tous avec Python 3.

Esquisse générale de l'activité

L'idée générale de cette activité consiste à d'abord binariser nos images afin d'isoler les zones correspondant aux forêts des zones grisâtres correspondant à un terrain nu.

Une fois cette binarisation effectuée, vous utiliserez les opérateurs morphologiques afin de distinguer les zones touchées par la déforestation des zones encore épargnées.

Lecture des images

Voici les 2 images à analyser :

Amazonie en 2000 (source NASA’s Earth Observatory)
Amazonie en 2000 (source NASA’s Earth Observatory)
Amazonie en 2012 (source NASA’s Earth Observatory)
Amazonie en 2012 (source NASA’s Earth Observatory)

La première image,amazon_2000.jpgest une photo satellite prise au dessus de l'Amazonie en 2000.

La seconde image,amazon_2012.jpgcorrespond à la même zone, mais photographiée 12 ans plus tard.

Les images proviennent de la NASA (https://earthobservatory.nasa.gov/WorldOfChange/Deforestation), et montrent l'évolution de la déforestation à Rondônia, au Brésil. Elles correspondent à des images en couleur, au format RGB. Toutefois, comme nous l'avons vu durant le cours, les opérateurs morphologiques agissent sur des données binaires, c'est-à-dire sur des images à un seul canal, où chaque pixel est égal soit à 1, soit à 0.

Préparation des images

1. Convertissez vos images en niveaux de gris. Nommez ces images ng_2000 et ng_2012.

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
ng_2000 = cv.imread('amazon_2000.png',0)
ng_2012 = cv.imread('amazon_2012.png',0)

2. Les images en niveaux de gris ne correspondent pas encore à des images binaires. Nous allons appliquer une méthode de binarisation afin de transformer nos images en niveaux de gris vers des images binaires. Nommez ces deux imagesbin_2000etbin_2012.

blur = cv.GaussianBlur(ng_2000,(5,5),0)
ret3,bin_2000 = cv.threshold(blur,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)
blur = cv.GaussianBlur(ng_2012,(5,5),0)
ret3,bin_2012 = cv.threshold(blur,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)

3. Visualisez les images. Remarquez que les points identifiés comme déboisés sont discontinus et ne constituent pas des zones contiguës.

plt.imshow(bin_2000,cmap="gray")
plt.show()
plt.figure()
plt.imshow(bin_2012,cmap="gray")
plt.show()

Nettoyage des images

Afin de pouvoir calculer l'aire déboisée entre les deux images, il faut nettoyer les images pour connecter l'ensemble des zones déboisées et diminuer l'effet du bruit.

  • Élément structurant

L'élément structurant correspond simplement à une matrice d'une taille donnée où les valeurs à 1 correspondent à la forme de l'élément structurant et les valeurs à 0 non. Créez et visualisez un élément structurant en forme de croix.

Motif en croix
  • Opérateurs de base

Dilatation
Une des opérations de base de la morphologie mathématique est la dilatation. Comme vu dans le cours, cet opérateur consiste à appliquer une convolution sur l'image par un élément structurant donné. Pour chaque pixel de l'image, l'élément structurant sera centré sur ce pixel. Les pixels de l'élément structurant forment alors un masque sur l'image. Le pixel de l'image résultante sera égal à 1 si au moins un de ces pixels du masque est égal à 1 dans l'image originale.

  1. La première étape consiste à implémenter la fonction qui correspond à l'application d'un élément structurant donné sur un pixel de l'image. Une difficulté de cette fonction est la gestion des bords de l'image. Attention à ne pas essayer d'accéder aux pixels en dehors des limites. Dans ces cas-là, la zone du masque en dehors de l'image sera simplement ignorée.

Complétez le prototype de fonction suivant :

def pixel_dilatation(image, ligne, colonne, elmt_structurant):
...

2. La deuxième étape consiste à appliquer notre filtre convolutionnel sur chaque pixel de l'image.

Créez alors une nouvelle fonction :

def dilatation(image, elmt_structurant)
...

qui passe sur chaque pixel de l'image.

Érosion

Procédez de la même manière pour l'érosion.

La seule différence entre l'opérateur d'érosion et celui de dilatation est le fait que le pixel traité sera à 1 si, et seulement si, tous les pixels du masque sont à 1 dans l'image originale.

Créez deux fonctions.
N° 1 : 

def pixel_erosion(image, ligne, colonne, elmt_structurant):
...

N° 2 :

def erosion(image, elmt_structurant):
...

Fermeture

Afin de détecter les zones déboisées, considérées comme l'avant-plan dans notre image, nous allons appliquer un opérateur de fermeture sur nos images. Cet opérateur aura pour effet de combler les trous dans les zones déboisées dus à la qualité de l'image ou à notre segmentation basique.

L'opérateur de fermeture est une composition de l'application des deux opérateurs de base que sont la dilatation et l'érosion.

  1. Implémentez votre opérateur de fermeture en utilisant les deux fonctions implémentées précédemment. 

    def fermeture(image,elmt_structurant):
    ...
  2. Testez différents éléments structurants sur les images exemples qui vous sont fournies.

Morphologie mathématique avec OpenCV

OpenCV propose des outils pour effectuer des opérations de morphologie mathématique.

Élément structurant

Pour obtenir un élément structurant, vous pouvez utiliser la fonction cv.getStructuringElement qui prend en paramètre la forme de votre élément structurant ainsi que sa taille en pixels.

Testez et affichez les différents éléments structurants, à savoir :

  • MORPH_ELLIPSE ;

  • MORPH_CROSS ;

  • MORPH_RECT.

Opérateurs morphologiques en OpenCV

OpenCV propose une fonction générique permettant d'appliquer les opérations morphologiques de base sur une image avec un élément structurant donné. Cette fonction est cv.morphologyExqui prend en paramètres :

  1. L'image à traiter ;

  2. Le type d'opération ;

  3. L'élément structurant à appliquer.

Les opérations possibles sont :

  • cv.MORPH_DILATE: dilatation ;

  • cv.MORPH_ERODE : érosion ;

  • cv.MORPH_OPEN  : ouverture ;

  • cv.MORPH_CLOSE : fermeture.

Testez les différentes opérations sur les exemples donnés.

Comparaison

Dans la partie précédente, vous avez implémenté vous-même les différents opérateurs morphologiques. Assurez-vous que le résultat est le même sur les images qui vous sont fournies.

Revenons à nos images de déforestation.

  1. Sachant que les zones déboisées correspondent à notre avant-plan, c'est-à-dire avec des valeurs de pixels à 1, quel opérateur morphologique choisissez-vous pour « boucher » les trous noirs ?

  2. Appliquez cet opérateur sur les deux images binaires et affichez le résultat. Choisissez un bon élément structurant jusqu'à obtenir des zones homogènes dans les zones déboisées.

  3. Calculez le pourcentage de zones déboisées en 2000 et le pourcentage de zones déboisées en 2012.

Vérifiez bien que vous avez les éléments suivants.

Un fichier Python nommé  morpho.py qui fera les choses suivantes, à partir des deux images fournies pour l'activité :

  • Il chargera les deux images et calculera une binarisation ;

  • Il implémentera les opérateurs de fermeture et d'ouverture ;

  • Il calculera le pourcentage de zones déforestées pour chaque image et affichera le résultat.

Vous ajouterez également un fichier texte nommé readme.txt contenant des instructions particulières d'utilisation de vos fichiers si elles existent, ainsi que les réponses aux questions en fin d'activité.

Puis-je utiliser des sous-fonctions ?
Oui, si vous souhaitez que votre programme principal soit plus lisible, vous pouvez l'accompagner de fonctions. Dans ce cas, joignez évidemment vos fonctions lors de votre compte-rendu et n'oubliez pas de bien expliquer le rôle et le fonctionnement de votre fonction en commentaire. 

Vérifiez votre travail

Extraire des informations pertinentes et simples des images numériques

Vérifiez que :

  • Le code calcule et affiche le pourcentage de zones déforestées pour les deux images du sujet.

  • Le code affiche les images obtenues, intermédiaires et finales.

  • Un opérateur morphologique pertinent est utilisé pour créer des zones déforestées homogènes.

Le code produit doit répondre spécifiquement à ce qui a été demandé. C’est-à-dire calculer le pourcentage représentant la déforestation sur les deux images spécifiées, afficher les images traitées et afficher les pourcentages. La compétence n’est pas acquise si certains de ces points ne sont pas faits. Faites attention aux pourcentages affichés. Ils peuvent être différents des vôtres selon les éléments structurants choisis. Il faut également que les opérateurs morphologiques utilisés soient pertinents par rapport à l’objectif fixé.

Utiliser une bibliothèque de traitement d’images

Vérifiez que :

  •  Les images satellites sont chargées avec OpenCV et affichées en N&B avec Matplotlib.

  • Le traitement de binarisation est fait en utilisant une fonction d’OpenCV. 

  • L’opération morphologique sur les images est faite avec une fonction d’OpenCV et le bon paramètre.

  • Les éléments structurants sont créés en utilisant la fonction adéquate d’OpenCV.

Le but de cette partie est de bien vérifier que l’élève sait utiliser la bibliothèque OpenCV. Il faut donc vérifier que l’élève utilise correctement au moins les fonctions :

  • cv.imread

  • cv.GaussianBlur

  • cv.threshold

  • cv.getStructuringElement

  • cv.morphologyEx

Attention également aux paramètres donnés aux fonctions. Est-ce que l’élève a bien utilisé  cv.MORPH_CLOSE  dans le cas d’une fermeture ? Est-ce que l’élève a bien utilisé  cv.MORPH_OPEN  dans le cas d’une ouverture ? Etc.

Implémenter un algorithme de traitement d’images

Vérifiez que :

  • Gérer les cas spéciaux liés aux bords de l’image.

  • Les images résultats des implémentations des fonctions de fermeture, érosion et dilatation correspondent à celles calculées par OpenCV pour un même élément structurant.

  • Les opérateurs d’érosion et de dilatation sont combinés dans le bon ordre pour implémenter la fermeture.

Cette compétence correspond à la capacité à mettre en œuvre un algorithme de traitement d’images. Cette compétence peut être validée sur l’implémentation des opérateurs de dilatation et d’érosion. Pour vérifier si tout est acquis, vérifiez bien que le code fourni gère correctement les bords de l’image. Aussi, vérifiez que c’est toujours l’image donnée en paramètre qui est utilisée pour calculer les nouvelles valeurs de pixels et non l’image en cours de calcul. Enfin, vérifiez que les opérations sont bien appliquées sur l’ensemble des pixels de l’image. Il s’agit également d’évaluer si l’opérateur de fermeture est correctement implémenté. L’erreur classique étant l’inversion des opérateurs de base. Comparez le résultat avec une image du cours.

Exemple de certificat de réussite
Exemple de certificat de réussite