Imaging Lingo

Faire du flou avec imaging Lingo (2/2)

par Sébastien Portebois

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

  if not myBlend then next repeat

  destRect = myRect.offset(offsetL[j][1], offsetL[j][2])
  buffer.copyPixels(startImg, destRect, myRect, [#blendLevel : myBlend])
end repeat


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 not myBlend then next repeat

destRect = myRect.offset(offsetL[j][1], offsetL[j][2])

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 ;¬)


Les sources (director 8) sont disponibles ici.

Vous pouvez m'envoyer vos commentaires à mailto:jesus@oeilpouroeil.fr, ou en faire profiter tout le monde en réagissant sur la piste : <Pistes-L>.


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!