DOURNAC.ORG
Français  English
Accueil
Astronomie
Sciences
Philosophie
Informatique
Cv

Informatique > IHM traitement d'images en C++/Qt/OpenCV - Canny Edge



  • 1.Introduction
  • 2.Méthode générale
  • 3.Atténuation du bruit par convolution gaussienne
  • 4.Détection des contours avec les opérateurs de Sobel
  • 5.Application à un flux vidéo avec OpenCV

1.Introduction :

On se propose de développer une gui permettant de visualiser et de traiter des images de formats standards (bmp, png, gif, jpeg...). Cette interface a été codée en C++ avec l'utilisation du framework Qt. Le traitement d'images consiste d'abord à atténuer le bruit et détecter les gradients horizontaux, verticaux et les contours. Toute cette chaîne de calcul s'appelle le "Canny Edge Detector". Par la suite, nous présenterons une autre fonctionnalité qui consiste à appliquer cette chaîne au flux vidéo d'une webcam avec la librairie OpenCV.

L'application "Canny_Edge" est disponible pour Linux et MacOS :

  •    Canny_Edge_Linux.tar.gz (compilé et testé sous Debian Wheezy 7.0)
  •    Canny_Edge_MacOS.tar.gz (compilé et testé sous OS X 10.9.5)

Il est nécessaire d'avoir les librairies Qt4 et OpenCV. Une fois l'exécutable lancé, nous commencons par charger une image (la célèbre "lena.gif"). Voici le résultat sur l'image suivante :



2.Méthode générale :

Il s'agit dans chaque étape de ce calcul d'appliquer des filtres sur le tableau 2D que représente l'image. Ce filtrage linéaire s'applique selon l'opération de convolution discrète sur chaque pixel $X_{i,j}$ de l'image de départ :

\begin{equation} Y_{i,j} = \sum_{k=-\infty}^{+\infty}\sum_{l=-\infty}^{+\infty}H_{k,l}\,X_{i-k,j-l} = \sum_{k=-(n-1)/2}^{(n-1)/2}\sum_{l=-(n-1)/2}^{(n-1)/2}H_{k,l}\,X_{i-k,j-l} \end{equation}

avec l'image résultante et le filtre (de taille $n\,\text{x}\,n$) représentés respectivement par les matrices $Y$ et $H$. Nous verrons ci-après le filtre associé au flou gaussien et ceux utilisés pour les gradients horizontaux et verticaux.

3.Atténuation du bruit par convolution gaussienne :

Avant la détection des contours par les opérateurs de Sobel, il faut d'abord mettre en place une procédure de filtrage gaussien avec un masque "flou" (cf "Canny edge detector") de taille "5x5" qui permet d'atténuer les disparités présentes sur l'image et ainsi réduire le bruit. Voici le filtre $H$ utilisé :

\begin{equation} H=\dfrac{1}{159}\,\, \begin{pmatrix} 2 & 4 & 5 & 4 & 2 \\ 4 & 9 & 12 & 9 & 4 \\ 5 & 12 & 15 & 12 & 5 \\ 4 & 9 & 12 & 9 & 4 \\ 2 & 4 & 5 & 4 & 2 \end{pmatrix} \end{equation}

Le facteur $159$ permet de normaliser la nouvelle valeur du pixel afin de rester dans l'intervalle [$0,255$]. On obtient l'image suivante :



4.Détection des contours avec les opérateurs de Sobel :

Nous implémentons à ce stade la détection de contours par les opérateurs de Sobel. On se sert dans un premier temps des filtres $H_{x}$ (pour les gradients horizontaux) et $H_{y}$ (pour les gradients verticaux) :

\begin{equation} H_{x}= \begin{pmatrix} -1 & 0 & 1 \\ -2 & 0 & 2\\ -1 & 0 & 1 \end{pmatrix} \qquad H_{y}= \begin{pmatrix} -1 & -2 & -1 \\ 0 & 0 & 0\\ 1 & 2 & 1 \end{pmatrix} \end{equation}

puis on combine le résultat de ces 2 filtrages pour calculer la norme du gradient; pour un pixel $X_{i,j}$ calculé avec $H_{x}$ et $Y_{i,j}$ calculé avec $H_{y}$, cela donne une valeur de sortie $Z_{i,j}$ pour le pixel $(i,j)$ égale à :

\begin{equation} Z_{i,j}=\sqrt{X_{i,j}^{2}+Y_{i,j}^{2}} \end{equation}

ci-dessous l'image produite :



5.Application à un flux vidéo avec OpenCV :

Voici maintenant la fonctionnalité "Webcam" montrant le traitement "Canny Edge" sur le flux d'une webcam; cette vidéo a été réalisée avec la version MacOS du projet :


Video not playing? Download file instead.

ps : contribuez comme moi au projet Cosmology@Home dont le but est d'affiner le modèle décrivant le mieux notre Univers.

    Accueil | Astronomie | Sciences | Philosophie | Informatique | Cv    
- dournac.org © 2003 by fab -

Haut de Page