Dans l'article précédent
nous avons vu ce qu'est un flou et comment en faire un relativement rapidement
en imaging Lingo. Nous nous sommes contentés d'utiliser une matrice
uniforme 3x3 avec tous ses coefficients égaux à 1. Cette
fois-ci nous allons approfondir un peu et voir qu'il suffit de quelques
modifications pour obtenir un flou Gaussien. Pour finir nous regarderons
quelques variations originales pour corrompre vos images avec imaging
Lingo, en généralisant simplement les bases vues précédemment.
1
- Qu'est ce qu'un flou gaussien ?
Commençons par le début : avant d'essayer de faire un flou
gaussien, demandons nous ce qui différencie un flou gaussien d'un
flou uniforme.
Tout est dans le nom : il s'agit d'un flou - c'est à dire une redéfinition
de chaque pixel à partir d'une moyenne de son voisinage - et nous
avons la loi Gaussienne. La dernière fois la moyenne que nous faisions
était uniforme : chacun des 9 pixels se voyait attribuer le même
coefficient, quelque soit sa distance par rapport au centre de la matrice.
Pour résumer pour ceux qui ont oublié leurs livres de statistiques
dans le placard, la loi gaussienne nous apprend que la concentration d'énergie,
de signal, bref d'information, sera plus importante près du centre,
et tendra vers 0 lorsqu'on s'éloignera du centre. De manière
pratique les coefficients ne seront donc plus égaux ; les
éléments près du centre se verront attribuer un coefficient
élevé, et le coefficient des bords sera nul ou presque.
figure 1.) Faites vous même un flou Gaussien approximatif
en définissant la matrice de convolution dans Photoshop.
J'ai utilisé le terme de 'flou Gaussien approximatif' car les
coefficients que j'ai choisi ont été arrondis à des
entiers en prenant soin d'obtenir un total de 255. Ces valeurs restent
proches d'un flou Gaussien tel que celui de Photoshop, et l'intérêt
principal de cette matrice est d'avoir un total de 255, ce qui en fait
une matrice prête à être réutilisée en
imaging Lingo (puisque nous avons revu que la valeur maximum du paramètre
blendLevel de copyPixels
est 255).
Pour avoir un aperçu du potentiel de cette méthode de traitement
d'image, nous regarderons rapidement ensuite le cas d'une matrice non
symétrique comprenant des valeurs négatives. Traiter de
l'étendue des utilisations de telles matrices sort complètement
du cadre de cet article, nous nous contenterons ici simplement de regarder
quels genre de résultats nous pouvons obtenir avec Director.
figure 2.) Faîtes vous même votre matrice dans Photoshop,
ici un mélange de détection de contours et de biseautage,
simplement pour obtenir un effet spécial.
Le point à garder à l'esprit est l'égalité
entre
la somme des coefficients et le diviseur,
pour ne pas altérer la luminosité
(sauf si c'est ce que vous cherchez).
2
- La version imaging Lingo
Nous travaillerons à partir du gestionnaire 'Blur'
écrit dans l'article précédent. La première
chose à faire (et la plus facile) est la mise à jour de
la liste des décalages offsetL pour gérer une matrice de
5x5. L'utilisation de cette liste devient indispensable pour éviter
de répéter 25 fois le même code, il faut donc oublier
les notations en N, O, SE, ... pour se contenter d'une simple notations
avec des coordonnées (x,y).
figure 3.) La matrice 5x5 utilisée pour un
flou gaussien en imaging Lingo
Ensuite nous devons désormais implémenter la variation
des coefficients, c'est à dire la variations du paramètre
#blendLevel
utilisé pour chaque copyPixels.
J'ai tout simplement utilisé une liste blendLL pour contenir les
valeurs des différents blendLevels à utiliser. Les deux
listes étant dépendantes, il est important de bien utiliser
la même norme pour indexer les deux listes : si le décalage
de la cellule (3,2) est stocké en offsetL[14], nous lirons sont
opacité avec blendLL[14].
Voici donc la liste offsetL mise à jour, la déclaration
et l'initialisation de la nouvelle liste blendLL :
offsetL = [] -- liste des décalages
blendLL = [] -- liste des blendLevels correspondants
-- opacité = 0
-- je déclare quand même les cases dont le coefficient est
nul
-- pour pouvoir facilement adapter cette fonction à n'importe
-- quelle matrice 5x5
-- x = 5, y = 5
offsetL.add([4,4])
blendLL.add(0)
-- x = 5, y = 1
offsetL.add([4,0])
blendLL.add(0)
-- x = 1, y = 5
offsetL.add([0,4])
blendLL.add(0)
-- x = 1, y = 1
offsetL.add([0,0])
blendLL.add(0)
-- opacité = 3
-- x = 4, y = 5
offsetL.add([3,4])
blendLL.add(3)
-- x = 4, y = 1
<SNIP>
-- x = 3, y = 3 <- centre
offsetL.add([2,2])
blendLL.add(26)
repeat with
j = 1 to 25
-- = offsetL.count
myBlend = blendLL[j] * 1.8
-- 1.8 = facteur de corrections de la
luminosité, de 1.5 à 5
Et voilà nous avons réalisé un flou Gaussien en imaging
Lingo (une démo de cette méthode est placée en bas
de cette page, avec un lien vers les sources)
Regardons maintenant le second exemple, basé sur une matrice asymétrique
contenant des valeurs négatives. La seule difficulté que
nous allons rencontrer pour faire écrire le code qui réalise
cette transformation est la détermination des blendLevels : dans
la syntaxe de copyPixels, le paramètre blendLevel accepte des valeurs
de 0 à 255. Nous devons donc ajouter un test sur le signe de la
valeur contenue dans blendLL, et si la valeur lue est négative,
changer son signe et choisir une encre pour le copyPixels.
Avec cette petite mise à jour, la fin du code écrit ci dessus
devient :
if (myBlend > 0)
then
buffer.copyPixels(startImg, destRect,
myRect, [#blendLevel : myBlend])
else
buffer.copyPixels(startImg, destRect,
myRect, [#blendLevel : -myBlend, #ink
: reverseInk])
end if
Ici j'utilise la variable de type #integer reverseInk. Ceci me permet
de varier les styles de rendus sans changer la matrice, simplement en
changeant l'encre utilisée pour les valeurs négatives. Dans
l'exemple ci dessous j'utilise la matrice vue au début de cet article
sous Photoshop.
figure 4.) Deux implémentations du gestionnaire de convolution
par matrice 5x5 : un flou Gaussien et un comportement de corruption
d'image ;¬)
Director Hors Piste - http://www.director-fr.com - Tous
droits réservés. - (c) 2001 Director Hors Piste - Macromedia
Director est une marque déposée de Macromedia
- Contactez-nous!