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