Alexandre Alapetite & Pierre Cohade

BE 1 et 2 : Prise en main d'Aphelion

Aphelion est un logiciel d'analyse d'image.

Exercice 1 :

Quels effets ont plusieurs applications successives d'un filtre médian sur une image en niveaux de gris ?

On obtient une amélioration des contours (donc du contraste).

Exercice 2 :

Comparer la courbe des intensités "profile" avant et après application d'une succession de filtres médian sur une même image. Comment se caractérise ce filtrage sur cette courbe ?

On supprime les parasites (on lisse la courbe).

Exercice 3 :

Ecrire une macro qui applique 4 fois successivement un filtre médian 3×3.

Sub main
  AphImgMedian3x3 AphImg("Circuit"), AphImgNew("Image 0")
  AphImgMedian3x3 AphImg("Image 0"), AphImg("Image 0")
  AphImgMedian3x3 AphImg("Image 0"), AphImg("Image 0")
  AphImgMedian3x3 AphImg("Image 0"), AphImg("Image 0")
End Sub

Exercice 4 :

Comment fonctionne un filtre médian 3×3 ?

Change la valeur de sortie par la valeur moyenne du voisinage 3x3 (9 pixels). La valeur moyenne est calculée en ordonnant les 9 pixels du plus clair au plus foncé et en sélectionnant la valeur du milieu (4ième valeur).

Exercice 5 :

Quelle est la syntaxe d'une boucle for ? Proposer une macro qui permette d'appliquer une nombre N défini de fois un filtre médian sur une même image.

Syntaxe d'une boucle for :

for i = var1 to var2 step var3
...
next i

avec

Sub main
  const N = 4
  AphImgMedian3x3 AphImg("Circuit"), AphImgNew("Image 0")
  for i=0 to N step 1
    AphImgMedian3x3 AphImg("Image 0"), AphImg("Image 0")
  next i
End Sub

Exercice 6 :

Que réalise la fonction AphImgGetPixel ? Ecrire un programme qui affiche à l'écran le niveau de gris du pixel de coordonnées (5,5) de l'image "circuit".

La fonction AphImgGetPixel sert à lire la valeur d'un pixel d'une image.

Sub main
  dim point(2) as long
  point(0) = 5
  point(1) = 5
  value = AphImgGetPixel(AphImg("Circuit"),point)
  MsgBox(value)
End Sub

Exercice 7 :

Ecrire un programme qui renvoie la plus forte et la plus faible intensité présente dans l'image "circuit".

Sub main
  dim size() as long
  AphImgGetSize AphImg("Circuit"), size
  xSize = size(0)
  ySize = size(1)
  dim point(2) as long
  dim x as integer
  dim y as integer
  dim mini as integer
  mini = 256
  dim maxi as integer
  maxi = -1
  for x=0 to xSize-1 step 1
    point(0) = x
    for y=0 to ySize-1 step 1
      point(1) = y
      value = AphImgGetPixel(AphImg("Circuit"),point)
      if value > maxi then maxi = value
      if value < mini then mini = value
    next y
  next x
  MsgBox("Valeur maxi : " & maxi & chr(13) & "Valeur min : " & mini)
End Sub

Exercice 8 : BINARISATION

