Telechargé par Arcomlex Arc

02-images

publicité
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
Téléchargement