Aphelion est un logiciel d'analyse d'image.
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).
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).
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
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).
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
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
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
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 :
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.
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.
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
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