Alexandre Alapetite & Pierre Cohade

BE 4 et 5 : Contours

1. Gradient

Charger l'image "bronze". On estime le gradient horizontal en calculant la valeur absolue de la différence entre l'intensité d'un pixel et celle du pixel de droite (et ce, pour l'ensemble des pixels de l'image). Produire l'image du gradient horizontal à l'aide d'une macro. On utilisera en particulier les instructions AphImgGetPixel et AphImgSetPixel. Qu'observe-t-on pour les contours horizontaux de l'image ?
On va estimer le gradient horizontal.

Sub main
  AphDeferRefresh true
  dim size() as long
  AphImgGetSize AphImg("Bronze"), size
  xSize = size(0)
  ySize = size(1)
  dim point(2) as long
  dim x as Integer
  dim y as Integer
  dim g     as Integer
  dim g2 as Integer
  AphImgCopy AphImg("Bronze"), AphImgNew("sortie")
  for y = 0 to ySize-1 step 1
    point(1) = y
    for x = 0 to xSize-1 step 1
      point(0) = x
      g = AphImgGetPixel(AphImg("Bronze"),point)
      point(0) = x+1
      g2 = AphImgGetPixel(AphImg("Bronze"),point)
      g = Abs(g - g2)
      AphImgSetPixel AphImg("sortie"), point, g
    next x
  next y
  AphDeferRefresh false
End Sub
bronze   sortie

On constate l'affichage des contours verticaux (pas de bordure horizontale), mais les contours horizontaux ont disparus.

2. Convolution par un filtre 1×2

Charger l'image "bronze". Convoluer cette image avec le filtre horizontal (-1,1) en utilisant l'opérateur ImgConvolve, puis retenir la valeur absolue des résultats. Vous devriez retrouver le résultat obtenu en I.1.

03

Hormis un problème d'affichage lié semble-t-il au format d'image, on retrouve avec l'opérateur ImgConvolve l'extraction des contours de la question 1.

Procéder de même avec le filtre vertical (-1,1). Combiner les deux résultats (vertical et horizontal) avec un ImgAdd. Le problème de l'orientation subsiste-t-il ?

04

L'addition des résultats des filtres horizontaux et verticaux permet de supprimer le problème de l'orientation : les contours verticaux et horizontaux sont extraits.

3. Bruit

Effectuer la même manipulation qu'en 2 avec l'image "clocks" (observer l'aiguille des minutes lors de l'application du filtre vertical). Discuter de la qualité du résultat.

clocks

06   07

Résultat de l'application du filtre ImgConvolve en vertical et horizontal.
L'aiguille des minutes (verticale) disparaît lors de l'application du filtre vertical.

08

L'addition des résultats des filtres horizontaux et verticaux permet de supprimer le problème d'effacement de l'aiguille des minutes. Le résultat obtenu est satisfaisant.

4. Couleur

