Chapitre 2: Images INF5071 — Infographie Alexandre Blondin Massé Université du Québec à Montréal Hiver 2019 A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 1 / 66 Plan 1 Images et couleurs 2 Géométrie 2D 3 Générer des images 4 Polices de caractères 5 Manipuler des images A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 2 / 66 Images et couleurs A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 3 / 66 Qu’est-ce qu’une image? • • • • • C’est une représentation visuelle en 2D de quelque chose Généralement de forme rectangulaire Objet statique (non animé) Plusieurs types: noir et blanc, niveau de gris, couleurs, etc. Permet d’encoder de l’information noir et blanc (black and white) A. Blondin Massé (UQAM) niveau de gris (gray scale) Chapitre 2: Images couleurs (colors) INF5071 Hiver 2019 4 / 66 Deux principaux formats Vectoriel • Contenu décrit mathématiquement • Utilise des primitives géométriques (lignes, ellipses, arcs, courbes de Bézier, texte, …) • La qualité s’adapte aux transformations (changement d’échelle, rotations, etc.) • Doit être transformé sous forme matricielle avant le rendu (rendering) Matriciel • • • • Contenu décrit pixel par pixel Canevas rectangulaire (largeur × hauteur) Sensible aux transformations (changements d’échelle, …) Le rendu se fait généralement rapidement A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 5 / 66 Quelques formats de fichier • 1987: GIF = Graphics Interchange Format, format bitmap compressé sans perte à l’aide de l’algorithme LZW (breveté en 1985), créé par CompuServe • 1992: JPEG = Joint Photographic Experts Group, format bitmap compressé avec perte à l’aide d’une transformée en cosinus discrète, développé par le groupe du même nom • 1993: PDF = Portable Document Format, format ouvert en 2008, développé par Adobe, successeur de PostScript • 1996: PNG = Portable Network Graphics, format bitmap ouvert, développé par le PNG Development Group • 1999: SVG = Scalable Vector Graphics, un format ouvert développé par le Word Wide Web Consortium (W3C) • 2005: PGF/TikZ = Portable Graphics Format/TikZ ist kein Zeichenprogramm, un format vectoriel compatible avec TeX/LaTeX, créé par Till Tantau A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 6 / 66 Type de média (MIME-type) Ces formats sont généralement bien reconnus: $ file * godot -logo.gif: GIF image data , version 89a, 138 x 129 godot -logo.jpeg: JPEG image data , JFIF standard 1.01 , aspect ratio , density 1x1 , segment length 16, baseline , precision 8, 138 x129 , frames 3 godot -logo.pdf: PDF document , version 1.4 godot -logo.png: PNG image data , 138 x 129 , 8-bit/color RGBA , non - interlaced godot -logo.svg: SVG Scalable Vector Graphics image $ file --mime -type * godot -logo.gif: image /gif godot -logo.jpeg: image /jpeg godot -logo.pdf: application /pdf godot -logo.png: image /png godot -logo.svg: image /svg+xml A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 7 / 66 Systèmes de couleur • RYB = Red Yellow Blue, un système additif • RGB = Red Green Blue, un système soustractif, sans doute le plus utilisé • CMYK = Cyan Magenta Yellow blacK, un système additif, utilisé surtout avec les imprimantes • HSI/HSV/HSL = Hue Saturation Intensity/Value/Lightness, des modèles qui semblent plus intuitifs pour les humains espace RGB (cube) Source: Wikipedia A. Blondin Massé (UQAM) système CMYK (diagramme de Venn) Chapitre 2: Images espace HSV (cylindre) Source: Wikipedia INF5071 Hiver 2019 8 / 66 Systèmes RGB et HSI Représentation • • • • Dans le système RGB, une couleur est un triplet (r, g, b) De la même façon, dans le système HSI, c’est un triplet (h, s, i) En théorie, chaque composante est entre 0 et 1 En pratique, entre 0 et 2d − 1, où d est appelé profondeur de couleur Changement de variables r+g+b 3 3 min{r, g, b} s = 1− r+g+b i = (r − g) + (r − b) h = arccos √ 2 (r − g)2 + (r − b)(g − b) A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 9 / 66 Transparence • • → → • • • • La plupart des modèles de couleur proposent un 4e canal Appelé canal alpha, souvent représenté par la variable a a = 1: la couleur est opaque a = 0: la couleur est transparente L’acronyme RGBA permet de préciser la présence de ce 4e canal Utilise pour superposer/combiner plusieurs images Ou encore pour contrôler leur visibilité Souvent, l’arrière-plan est transparent, identifié par un damier disques transparents arrière-plan transparent A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 10 / 66 Considérations artistiques Théorie de la couleur • « Psychologie » des couleurs (chaudes, froides, dynamiques, …) • Couleurs complémentaires • Différentes théories sur la meilleure façon d’arranger des couleurs • Schémas/thèmes de couleur (color schemes) • Varie d’une culture à une autre À éviter/à utiliser avec parcimonie • Plusieurs couleurs de teintes différentes • Les couleurs ayant des teintes proches • Les couleurs saturées A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 11 / 66 Géométrie 2D A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 12 / 66 Points et vecteurs • • • • Plan euclidien: c’est l’ensemble R2 = R × R Point: un élément P = (Px , Py ) de R2 Vecteur: un élément #» u = (u1 , u2 ) de R2 √ Norme: si #» u est un vecteur, alors ∥ #» u ∥ = u21 + u22 Opérations Soient P = (Px , Py ), Q = (Qx , Qy ) des points, #» u = (u1 , u2 ), #» v = (v1 , v2 ) des vecteurs et k ∈ R #» • Différence de points: Q − P = PQ = (Qx − Px , Qy − Py ) • Somme/différence de vecteurs: #» u ± #» v = (u1 ± v1 , u2 ± v2 ) #» • Point plus vecteur: P ± u = (Px ± u1 , Py ± u2 ) • Multiplication par un scalaire: k #» u = (ku1 , ku2 ) • Produit scalaire entre deux vecteurs: #» u · #» v =u v +u v 1 1 2 2 Note: P + Q n’est pas définie!! A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 13 / 66 Trois transformations importantes Il est pratique de représenter un point par un vecteur colonne: [ ] P= x y • Translation de vecteur v ∈ R2 : [ ] [ ] x x + #» v 7→ y y • Rotation d’angle θ en sens anti-horaire autour de l’origine: [ ] [ cos θ − sin θ x 7→ y sin θ cos θ ][ ] x y • Changement d’échelle de facteurs a ∈ R et b ∈ R: [ ] [ a 0 x 7→ 0 b y A. Blondin Massé (UQAM) Chapitre 2: Images ][ ] x y INF5071 Hiver 2019 14 / 66 Rotations 2D Source: https://xkcd.com/184/ A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 15 / 66 Lieux géométriques • • → → → Lieu géométrique: un sous-ensemble de R2 Dimension: ≈ degré de liberté 0D: longueur = 0 1D: longueur ̸= 0, aire = 0 2D: aire ̸= 0 Exemples de lieux géométriques • 0D: point, ensemble de points isolés • 1D: segment, droite, demi-droite, cercle, ellipse, parabole, … • 2D: disque, rectangle plein, demi-plan, plan, … A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 16 / 66 Décrire un lieu géométrique • En mots: le segment de droite reliant les points (10, 30) et (60, −20) • À l’aide d’une (in)équation cartésienne: le cercle de rayon 6 centré en (20, −40) est défini par l’équation (x − 20)2 + (y + 40)2 = 36 • À l’aide d’une (in)équation vectorielle: si #» v est un vecteur non nul et P0 un point, alors l’unique droite ∆ passant par P0 dans la direction de #» v est donné par l’ensemble ∆ = {P ∈ R2 | P = P0 + t #» v, A. Blondin Massé (UQAM) Chapitre 2: Images t ∈ R} INF5071 Hiver 2019 17 / 66 Lieux géométriques linéaires Soit P0 un point et #» v un vecteur non nul • Droite: l’unique droite ∆ qui passe par P0 dans la direction de #» v est ∆ = {P ∈ R2 | P = P0 + t #» v , t ∈ R} • Demi-droite: l’unique demi-droite H qui démarre en P0 dans la direction de #» v est H = {P ∈ R2 | P = P0 + t #» v, t ∈ R+ } • Segment: si P1 est un point distinct de P0 , alors l’unique segment qui relie P0 et P1 est S = {P ∈ R2 | P = P0 + (P1 − P0 )t, A. Blondin Massé (UQAM) Chapitre 2: Images t ∈ [0, 1]} INF5071 Hiver 2019 18 / 66 Question sur les lieux géométriques linéaires (1/3) P P1 P0 • Soient P0 = (x0 , y0 ), P1 = (x1 , y1 ) et P = (x, y) • Comment décide-t-on si P appartient à la droite ou le segment qui passent par P0 et P1 ? • Solution cartésienne: on cherche s’il existe t telle que (x, y) = (x0 , y0 ) + (x1 − x0 , y1 − y0 )t • Question avec P0 = (1, 3), P1 = (5, −5) et P = (3, 6)? A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 19 / 66 Question sur les lieux géométriques linéaires (2/3) P P1 P0 • D’un point de vue informatique, il y a mieux • Il suffit de réfléchir de façon vectorielle # » # » • Quelle devrait être la relation entre P0 P et P0 P1 ? A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 20 / 66 Question sur les lieux géométriques linéaires (2/3) P P1 P0 • • • → • D’un point de vue informatique, il y a mieux Il suffit de réfléchir de façon vectorielle # » # » Quelle devrait être la relation entre P0 P et P0 P1 ? ils doivent être colinéaires! Opération sur les vecteurs qui permet de vérifier ça? A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 20 / 66 Question sur les lieux géométriques linéaires (2/3) P P1 P0 • • • → • → D’un point de vue informatique, il y a mieux Il suffit de réfléchir de façon vectorielle # » # » Quelle devrait être la relation entre P0 P et P0 P1 ? ils doivent être colinéaires! Opération sur les vecteurs qui permet de vérifier ça? le produit vectoriel! A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 20 / 66 Produit vectoriel Définition • Soient #» u = (u1 , u2 , u3 ) et #» v = (v1 , v2 , v3 ) • Alors le produit vectoriel de #» u et #» v est #» #» #» i j k #» u × #» v = u1 u2 u3 = (u2 v3 − u3 v2 , u3 v1 − u1 v3 , u1 v2 − u2 v1 ) v1 v2 v3 • Si les vecteurs sont en 2D, on met leur 3e composante à 0 Propriété #» Les vecteurs #» u et #» v sont colinéaires si et seulement si #» u × #» v = 0 A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 21 / 66 Question sur les lieux géométriques linéaires (3/3) P P1 P0 • On a donc que P appartient à la #» #» i j x − x0 y − y0 x1 − x0 y1 − y0 droite si et seulement si #» k 0 = (0, 0, 0) 0 si et seulement si (x − x0 )(y1 − y0 ) = (y − y0 )(x1 − x0 ) • Segment? A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 22 / 66 Question sur les lieux géométriques linéaires (3/3) P P1 P0 • On a donc que P appartient à la #» #» i j x − x0 y − y0 x1 − x0 y1 − y0 • → → → droite si et seulement si #» k 0 = (0, 0, 0) 0 si et seulement si (x − x0 )(y1 − y0 ) = (y − y0 )(x1 − x0 ) Segment? On vérifie d’abord si P est sur la droite Puis on calcule t = (x − x0 )/(x1 − x0 ) ou t = (y − y0 )/(y1 − y0 ) On se trouve sur le segment si et seulement si t ∈ [0, 1] A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 22 / 66 Cercles (h, k) r • Soit O = (h, k) un point et r ≥ 0 un réel • Alors il existe un unique cercle C de rayon r centré en O • Équation cartésienne: (x − h)2 + (y − k)2 = r2 A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 23 / 66 Question sur les cercles • Soit C un cercle de centre O et de rayon r • Soit P un point quelconque • Comment décide-t-on si P est sur le cercle? à l’intérieur du cercle? à l’extérieur du cercle? A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 24 / 66 Question sur les cercles • Soit C un cercle de centre O et de rayon r • Soit P un point quelconque • Comment décide-t-on si P est sur le cercle? à l’intérieur du cercle? à l’extérieur du cercle? → Plus pratique d’avoir une définition vectorielle: { C = P ∈ R2 } #» OP = r #» 2 #» #» → On calcule OP = OP · OP #» 2 → Si OP < r2 , alors on est à l’intérieur #» 2 → Si OP = r2 , alors on est sur le cercle #» 2 → Si OP > r2 , alors on est à l’extérieur A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 24 / 66 Coordonnées polaires (1/2) r (x, y) r θ θ • Certains lieux géométriques ont une structure liée à des cercles • Il est donc plus facile de les décrire en coordonnées polaires • Cartésiennes: abscisse x et ordonnée y • Polaires: distance r et angle θ A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 25 / 66 Coordonnées polaires (2/2) • • • • Soit P un point On écrit P = (x, y) en coordonnées cartésiennes Et P = (r : θ) en coordonnées polaires Les relations entre x, y, r et θ sont décrites par les formules suivantes: x = r cos θ y = r sin θ √ x2 + y2 ( ) y θ = arctan x r = A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 26 / 66 Exemples sur les coordonnées polaires • Le cercle C de centre (0, 0) et de rayon r devient simplement C = {(r : θ) | 0 ≤ θ < 2π} • L’arc de cercle A autour de (0, 0), de rayon r et entre les angles θ1 et θ2 est donc A = {(r : θ) | θ1 ≤ θ ≤ θ2 } • La demi-droite D partant de (0, 0) en direction du vecteur non nul #» u = (u1 , u2 )? A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 27 / 66 Conique • Courbe qu’on peut obtenir par section d’un cône • Équation cartésienne polynomiale de degré au plus 2 Trois coniques non dégénérées • Ellipses (cas particulier du cercle) • Paraboles • Hyperboles Cas dégénérés • • • • Point Segment Demi-droite Droite A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 28 / 66 Courbe générale Fonction vectorielle • C’est une fonction qui retourne un vecteur • On ajoute souvent une flèche sur la fonction pour insister Courbe paramétrée • • → → → Soit C une courbe continue Alors il existe deux réels a et b, avec a < b deux fonctions réelles x, y : [a, b] → R et une fonction vectorielle #» r : [a, b] → R2 t 7→ (x(t), y(t)) dont C est l’image, c’est-à-dire que C = #» r ([a, b]) A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 29 / 66 Exemples de courbes paramétrées • Le segment qui relie deux points P0 et P1 est l’image de #» r (t) = P0 + (P1 − P0 )t, 0 ≤ t ≤ 1 • Le cercle de rayon r centré à l’origine est l’image de #» r (t) = r(cos t, sin t), 0 ≤ t ≤ 2π • Le rectangle de coins (0, 0), (100, 0), (100, 200) et (0, 200): (100t, 0) (100, 200(t − 1)) si si #» r (t) = (100(3 − t), 200) si (0, 200(4 − t)) si 0≤t≤1 1≤t≤2 2≤t≤3 3≤t≤4 • L’ellipse de rayons a, b, centrée en (h, k), est l’image de #» r (t) = (h, k) + (a cos t, b sin t), 0 ≤ t ≤ 2π A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 30 / 66 Courbes de Bézier quadratique cubique • • • • Courbes très utilisées en infographie Elles sont décrites par des polynômes de degré d Segment = courbe de Bézier où le degré du polynôme est d = 1 En pratique, on utilise surtout les courbes de Bézier quadratiques (d = 2) et cubiques (d = 3) • Représentation: à l’aide de d + 1 points de contrôle A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 31 / 66 Courbe de Bézier quadratique • • • • • Trois points de contrôle P0 , P1 et P2 L’ordre d’énumération est important Débute en P0 et termine en P2 ; On ne passe pas par le point P1 , mais on s’en approche Paramétrisation: #» #» #» #» r (t) = P0 (1 − t)2 + 2P1 t(1 − t) + P2 t2 , 0 ≤ t ≤ 1 • Exemple avec P0 = (0, 0), P1 = (1, 3) et P2 = (4, 2): (1, 3) (4, 2) (0, 0) A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 32 / 66 Courbe de Bézier cubique • Quatre points de contrôle P0 , P1 , P2 et P3 • Débute en P0 et termine en P3 ; • Paramétrisation: pour 0 ≤ t ≤ 1, #» #» #» #» #» r (t) = P0 (1 − t)3 + 3P1 t(1 − t)2 + 3P2 t2 (1 − t) + P3 t3 • Exemple avec P0 = (0, 0), P1 = (1, 3), P2 = (4, 2) et P3 = (5, −1): (1, 3) (4, 2) (0, 0) (5, −1) A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 33 / 66 Générer des images A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 34 / 66 Trois stratégies À la main • En utilisant un logiciel de dessin • Ou en apportant des correctifs manuels à une autre image De façon semi-automatique • En décrivant mathématiquement le dessin (SVG, PGF/TikZ) • En scriptant à l’aide de logiciels (Krita, Gimp, Inkscape, Blender, …) Par programmation • En utilisant des applications (exemple ImageMagick) • En utilisant une bibliothèque graphique (exemple Cairo, Pillow) • En appliquant des filtres (exemple G’MIC) A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 35 / 66 Feuilles de sprites • • • • C’est simplement une image Qui permet de rassembler et d’organiser plusieurs images Généralement de façon logique Très utile pour les jeux basés sur des tuiles ensemble de tuiles A. Blondin Massé (UQAM) sprite animée Chapitre 2: Images INF5071 Hiver 2019 36 / 66 Création de feuilles de sprites Plusieurs façons • À partir d’images vectorielles, facilite l’organisation logique • Ou d’images matricielles en utilisant des grilles et des couches • On peut ensuite les agencer à l’aide d’un éditeur de cartes (Tiled par exemple) Démonstration: exemple avec Blender • • • • Permet de facilement générer des tuiles isométriques Autant pour générer des tuiles statiques… …que des tuiles animées Voir Isometric Tiles in Blender de C. Bellanger A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 37 / 66 Le format SVG Qu’est-ce que c’est? • • • • • • • • SVG = Scalable Vector Graphics Format vectoriel ouvert Développé depuis 1999 Par le Word Wide Web Consortium (W3C) Supporté par la plupart des navigateurs Supporte les filtres Supporte les animations Utilisé par Inkscape pour la sauvegarde Références • Tutoriel introductif • Documentation officielle A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 38 / 66 Primitives géométriques • • • • • → → • segment (line) d’un point (x1 , y1 ) à un point (x2 , y2 ) rectangle de coin (x, y) et de dimensions w × h cercle de centre (h, k) et de rayon r ellipse de centre (h, k) et de rayons a, b polysegment (polyline) une suite de points ((xi , yi ))i=1,...,n fermé: la courbe revient à son point de départ ouvert: dans le cas contraire texte de coin (x, y), avec une police de taille spécifique Remarques • Le coin est souvent celui en haut, à gauche • On peut contrôler la couleur du trait, de remplissage • De façon plus générale, on peut modifier le trait (stroke) A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 39 / 66 Exemple: primitives géométriques <svg xmlns="http: //www.w3.org /2000/ svg" height="200" width="1000"> <rect x="10" y="10" width="180" height="180" stroke="blue" stroke -width="3" fill="#FFFF00"/> <line x1="210" y1="10" x2="390" y2="180" stroke="blue" stroke -width="5"/> <rect x="410" y="10" width="180" height="180" stroke="orange" stroke -width="3" fill="#FFFFFF"/> <text x="420" y="130" font -size="80" fill="orange">SVG</text > <polyline fill="red" stroke="blue" stroke -width="3" points="610 ,100 700 ,10 790 ,100 700 ,190 610 ,100"/> <circle cx="850" cy="50" r="20" stroke="blue" fill="cyan"/> <circle cx="850" cy="150" r="30" stroke="red" fill="orange"/> <ellipse cx="950" cy="100" rx="40" ry="70" stroke="black" fill="white"/> </svg> A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 40 / 66 Chemins • La notion de chemin (path) est une généralisation des primitives géométriques • Disponible dans tout format vectoriel • Décrit essentiellement un tracé • Différents types de sous-chemins: → déplacement (moveto): sans tracer → ligne (lineto): segment → arc: arc de cercle ou d’ellipse → courbe de Bézier: quadratique ou cubique → fermeture: pour boucler le chemin • Prend aussi en compte des attributs supplémentaires: → style du trait: couleur, style, marqueur, terminaisons, jointures, opacité → remplissage: couleur, gradient, motif A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 41 / 66 Sous-chemins dans le format SVG • M x y: se déplacer sans trait à (x,y) • L x y: tracer un segment jusqu’à (x,y) • A rx ry a f1 f2 x y: tracer un arc elliptique jusqu’à (x,y), l’ellipse ayant des rayons (rx,ry), inclinée selon l’angle a et { f1 = 0, 1, pour l’arc court; pour l’arc long, { f2 = 0, pour le sens anti-horaire; 1, pour le sens horaire. • Q x1 y1 x2 y2: tracer une courbe de Bézier quadratique jusqu’à (x2,y2) avec point de contrôle (x1,y1) • C x1 y1 x2 y2 x3 y3: tracer une courbe de Bézier cubique jusqu’à (x3,y3) avec points de contrôle (x1,y1) et (x2,y2) • Z ou z pour refermer un chemin Note: les lettres M, L, A, Q, C peuvent être remplacées par m, l, a, q, c pour que les coordonnées soient relatives au point courant A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 42 / 66 Exemple: chemins <svg xmlns="http: //www.w3.org /2000/ svg" height="200" width="800"> <path d="M 10 50 l 0 100 l 40 40 l 100 0 l 40 -40 l 0 -100 l -40 -40 l -100 0 z" fill="white" stroke="red" stroke -width="2"/> <circle cx="300" cy="100" r="90" fill="cyan" stroke="blue" stroke -width="3"/> <path d="M 210 100 a 90 90 0 0 0 90 -90 a 90 90 0 0 0 90 90 a 90 90 0 0 0 -90 90 a 90 90 0 0 0 -90 -90 z" stroke="blue" fill="orange" stroke -width="3"/> <path d="M 410 50 q 190 200 380 0" stroke="red" stroke -width="5" fill="none"/> <path d="M 410 150 c 50 50 100 -150 190 -140 c 100 -10 100 150 190 140 " stroke="green" stroke -width="5" fill="none"/> </svg> A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 43 / 66 PGF/TikZ \begin{tikzpicture} \draw[blue , dotted] (0,0) grid (10 ,3); \draw[red , very thick , ->] (0,0) -- ++ (4,0) -++ (0,1) -- ++ (3,0) -- ++ (0,2) -- ++ (3,0) -++ (0,-2) -- ++ (-1,0); \end{tikzpicture} • • • • • • PGF = Portable Graphics TikZ = TikZ ist kein Zeichenprogramm Documentation officielle: PGF/TikZ Développé depuis 2005 Créé par Till Tantau, le créateur de Beamer Aussi développé par Christian Feuersänger A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 44 / 66 Exemple: primitives géométriques TikZ \begin{tikzpicture} \draw[draw=blue , fill=yellow , thick] (0.1 ,0.1) rectangle (1.9 ,1.9); \draw[draw=blue , very thick] (2.1 ,1.9) -- ++ (1.8 , -1.8); \draw[draw=orange , thick] (4.1 ,0.1) rectangle (5.9 ,1.9); \node at (5,1) {\ huge\color{orange}TikZ }; \draw[draw=blue , fill=red , thick] (6.1 ,1) -- (7 ,0.1) -- (7.9 ,1) -- (7 ,1.9) -- (6.1 ,1); \draw[draw=blue , fill=cyan] (8.5 ,1.5) circle (0.2 cm); \draw[draw=red , fill=orange] (8.5 ,0.5) circle (0.3 cm); \draw[draw=black , fill=white] (9.5 ,1.0) ellipse (0.4 cm and 0.7cm); \end{tikzpicture} A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 45 / 66 Exemple: dessiner une étoile \usetikzlibrary{math} \begin{tikzpicture} % Variables \newdimen\r1 \newdimen\r2 \tikzmath{ \n = 7; % Nombre de pointes \r1 = 0.3cm; % Rayon intérieur \r2 = 0.5cm; % Rayon extérieur \a = 180 / \n; % Angle entre pointes } % On trace l'étoile \draw[draw=blue , very thick , fill=blue !20] (0:\r1) \foreach \i in {1,2,...,\n} { -- (2*\a*\i-\a:\r2) -- (2*\a*\i:\r1) }; % Puis les cercles pour visualiser \draw[dashed] (0,0) circle (\r1); \draw[dashed] (0,0) circle (\r2); \end{tikzpicture} • Noter l’utilisation des coordonnées polaires • Simplifie grandement la description • On peut scripter (boucle foreach) dans les commandes A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 46 / 66 Cairo • Site officiel: https://www.cairographics.org/ • Licence: LGPL (Lesser General Public License) ou MPL (Mozilla Public License) • En C, mais utilisable dans la plupart des langages • Modèle en 3 couches destination A. Blondin Massé (UQAM) source Source: Cairo masque Chapitre 2: Images INF5071 Hiver 2019 47 / 66 Polices de caractères A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 48 / 66 Généralités • Glyphe (glyph): représentation graphique d’un caractère ou d’un accent • Fonte de caractères (fonts) = ensemble de glyphes • Police de caractère = ensemble de fontes de caractères • Empattement: avec ou sans (serif) • Corps: tailles • Graisse: gras, épaisseur • Style: romain, italique, ombré, décoratif Considérations artistiques • Prioriser l’harmonie entre lettres plutôt que chaque lettre • Uniformiser les caractéristiques pour tous les caractères A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 49 / 66 Terminologie Source: Wikipedia 1) 2) 3) 4) 5) 6) 7) hauteur x ligne d’ascension apex ligne de base ascension croisement stem A. Blondin Massé (UQAM) 8) empattement 9) patte 10) bowl 11) counter 12) collet 13) boucle 14) oreille Chapitre 2: Images 15) 16) 17) 18) 19) 20) cravate ligne horizontale bras ligne verticale hauteur de majuscule ligne de descente INF5071 Hiver 2019 50 / 66 Formats Polices matricielles • • • • Représentées à l’aide d’images matricielles La définition (résolution) est fixe Le rendu est très rapide Souvent utilisé dans les jeux vidéos Polices vectorielles • Plus flexibles, le rendu s’adapte au contexte • Basées principalement sur les courbes de Bézier • Polices PostScript: Adobe (Type 1 et Type 3), Metafont/Metapost • Polices TrueType (extension .ttf): Apple et Microsoft • Polices OpenType (extension .otf): plus récentes, effort conjoint A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 51 / 66 Classement des polices Typographie • • • • • Thibaudeau Vox-Atypi Novarese Alessandrini Chinoise, … W3C • • • • • serif: à empattement sans-serif: sans empattement cursive: simule l’écriture manuscrite fantasy: décorative monospace: à largeur fixe A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 52 / 66 Créer des polices: FontForge • • • • Site officiel: http://fontforge.github.io/ Licence: GPLv3 La solution libre principale pour créer des fontes Excellent tutoriel disponible dans la documentation A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 53 / 66 Manipuler des images A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 54 / 66 Plusieurs traitements complémentaires • Pixel à pixel (point process): traitement se fait sur chaque pixel, indépendamment de ses voisins • Convolutions et filtres (area process): traitement d’un pixel dépend de ses voisins • Transformation géométriques (geometric process): rotations, changements d’échelle, réflexions, interpolation, dilatation • Combinaison d’images (frame process): addition, soustraction, mixte, masque, découpage • Traitement de signal: domaine de fréquence (spectre), transformée de Fourier discrète, transformée du cosinus discrète • Compression d’images… A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 55 / 66 Logiciels et applications Applications graphiques • Le traitement se fait en manipulant des couches (layers) • Exemples: Gimp, Photoshop • Avantages: rétroaction visuelle, plus intuitif, ne nécessite pas de connaissances en programmation Par programmation • → → • → • En ligne de commande: ImageMagick (convert, montage) G’MIC = GREYC’s Magic for Image Computing Ou avec des bibliothèques graphiques: Cairo, Pillow, ImageMagick, libgmic, libpng Avantages: généralement plus rapide, permet de conserver une trace des opérations effectuées A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 56 / 66 Traitement pixel à pixel • On agit sur chaque pixel indépendamment de ses voisins • On peut aussi agir sur un seul canal: • Généralement rapide: importation de l’image, traitement ponctuel, exportation de l’image #» • Mathématiquement, il s’agit de fonctions vectorielles T de la forme #» T : [0, 1]3 → [0, 1]3 (r, g, b) 7→ (R(r, g, b), G(r, g, b), B(r, g, b)) • Par exemple, quelle est la transformation associée à la fonction suivante? #» T(r, g, b) = A. Blondin Massé (UQAM) ( r+g+b r+g+b r+g+b , , 3 3 3 Chapitre 2: Images INF5071 ) Hiver 2019 57 / 66 Exemples: ImageMagick • Inversion de couleurs: (r, g, b) 7→ (1 − r, 1 − g, 1 − b) $ convert images /gimp -logo.png -negate negate .png • Canal rouge à 1/2: (r, g, b) 7→ (1/2, g, b) $ convert images /gimp -logo.png -channel red \ -fx "1/2" red.png • Colorisation avec la couleur (r′ , g′ , b′ ) avec proportions (x, y, z): (r, g, b) 7→ ((1 − x)r + xr′ , (1 − y)g + yg′ , (1 − z)b + zb′ ) $ convert images /gimp -logo.png -fill yellow \ -colorize 50 ,50 ,50 gimp -logo - colorize .png $ convert images /gimp -logo.png \ -channel red -fx "0.5 * u.r + 0.5 * 1.0" \ -channel green -fx "0.5 * u.g + 0.5 * 1.0" \ -channel blue -fx "0.5 * u.b + 0.5 * 0.0" \ gimp -logo - colorize2 .png A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 58 / 66 Question sur les traitements pixel à pixel (1/2) Exprimez chacune des transformations précédentes sous forme matricielle: • (r, g, b) 7→ ( r+g+b r+g+b r+g+b , 3 , 3 3 A. Blondin Massé (UQAM) ) Chapitre 2: Images INF5071 Hiver 2019 59 / 66 Question sur les traitements pixel à pixel (1/2) Exprimez chacune des transformations précédentes sous forme matricielle: • (r, g, b) 7→ ( r+g+b r+g+b r+g+b , 3 , 3 3 ) r 1/3 1/3 1/3 r g 7→ 1/3 1/3 1/3 g b 1/3 1/3 1/3 b • (r, g, b) 7→ (1 − r, 1 − g, 1 − b) A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 59 / 66 Question sur les traitements pixel à pixel (1/2) Exprimez chacune des transformations précédentes sous forme matricielle: • (r, g, b) 7→ ( r+g+b r+g+b r+g+b , 3 , 3 3 ) r 1/3 1/3 1/3 r g 7→ 1/3 1/3 1/3 g b 1/3 1/3 1/3 b • (r, g, b) 7→ (1 − r, 1 − g, 1 − b) r 1 r g 7→ 1 − g b 1 b A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 59 / 66 Question sur les traitements pixel à pixel (2/2) • (r, g, b) 7→ (1/2, g, b) A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 60 / 66 Question sur les traitements pixel à pixel (2/2) • (r, g, b) 7→ (1/2, g, b) r 1/2 0 0 0 r g 7→ 0 + 0 1 0 g b 0 0 0 1 b • (r, g, b) 7→ ((1 − x)r + xr′ , (1 − y)g + yg′ , (1 − z)b + zb′ ) A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 60 / 66 Question sur les traitements pixel à pixel (2/2) • (r, g, b) 7→ (1/2, g, b) r 1/2 0 0 0 r g 7→ 0 + 0 1 0 g b 0 0 0 1 b • (r, g, b) 7→ ((1 − x)r + xr′ , (1 − y)g + yg′ , (1 − z)b + zb′ ) 1−x 0 0 r r x 0 0 r′ ′ 1−y 0 g g 7→ 0 y 0 g + 0 0 0 1−z b b 0 0 z b′ A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 60 / 66 Traitements géométriques • Rotations (-rotate <angle>) • Réflexions (-flip, -flop, -transpose) • Changements d’échelle (-scale) # Rotations $ convert images /gimp -logo.png -rotate 20 rotate +20. png $ convert images /gimp -logo.png -rotate -30 rotate -30. png # $ $ $ Réflexions convert images /gimp -logo.png -flip horizontal .png convert images /gimp -logo.png -flop vertical .png convert images /gimp -logo.png -transpose transpose .png # Changements d' échelle $ convert images /gimp -logo.png -scale '20%' minify .png $ convert images /gimp -logo.png -scale '500% ' magnify .png A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 61 / 66 Convolutions • • → → • Chaque pixel est calculé en fonction de ses voisins Permet de créer différents effets flous détection d’arêtes L’idée est d’utiliser une matrice carrée de poids w1,1 w1,2 · · · w1,n w2,1 w2,2 · · · w2,n W= .. .. .. .. . . . . wn,1 wn,2 · · · wn,n • La matrice est généralement d’ordre impair • Aussi, si la somme des poids est égale à 1, on préserve l’intensité • La matrice est appelée masque de convolution A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 62 / 66 Balayage et limites • Pour appliquer une convolution, on balaye chaque pixel • Le nouveau pixel est obtenu en fonction de ses voisins • En tenant compte du masque Traitement des bordures • Valeur par défaut aux pixels hors image • Ne pas toucher aux pixels limites • Supposer que l’image est périodique A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 63 / 66 Exemple: masque de flou • Masques 3 × 3: 1/9 1/9 1/9 1/9 1/9 1/9 , 1/9 1/9 1/9 1/16 1/8 1/16 1/8 1/4 1/8 1/16 1/8 1/16 • Masques 5 × 5: 1/25 1/25 1/25 1/25 1/25 A. Blondin Massé (UQAM) 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 Chapitre 2: Images 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 INF5071 Hiver 2019 64 / 66 Exemple: masque de contraste (sharpening) • Masques communs: 0 −1 0 −1 5 −1 , 0 −1 0 1 −2 1 −2 5 −2 , 1 −2 1 −1 −1 −1 −1 9 −1 −1 −1 −1 • Masques haute définition: −1/9 −1/9 −1/9 −1/9 8/9 −1/9 −1/9 −1/9 −1/9 A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 65 / 66 Exemples: convolutions avec ImageMagick # Application d'un flou $ convert images /gimp -logo.png -define convolve : scale =!\ -morphology Convolve Octagon :2 gimp -logo - convolve .png # Détection des arêtes $ convert images /gimp -logo.png\ -define convolve : scale = '50%! ' -bias '50% '\ -morphology Convolve Sobel -solarize '50% '\ -level '50,0%' gimp -logo - edges .png On peut ensuite combiner les résultats: $ composite -compose difference images /gimp -logo.png\ gimp -logo -edges.png gimp -logo - difference .png A. Blondin Massé (UQAM) Chapitre 2: Images INF5071 Hiver 2019 66 / 66