Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Éclairer une surface avec l’ombrage diffus

Après cette leçon: Je peux calculer la luminosité diffuse d’un point à partir de sa normale et de la direction de la lumière.

Leçon de 60 min2 commandesLab de vision par ordinateur : pixels, seuils et comptage d’objets dans JupyterLab

Pourquoi une face éclairée est plus claire

L’ombrage diffus donne à une surface une clarté qui dépend de l’angle entre la surface et la lumière. Une face qui regarde la lampe est claire, une face de biais est plus sombre, une face tournée de l’autre côté est noire.

C’est ce qui donne du relief à une sphère dessinée sur un écran plat.

À la fin de cette leçon

Remarque

Je peux calculer la luminosité diffuse d’un point à partir de sa normale et de la direction de la lumière.

Mots clés

MotCe que ça veut dire
Normaleune flèche perpendiculaire à la surface
Vecteur unitaireune flèche de longueur 1
Normaliserdiviser un vecteur par sa longueur
Produit scalaireun nombre qui mesure l’accord de deux flèches
Ombrage diffusune clarté qui dépend de l’angle avec la lumière

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

La normale dit où regarde la surface

En chaque point d’une surface, la normale est une flèche perpendiculaire à elle. Sur le dessus d’une table, elle pointe vers le plafond. Sur une sphère, elle part du centre vers le point.

On donne aussi la direction de la lumière : une flèche qui va du point vers la lampe.

On normalise les deux flèches

Pour comparer deux directions, seule compte la direction, pas la longueur. On divise donc chaque flèche par sa longueur : elle devient un vecteur unitaire.

La longueur de (x, y, z) est la racine de x au carré, plus y au carré, plus z au carré. Pour (0, 3, 4), elle vaut 5 : la flèche normalisée est (0 ; 0,6 ; 0,8).

La clarté est le produit scalaire

Avec deux vecteurs unitaires, le produit scalaire vaut 1 s’ils pointent au même endroit. Il vaut 0 s’ils sont perpendiculaires, et il est négatif s’ils s’opposent.

La luminosité diffuse est ce produit, ramené à 0 s’il est négatif : une face tournée de l’autre côté de la lumière reste noire.

Exemple travaillé : de l’angle au niveau de gris

Angle avec la lumièreLuminositéNiveau de gris (255 fois)
0 degré1255
30 degrés0,866221
60 degrés0,5128 (environ)
90 degrés00
120 degrés0 (négatif, ramené à 0)0

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Calculer une luminosité diffuse

Code: python
# Luminosité diffuse : le produit scalaire de la normale et de la lumière.
normale = [0, 1, 0]
lumiere = [1, 1, 0]
produit = normale[0] * lumiere[0] + normale[1] * lumiere[1] + normale[2] * lumiere[2]
longueur = (lumiere[0] ** 2 + lumiere[1] ** 2 + lumiere[2] ** 2) ** 0.5
print(round(produit / longueur, 3))
# Changez la lumière en [0, 1, 0], puis en [0, -1, 0] : que devient la valeur ?

Calculer la luminosité à 45 degrés

Commande
docker exec jupyter python3 -c "import math; n=(0,1,0); l=(1,1,0); k=math.sqrt(2); lum=(n[0]*l[0]+n[1]*l[1]+n[2]*l[2])/k; print(round(lum,3), round(255*lum))"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Lire le résultat 0.707 et 180

La commande affiche 0.707 180. La lumière (1, 1, 0) est à 45 degrés de la normale (0, 1, 0). Sa longueur est la racine de 2, soit environ 1,414, d’où 1 divisé par 1,414, qui vaut 0,707.

Le gris vaut 255 fois 0,707, soit 180 une fois arrondi : une face de biais, plutôt claire.

Une erreur fréquente

Attention

Beaucoup pensent que le produit scalaire donne la clarté sans autre précaution. Ce n’est pas juste : avec une lumière de longueur 2, on obtiendrait une clarté double. Normalisez toujours les deux flèches avant de calculer le produit.

Calculer la clarté pour cinq angles

Commande
docker exec jupyter python3 -c "import math; print([(a, max(0.0, round(math.cos(math.radians(a)), 3))) for a in (0, 30, 60, 90, 120)])"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

La clarté décroît avec l’angle

La commande affiche [(0, 1.0), (30, 0.866), (60, 0.5), (90, 0.0), (120, 0.0)]. Pour deux vecteurs unitaires, le produit scalaire est le cosinus de l’angle entre eux.

La clarté tombe donc de 1 à 0 quand l’angle va de 0 à 90 degrés, et reste à 0 au-delà.

À propos de ce labo et de sa source: Lab de vision par ordinateur : pixels, seuils et comptage d’objets dans JupyterLab

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.