Effectuer la même manipulation qu'en 2 avec l'image "fruit". Transformer le résultat de l'estimation du gradient en niveaux de gris (ImgRGBToHSI, puis ImgSplitBand pour retenir la bande 2 correspondant à l'image en intensité). Recommencer l'opération en transformant d'abord l'image en niveaux de gris et en terminant par l'estimation du gradient comme en 2. Discuter de la qualité des deux méthodes et des deux résultats (examiner en particulier le bord de la serviette bleue à droite de l'image).

fruit
10   11

On trouve des résultats sensiblement identiques pour la technique 1 (ci-dessus) et la technique 2 (à gauche). La technique 1 est cependant plus longue à mettre en œuvre.
La méthode 2 (niveau de gris en premier), fait beaucoup plus ressortir le contour entre la serviette bleue et la table (bois marron). En effet, sur l'image en couleur, ce contour n'est pas très marqué, mais la transformation en niveau de gris a fortement marqué ce contour (le bleu est très distant du marron).
On peut donc conclure que la méthode 1 (en couleur) est plus fidèle aux contours perçus par l'œil.

5. Estimateur de gradient

Proposer un filtre 2×2 permettant de traiter en un seul passage tous les contours, qu'ils soient horizontaux ou verticaux. Justifier votre choix. Le tester.

12

Filtre ((-4,1)(1,2)). Résultat assez satisfaisant.
Ce filtre permet d'utiliser l'information des 4 pixels accessibles par la matrice 2x2. Il met en évidence l'écart entre le pixel en haut à gauche (0,0) et les trois autres. La somme des coefficients est égale à 0.
Le filtre ((-2,0)(0,2)) semble curieusement plus efficace.

6. Roberts / Sobel / Prewitt

Consulter l'aide en ligne relative aux opérateurs ImgRobertsEdges, ImgSobelEdges, et ImgPrewittEdges. Proposer une macro implémentant le filtre de Sobel (sans utiliser l'opérateur préprogrammé bien entendu...

13

Le résultat obtenu met bien en valeur les contours.
C'est assez différent du résultat obtenu avec le filtre de Aphelion.

121
000
-1-2-1
et
10-1
20-2
10-1
Sub main
  AphDeferRefresh true
  dim size() as long
  AphImgGetSize AphImg("Fruit"), size
  xSize = size(0)
  ySize = size(1)
  dim point(2) as long
  dim x as Integer
  dim y as Integer
  dim g as Integer
  dim somx as Integer
  dim somy as Integer
  AphImgCopy AphImg("Fruit"), AphImgNew("sortie")
  for y = 1 to ySize-1 step 1
    for x = 1 to xSize-1 step 1
      somx = 0
      somy = 0
      point(1) = y-1
      point(0) = x-1
      g = AphImgGetPixel(AphImg("Fruit"),point)
      somx = somx + g * 1
      point(0) = x
      g = AphImgGetPixel(AphImg("Fruit"),point)
      somx = somx + g * 2
      point(0) = x+1
      g = AphImgGetPixel(AphImg("Fruit"),point)
      somx = somx + g * 1
      point(1) = y+1
      point(0) = x-1
      g = AphImgGetPixel(AphImg("Fruit"),point)
      somx = somx + g * (-1)
      point(0) = x
      g = AphImgGetPixel(AphImg("Fruit"),point)
      somx = somx + g * (-2)
      point(0) = x+1
      g = AphImgGetPixel(AphImg("Fruit"),point)
      somx = somx + g * (-1)
      point(0) = x
      point(1) = y
      point(0) = x-1
      point(1) = y-1
      g = AphImgGetPixel(AphImg("Fruit"),point)
      somy = somy + g * 1
      point(1) = y
      g = AphImgGetPixel(AphImg("Fruit"),point)
      somy = somy + g * 2
      point(1) = y+1
      g = AphImgGetPixel(AphImg("Fruit"),point)
      somy = somy + g * 1
      point(0) = x+1
      point(1) = y-1
      g = AphImgGetPixel(AphImg("Fruit"),point)
      somy = somy + g * (-1)
      point(1) = y
      g = AphImgGetPixel(AphImg("Fruit"),point)
      somy = somy + g * (-2)
      point(1) = y+1
      g = AphImgGetPixel(AphImg("Fruit"),point)
      somy = somy + g * (-1)
      point(0) = x
      point(1) = y
      AphImgSetPixel AphImg("sortie"), point, ((abs(somx) + abs(somy)) / 4)
    next x
  next y
  AphDeferRefresh false
End Sub

7. Filtres passe-haut

Aphelion propose 3 filtres de convolution passe-haut à travers les opérateurs ImgHighPass3×3, ImgHighPass5×5 et ImgHighPass7×7.
Regarder leur définition et les comparer. Les appliquer à l'image "clocks", calculer l'image de la différence des résultats deux à deux :

I1 = ImgHighPass3×3 − ImgHighPass5×5
I2 = ImgHighPass3×3 − ImgHighPass7×7
I3 = ImgHighPass5×5 − ImgHighPass7×7

Comparer qualitativement le comportement des trois filtres en fonction de I1, I2 et I3.

14   15   16

Voici les filtres HighPass 3×3, 5×5 et 7×7.
Ils travaillent donc sur des fenêtres de taille respectivement 3×3, 5×5, et 7×7.
On note une augmentation du bruit sur le 5×5 par rapport au 3×3, et sur le 7×7 par rapport au 5×5.

17   18   19

Voici :

I1 = 3×3 − 5×5
I2 = 3×3 − 7×7
I3 = 5×5 − 7×7

L'image I2 comporte beaucoup de détails, cela met en évidence l'écart de filtrage entre 3×3 et 7×7.
Les images I1 et I3 comportent en effet moins de détails ; cela est du à un faible écart de filtrage entre 3×3 − 5×5 et 5×5 − 7×7

8. Filtres Laplaciens

Comparer les définitions des filtres ImgHighPassN×N et ImgLaplacianN×N. D'une façon générale. Comment peut-on définir la nature de la différence entre les 2 types de filtres ?

La somme des coefficients des filtres Laplaciens est nulle, alors que dans le cas des , elle fait 1.

9. Filtres passe-bas

Consulter la définition des filtres ImgLowPassN×N. Les appliquer à l'image "clocks". Appliquer le même traitement qu'en 7.

20   21   22

Voici les filtres LowPass 3×3, 5×5 et 7×7.
Ils travaillent donc sur des fenêtres de taille respectivement 3×3, 5×5, et 7×7.
Au plus la fenêtre est grande, au plus le résultat est flou, et au plus on supprime le bruit.

23   14   25

L'image I2 comporte beaucoup de détails, cela met en évidence l'écart de filtrage entre 3×3 et 7×7.
Les images I1 et I3 comportent en effet moins de détails ; cela est du à un faible écart de filtrage entre 3×3 − 5×5 et 5×5 − 7×7.

10. Lissage

Générer sous PaintBrush une image composée de 2 rectangles, l'un gris clair, l'autre gris foncé. Sous Aphelion, lui ajouter un bruit uniforme dont l'amplitude de variation est égale à l'écart entre les deux niveaux de gris de l'image originale. Appliquer un des filtres passe-haut de la question 7. Proposer une séquence d'opérateurs pour retrouver le contour.

26   27
28   29

On constate qu'il est difficile avec ce genre de technique d'isoler précisément des contours bruités.

11. Lissage et gradient simultanés

Pour limiter les effets de l'estimation du gradient dans les zones bruités, on cherche généralement à définir un filtre qui amplifie les fortes variations "globales" et atténue (lisse) les petites variations locales. Proposer un filtre 7×7 qui réponde à ces deux critères. Le tester.

1122211
1224221
2248422
24816842
2248422
1224221
1122211
  Ce filtre permet en une seule opération de réaliser une amplification des fortes variations globales et qui atténue les petites variations locales.
Les résultats sont proches de ceux obtenus en deux étapes distinctes.

Cany-Deriche

Consulter la définition du filtre de Cany-Deriche tel qu'il est implémenté dans Aphelion. On pourra en proposer une définition simplifiée.
Définir un masque 1×7 approximant le filtre de Cany-Deriche en f(-3), f(-2), f(-1), f(0), f(1), f(2) et f(3) pour les valeurs suivantes de α : 0.5, 1 et 2.
Déterminer le rôle joué par alpha sur la définition du filtre. Créer et appliquer le masque correspondant à α=1 sur l'image "clocks".

Calcul du masque :

On constate d'après les résultats des calculs que a influence la largeur du masque. C'est à dire que lorsque a est petit, les valeurs du masque décroissent lentement autour du centre. Alors que lorsque a est plus grand, les valeurs sont élevées au centre, et décroissent rapidement.

https://alexandre.alapetite.fr

Retour