Implémenter, étudier et comparer les propositions suivantes visant à binariser une image (les pixels sont soit noirs, soit blancs - il n'y a plus de niveaux de gris intermédiaires)
Pour chaque pixel de l'image :

Proposition 1 :

si son intensité est <128, alors on lui attribue l'intensité 0, sinon on lui attribue l'intensité 255.

Cette méthode ne donne pas une bonne binarisation de l'image.

Proposition 2 :

si son intensité est inférieure à la moyenne des intensités de l'image, alors on lui attribue l'intensité 0, sinon on lui attribue l'intensité 255.

Cette méthode est meilleure que la proposition 1 mais elle ne donne pas une bonne binarisation de l'image.

Proposition 3 :

si son intensité est inférieure au niveau d'intensité médian de l'image, alors on lui attribue l'intensité 0, sinon on lui attribue l'intensité 255.

Cette méthode donne une bonne binarisation de l'image.

Sub main
  AphDeferRefresh true
  dim size() as long
  AphImgGetSize AphImg("Fruit"), size
  xSize = size(0)
  ySize = size(1)
  dim point(2) as long
  dim H(0 to 255) as integer
  for x=0 to xSize-1 step 1
    point(0) = x
    for y=0 to ySize-1 step 1
      point(1) = y
      value = AphImgGetPixel(AphImg("Fruit"),point)
      H(value) = H(value) + 1
    next y
  next x
  dim m as integer
  median = 0
  dim somme as Long
  dim demi as Long
  demi = xSize * ySize / 2
  do while (somme < demi)
    somme = somme + H(median)
    median = median + 1
  loop
  AphImgCopy AphImg("Fruit"), AphImgNew("Image 0")
  for x=0 to xSize-1 step 1
    point(0) = x
    for y=0 to ySize-1 step 1
      point(1) = y
      value = AphImgGetPixel(AphImg("Fruit"),point)
      if value <median then value = 0 else value = 255
      AphImgSetPixel AphImg("Image 0"), point, value
    next y
  next x
  AphDeferRefresh false
  MsgBox("Median : " & median)
End Sub

Exercice 9 : PROGRAMMATION DU FILTRE MÉDIAN

Ecrire une macro qui permet d'appliquer un filtre médian 5×5 à une image. On prendra soin de traiter convenablement les bords de l'image.

Sub main
  AphDeferRefresh true
  dim size() as long
  AphImgGetSize AphImg("Fruit"), size
  xSize = size(0)
  ySize = size(1)
  dim point(2) as long
  dim h(0 to 255) as integer
  dim WIND as integer
  WIND = 5
  dim m as integer
  m = 0
  dim df as Long
  df = WIND * WIND / 2
  dim x as Integer
  dim y as Integer
  dim k as Integer
  dim g as Integer
  dim nM as Long
  AphImgCopy AphImg("Fruit"), AphImgNew("sortie")
  for y = WIND/2 + 1 to ySize - WIND/2 - 1 step 1 'lignes image
    'Histogramme de la 1ère fenêtre
    for k = 0 to 255
      h(k) = 0
    next k
    for i = 0 to WIND-1 step 1 'colonnes de la fenêtre
      point(0) = i
      point(1) = y - WIND/2
      for j = 0 to WIND-1 step 1 'lignes de la fenêtre
        point(1) = point(1) + 1
        g = AphImgGetPixel(AphImg("Fruit"),point)
        h(g) = h(g) + 1
      next j
    next i
    'Calcul de m et nM
    nM = 0
    m = 0
    do while m < df
      nM = nM + h(m)
      m = m + 1
    loop

    for x = WIND/2 + 1 to xSize - WIND/2 - 1 step 1 'colonnes image
      for k = 0 to WIND - 1 step 1 'ligne colonnes à modifier
        point(1) = y - WIND/2 + k
        point(0) = x - WIND/2 - 1 'ancienne colonne
        g = AphImgGetPixel(AphImg("Fruit"),point)
        h(g) = h(g) - 1
        if g < m then nM = nM - 1
        point(0) = x + WIND/2 + 1 'nouvelle colonne
        g =  AphImgGetPixel(AphImg("Fruit"),point)
        h(g) = h(g) + 1
        if g < m then nM = nM + 1
      next k
      if nM > df then
        do
          m = m - 1
          nM = nM - h(m)
        loop while nM > df
      else
        do while nM + h(m) <= df
          nM = nM + h(m)
          m = m + 1
        loop
      end if
      point(0) = x
      point(1) = y
      AphImgSetPixel AphImg("sortie"), point, m
    next x
  next y
  AphDeferRefresh false
End Sub
https://alexandre.alapetite.fr

Retour