Chapter 03
Chapter 03
1.1 Le seuillage
Le seuillage est une technique fondamentale en traitement d’images utilisée pour seg-
menter des images en distinguant les objets d’intérêt de l’arrière-plan. Il s’agit de trans-
former une image en niveaux de gris en une image binaire ou semi-binaire en appliquant
un ou plusieurs seuils.
Dans ce cours, nous aborderons les méthodes suivantes :
1. Seuillage Classique
2. Seuillage Tronqué
3. Seuillage à Zéro
4. Seuillage Optimal Itératif
Soit f (x, y) l’intensité du pixel à la position (x, y) dans l’image originale, et g(x, y)
l’intensité du pixel dans l’image seuillée :
0, si f (x, y) < T
g(x, y) =
255, si f (x, y) ≥ T
1
1.2. SEUILLAGE CLASSIQUE
CHAPITRE 1. SEGMENTATION DES IMAGES
import cv2
import numpy as np
import matplotlib . pyplot as plt
# Definir le seuil
T = 128
plt . subplot (1 , 2 , 2)
plt . imshow ( binary_image , cmap = ’ gray ’)
plt . title ( ’ Image Seuillee ( Classique ) ’)
plt . axis ( ’ off ’)
plt . show ()
2
CHAPITRE 1. SEGMENTATION DES IMAGES
1.3. SEUILLAGE TRONQUÉ
f (x, y), si f (x, y) ≤ T
g(x, y) =
T, si f (x, y) > T
import cv2
import numpy as np
import matplotlib . pyplot as plt
# Definir le seuil
T = 128
# Appliquer le seuillage tronque
_ , truncated_image = cv2 . threshold ( image , T , 255 , cv2 .
THRESH_TRUNC )
3
1.4. SEUILLAGE À ZÉRO
CHAPITRE 1. SEGMENTATION DES IMAGES
0, si f (x, y) ≤ T
g(x, y) =
f (x, y), si f (x, y) > T
4
CHAPITRE 1. SEGMENTATION
[Link]
SEUILLAGE
IMAGES OPTIMAL ITÉRATIF
µ1 + µ2
Tk+1 =
2
1 X 1 X
avec µ1 = f (x, y), µ2 = f (x, y)
|G1 | f (x,y)∈G1 |G2 | f (x,y)∈G2
5
1.5. SEUILLAGE OPTIMAL
CHAPITRE
ITÉRATIF
1. SEGMENTATION DES IMAGES
# Verifier la convergence
if abs ( T_new - T_old ) < epsilon :
break
T_old = T_new
iteration += 1
6
CHAPITRE 1. SEGMENTATION DES IMAGES
1.6. LA SEGMENTATION
1.6 La segmentation
1.6.1 Définition
La segmentation vise à découper une image en régions connexes présentant une ho-
mogénéité selon un certain critère.
La segmentation est une étape essentielle dans le traitement des images et trouve des
applications dans de nombreux domaines, où la nécessité de diviser une image en régions
significatives est primordiale. Voici quelques-uns des principaux domaines d’application
de la segmentation :
7
1.6. LA SEGMENTATION
CHAPITRE 1. SEGMENTATION DES IMAGES
8
CHAPITRE 1. SEGMENTATION DES IMAGES
1.6. LA SEGMENTATION
9
1.7. SEGMENTATION CHAPITRE
PAR FUSION
1. SEGMENTATION DES IMAGES
partitionner une image en régions significatives pour faciliter son analyse ou son inter-
prétation. Dans ce cours, nous aborderons :
1. Segmentation par fusion
2. Segmentation par Division
3. Segmentation par Division et Fusion
4. Détection de Contour avec le Code de Freeman
1.8 Introduction
La segmentation par fusion est une technique de traitement d’images qui consiste à
partitionner une image en régions homogènes en fusionnant des pixels adjacents sur la base
d’un critère de similarité. Cette méthode est couramment utilisée dans des domaines tels
que la vision par ordinateur, la reconnaissance de formes et l’analyse médicale. L’objectif
est de simplifier la représentation d’une image et de faciliter son analyse.
10
CHAPITRE 1. 1.9.
SEGMENTATION
ALGORITHMEDES
DE SEGMENTATION
IMAGES PAR FUSION
1.8.3 Voisinage
Pour chaque pixel p, nous considérons un ensemble de pixels voisins N (p). Dans le
cas le plus simple, nous pouvons utiliser la 4-connectivité (haut, bas, gauche, droite) ou
la 8-connectivité (ajoutant les diagonales).
98 99 100
Supposons que le seuil de similarité T = 2.
— Étape 1 : Initialisation. Chaque pixel est une région distincte.
— Étape 2 : Parcours de l’image.
— Commencez par le pixel en position (0,0) avec une intensité de 100.
— Examinez ses voisins :
— (0,1) : Intensité 101, différence |100 − 101| = 1 ≤ 2. Fusionner.
— (1,0) : Intensité 99, différence |100 − 99| = 1 ≤ 2. Fusionner.
— Résultat : Tous les pixels sont fusionnés en une seule région car la différence
d’intensité entre les pixels adjacents est toujours inférieure ou égale à 2.
11
1.10. EXEMPLE SIMPLE
CHAPITRE 1. SEGMENTATION DES IMAGES
12
CHAPITRE 1. SEGMENTATION
[Link]
IMPLÉMENTATION
IMAGES EN PYTHON
Parametres :
- image : Image en niveaux de gris ( numpy array 2 D ) .
- threshold : Seuil de difference d intensite pour fusionner les
regions .
Retourne :
- labels : Image des labels des regions segmentees .
"""
h , w = image . shape
labels = -1 * np . ones (( h , w ) , dtype = int )
label = 0
def get_neighbors (y , x ) :
neighbors = []
13
1.11. IMPLÉMENTATION
CHAPITRE
EN PYTHON
1. SEGMENTATION DES IMAGES
if x > 0:
neighbors . append (( y , x - 1) )
if y > 0:
neighbors . append (( y - 1 , x))
if x < w - 1:
neighbors . append (( y , x + 1) )
if y < h - 1:
neighbors . append (( y + 1 , x))
return neighbors
for y in range ( h ) :
for x in range ( w ) :
if labels [y , x ] == -1:
# Nouvelle region
labels [y , x ] = label
region_intensity = image [y , x ]
# File pour le parcours en largeur
queue = [( y , x ) ]
while queue :
cy , cx = queue . pop (0)
for ny , nx in get_neighbors ( cy , cx ) :
if labels [ ny , nx ] == -1:
intensity_diff = abs ( int ( image [ ny , nx ]) -
int ( region_intensity ) )
if intensity_diff <= threshold :
labels [ ny , nx ] = label
queue . append (( ny , nx ) )
label += 1
return labels
# Parametre de seuil
threshold = 10 # Ajustez ce parametre selon vos besoins
plt . subplot (1 , 2 , 1)
plt . imshow ( image , cmap = ’ gray ’)
plt . axis ( ’ off ’)
plt . title ( ’ Image Originale ’)
14
CHAPITRE 1. SEGMENTATION DES IMAGES 1.12. AVANTAGES
plt . subplot (1 , 2 , 2)
plt . imshow ( labels , cmap = ’ nipy_spectral ’)
plt . axis ( ’ off ’)
plt . title ( ’ Segmentation par Fusion ’)
plt . show ()
1.12 Avantages
— Simplicité : Facile à comprendre et à implémenter.
— Contrôle : Le seuil de similarité permet de contrôler la granularité de la segmen-
tation.
— Flexibilité : Peut être adapté pour utiliser différents critères de similarité.
1.13 Limitations
— Performance : Le temps de calcul peut être élevé pour les grandes images.
— Sensibilité au Seuil : Le choix du seuil T est crucial et peut nécessiter des
ajustements manuels.
— Images Couleur : L’algorithme tel quel ne fonctionne que pour les images en
niveaux de gris. Pour les images couleur, il faudrait adapter le critère de similarité.
1.15 Introduction
La segmentation par division est une méthode qui divise une image en sous-régions
homogènes à l’aide de la structure de Quadtree. Cette segmentation est effectuée de
manière récursive en divisant chaque région en quatre sous-régions jusqu’à ce que le
critère d’homogénéité soit satisfait.
Le critère d’homogénéité peut être la différence entre la valeur de pixel maximale et la
valeur de pixel minimale dans une région, qui doit être inférieure ou égale à un seuil
spécifié, il peut être exprimer sous forme de différence de couleur comme il peut être une
valeur en relation avec la texture.
1.16 Quadtree
Le Quadtree est une structure de données qui permet de diviser récursivement une
région carrée en quatre sous-régions. Chaque nœud dans l’arbre représente une région de
l’image, et les feuilles représentent des régions homogènes.
15
1.17. CRITÈRE D’HOMOGÉNÉITÉ
CHAPITRE 1. SEGMENTATION DES IMAGES
50 52 53 55
51 53 54 56
Image 4x4 :
150 152 153 155
16
CHAPITRE 1. SEGMENTATION
[Link]
IMPLÉMENTATION
IMAGES EN PYTHON
class Quadtree :
def __init__ ( self , x , y , width , height , level =0) :
17
1.19. IMPLÉMENTATION
CHAPITRE
EN PYTHON
1. SEGMENTATION DES IMAGES
self . x = x
self . y = y
self . width = width
self . height = height
self . level = level
self . children = []
split_recursive ( root )
return regions
# Exemple d ’ utilisation
if __name__ == " __main__ " :
image = cv2 . imread ( ’ image_exemple . jpg ’ , cv2 . IMREAD_GRAYSCALE )
if image is None :
18
CHAPITRE 1. SEGMENTATION DES IMAGES 1.20. AVANTAGES
plt . subplot (1 , 2 , 2)
plt . imshow ( output_image , cmap = ’ gray ’)
plt . axis ( ’ off ’)
plt . title ( ’ Segmentation par Division avec Quadtree ’)
plt . show ()
1.20 Avantages
— Diviser et Régner : L’approche basée sur le Quadtree permet de diviser l’image
de manière adaptative jusqu’à ce que toutes les régions soient homogènes.
— Réduction de Complexité : La structure en Quadtree permet de réduire la
complexité de traitement en se concentrant uniquement sur les régions non homo-
gènes.
1.21 Limitations
— Complexité Computationnelle : Le processus peut être coûteux en termes de
calcul pour des images de grande taille, en particulier si le seuil est trop restrictif.
— Dépendance au Seuil : Le choix du seuil est critique et peut nécessiter des
ajustements manuels.
19
1.22. SEGMENTATIONCHAPITRE
PAR DIVISION
1. SEGMENTATION
ET FUSION DES IMAGES
20
1.23. DÉTECTION DE CONTOUR PAR LA CHAINE DE CODE DE
CHAPITRE 1. SEGMENTATION DES IMAGES FREEMAN
# Apres la division
regions = split ( image , 0 , 0 , image . shape [1] , image . shape [0] ,
threshold =10)
# Appliquer la fusion
regions = merge ( regions , image , threshold =5)
1.24 Introduction
La détection de contours est une étape fondamentale en traitement d’images pour
extraire les formes et structures des objets présents dans une image. Elle permet de ré-
duire les données inutiles tout en conservant les informations essentielles sur les limites
des objets.
La chaîne de code de Freeman est une méthode compacte pour représenter les
contours à l’aide d’une séquence de directions dans un espace discret. Elle est utile pour
la reconnaissance de formes, la description de contours et la comparaison de formes.
21
1.24. INTRODUCTIONCHAPITRE 1. SEGMENTATION DES IMAGES
3 2 1
4 P 0
5 6 7
— 0 : Droite
— 1 : Diagonale haut-droite
— 2 : Haut
— 3 : Diagonale haut-gauche
— 4 : Gauche
— 5 : Diagonale bas-gauche
— 6 : Bas
— 7 : Diagonale bas-droite
Chaque pixel du contour est relié à son voisin immédiat par l’une de ces directions.
Étapes du Processus
1. Prétraitement de l’image :
— L’image doit être binarisée (noir et blanc).
— Les contours des objets sont représentés par des pixels noirs (0).
2. Détection du pixel de départ : Trouver un pixel appartenant au contour (par
exemple, en scannant l’image ligne par ligne).
3. Parcours du contour : À partir du pixel de départ, suivre le contour en exami-
nant les pixels voisins selon l’ordre des directions.
4. Boucle fermée : Le processus s’arrête lorsque le contour revient au pixel de
départ.
Sorties
— Une chaîne de Freeman (séquence des directions).
22
CHAPITRE 1. SEGMENTATION DES IMAGES1.24. INTRODUCTION
Pseudo-Code
1. Charger l’image et la binariser.
2. Trouver un pixel appartenant au contour.
3. Initialiser une liste pour enregistrer les directions.
4. Parcourir les pixels voisins dans l’ordre des directions jusqu’à revenir au pixel de
départ.
5. Sortir la chaîne de Freeman.
Exemple Visuel
Image binaire d’entrée :
1 1 1 1 1 1 1
1 0 0 0 1 1 1
1 0 1 0 1 1 1
1 0 0 0 1 1 1
1 1 1 1 1 1 1
Les pixels noirs (0) forment le contour. La chaîne de Freeman pour ce contour serait :
[]
Exemple en Python
Voici une implémentation en Python :
Listing 1.3 – Implémentation Python
import cv2
23
1.24. INTRODUCTIONCHAPITRE 1. SEGMENTATION DES IMAGES
import numpy as np
import matplotlib . pyplot as plt
if not start :
return []
chain_code = []
current = start
visited = set ()
visited . add ( current )
while True :
for d , ( di , dj ) in enumerate ( directions ) :
ni , nj = current [0] + di , current [1] + dj
if (0 <= ni < rows ) and (0 <= nj < cols ) and ( image [
ni , nj ] == 0) and (( ni , nj ) not in visited ) :
chain_code . append ( direction_code [ d ])
visited . add (( ni , nj ) )
current = ( ni , nj )
break
else :
break
24
CHAPITRE 1. SEGMENTATION DES IMAGES1.24. INTRODUCTION
return chain_code
# Convert to grayscale
gray_image = cv2 . cvtColor ( rgb_image , cv2 . COLOR_BGR2GRAY )
# Display results
plt . figure ( figsize =(15 , 5) )
# Binary image
plt . subplot (1 , 3 , 2)
plt . imshow ( binary_image , cmap = ’ gray ’)
plt . title ( " Binary Image " )
plt . axis ( ’ off ’)
# Contour image
plt . subplot (1 , 3 , 3)
plt . imshow ( contour_image , cmap = ’ gray ’)
plt . title ( " Contours from Freeman Chain Code " )
plt . axis ( ’ off ’)
25
1.24. INTRODUCTIONCHAPITRE 1. SEGMENTATION DES IMAGES
plt . show ()
26