Traitement d'image et filtres

Les filtres Instagram, le mode portrait de votre smartphone, la detection de visages... Tout ca repose sur des algorithmes de traitement d'image qui manipulent les pixels selon des regles mathematiques precises !

Difficulte:
30 min
+40 XP

Principe fondamental

Operation ponctuelle : nouveau_pixel = f(pixel)
Convolution : nouveau_pixel = somme(voisins x noyau)
Les filtres Instagram utilisent ces principes mathematiques !

Objectifs du cours

  • Comprendre le principe des operations sur les pixels
  • Maitriser les concepts de filtrage et de convolution
  • Savoir appliquer des filtres avec Python et Pillow
  • Comprendre les filtres classiques : flou, nettete, detection de contours

Erreurs courantes a eviter

  • Confondre modification de couleur et filtrage spatial
  • Oublier que les filtres modifient les pixels en fonction de leurs voisins
  • Ne pas comprendre que la taille du noyau affecte le resultat
  • Appliquer des filtres sur l'image originale au lieu d'une copie

**Principe fondamental**

Le traitement d'image consiste a modifier les valeurs des pixels selon des regles mathematiques.

**Types d'operations**

**1. Operations ponctuelles (pixel par pixel)** - Modifier chaque pixel independamment - Exemples : luminosite, contraste, negatif - Formule : nouveau_pixel = f(ancien_pixel)

**2. Operations de voisinage (filtrage)** - Modifier chaque pixel en fonction de ses voisins - Exemples : flou, nettete, detection de contours - Utilise une "fenetre" ou "noyau" de convolution

**3. Operations globales** - Analysent l'image entiere - Exemples : histogramme, egalisation

**Operations ponctuelles courantes**

**Luminosite** : ajouter une constante - Eclaircir : pixel + 50 - Assombrir : pixel - 50

**Contraste** : multiplier par un facteur - Augmenter : pixel * 1.5 - Reduire : pixel * 0.7

**Negatif** : inverser les valeurs - nouveau = 255 - ancien

**Seuillage (binarisation)** : tout ou rien - Si pixel > seuil : blanc (255) - Sinon : noir (0)

**Attention aux bornes**

Les valeurs doivent rester entre 0 et 255 : - pixel + 100 = 300 -> 255 (saturation) - pixel - 100 = -50 -> 0 (clipping)

**Traitement des couleurs**

Pour une image RGB : - Appliquer l'operation sur chaque canal (R, G, B) - Ou convertir en niveaux de gris d'abord

Python - Traitement d'image
# Operations de base sur les pixels

def ajuster_luminosite(pixel, delta):
    """Ajoute une valeur a la luminosite du pixel."""
    # Clamp entre 0 et 255
    return max(0, min(255, pixel + delta))

def ajuster_contraste(pixel, facteur):
    """Multiplie le pixel par un facteur de contraste."""
    # Centrer sur 128, multiplier, recentrer
    nouveau = int(128 + (pixel - 128) * facteur)
    return max(0, min(255, nouveau))

def negatif(pixel):
    """Inverse la valeur du pixel."""
    return 255 - pixel

def seuillage(pixel, seuil=128):
    """Binarise le pixel (noir ou blanc)."""
    return 255 if pixel > seuil else 0

def niveaux_gris(r, g, b):
    """Convertit un pixel RGB en niveau de gris."""
    # Formule standard (luminance)
    return int(0.299 * r + 0.587 * g + 0.114 * b)

print("=== OPERATIONS SUR LES PIXELS ===\n")

# Pixel de test
pixel_test = 100

print(f"Pixel original : {pixel_test}\n")

# Luminosite
print("LUMINOSITE :")
print(f"  + 50 = {ajuster_luminosite(pixel_test, 50)}")
print(f"  - 50 = {ajuster_luminosite(pixel_test, -50)}")
print(f"  + 200 = {ajuster_luminosite(pixel_test, 200)} (saturation)")

# Contraste
print("\nCONTRASTE :")
print(f"  x 1.5 = {ajuster_contraste(pixel_test, 1.5)}")
print(f"  x 0.5 = {ajuster_contraste(pixel_test, 0.5)}")
print(f"  x 2.0 = {ajuster_contraste(pixel_test, 2.0)}")

# Negatif
print("\nNEGATIF :")
print(f"  {pixel_test} -> {negatif(pixel_test)}")
print(f"  0 -> {negatif(0)}")
print(f"  255 -> {negatif(255)}")

# Seuillage
print("\nSEUILLAGE (seuil=128) :")
for p in [50, 100, 128, 150, 200]:
    print(f"  {p} -> {seuillage(p)}")

# Niveaux de gris
print("\nNIVEAUX DE GRIS :")
couleurs = [
    ("Rouge pur", 255, 0, 0),
    ("Vert pur", 0, 255, 0),
    ("Bleu pur", 0, 0, 255),
    ("Jaune", 255, 255, 0),
    ("Blanc", 255, 255, 255),
]

for nom, r, g, b in couleurs:
    gris = niveaux_gris(r, g, b)
    print(f"  {nom} ({r},{g},{b}) -> {gris}")

print("\n-> Le vert parait plus lumineux que le bleu (perception humaine)")

Quiz de validation

1. Quelle operation permet d'eclaircir une image ?

2. Qu'est-ce qu'un noyau (kernel) en traitement d'image ?

3. Quel filtre permet de reduire le bruit dans une image ?

4. Que fait le filtre Sobel ?

5. Quelle bibliotheque Python permet d'appliquer des filtres d'image ?

Pixel