Filtrage des images – Bac théorique – Section informatique – 2014

Bac Info 06-01-26
25 0

Sujet (Algo et programmation - Bac 2014)

Une image représentée en niveaux de gris, est formée par des pixels codés chacun sur huit (8) bits et ayant chacun une valeur comprise entre 0 (noir) et 255 (blanc).

Le filtre médian est une technique de filtrage utilisée dans les traitements d'images bitmap.

L'algorithme du filtre médian consiste à remplacer chaque valeur du pixel de l'image à filtrer par la valeur médiane des pixels voisins. Il s'agit d'un voisinage carré autour du pixel considéré.

Un voisinage est donc assimilable à une matrice canée de taille impair, exemple : voisinage 3x3, 5x5, 7x7, etc. (voir l'exemple ci-après)

N.B.: Lorsqu'un pixel est proche du bord de l'image, certains pixels de son voisinage n'existent pas.

En disposant d'un fichier "Imagelnit.txt" contenant les codes binaires correspondants aux pixels d'une image à filtrer, on se propose d'écrire un programme permettant de remplir une matrice MF, par les valeurs, en décimal, des pixels de l'image filtrée par le principe du filtre médian (voisinage 3x3).

Sachant que :

1. Le fichier "Imagelnit.txt" est constitué comme suit :

- la première ligne, contient la définition de l'image sous la forme HxL où H est le nombre de pixels en hauteur et L le nombre de pixels en largeur.

Exemple : "200x180"

- chacune des HxL lignes suivantes, contient une succession de huit (8) bits représentant le code binaire d'un pixel de l'image.

2- L'image filtrée sera obtenue en procédant comme suit :

- remplir à partir du fichier "Imageinit.txt", une matrice M de H lignes et L colonnes par les conversions en décimal des blocs de huit (8) bits représentant chacun le code d'un pixel.

- appliquer un filtre médian sur chaque élément M[i,j] de la matrice M afin de former une deuxième matrice MF et ce de la manière suivante :

placer les valeurs de la matrice M formant le voisinage 3x3 de M[i,j], dans un tableau T (y compris le pixel lui-même).

N.B. : les éléments du voisinage qui sont en dehors de la matrice M, auront la valeur zéro dans le tableau T.

trier par ordre croissant les éléments du tableau

placer la valeur située au milieu du tableau T trié (valeur médiane), dans la case NIF[i,j] de la matrice MF.

Travail demandé :

1- Analyser ce problème en le décomposant en modules.

2- Analyser chacun des modules envisagés.

 

Solution Algorithmique

Dans cet algorithme, On va utiliser cinq fonctions et six procédures:

- la fonction saisie()

- la fonction test_octet()

- la fonction saisie_pixel()

- la procédure remplir_fichier_image_init()

- la fonction convsersion_octet_decimal()

- la fonction exposant()

- la procédure remplir_matrice_image()

- la procédure afficher_matrice()

- la procédure remplir_tableau()

- la procédure trier()

- la procédure remplir_matrice_filtree()

 

Algorithme du programme Principal

Déclaration des objets

Objet Type / Nature
h entier
l entier
m matrice
m entier
f_image fichier
taille chaîne
hauteur entier
largeur entier
mf matrice

 

La fonction saisie

Le rôle de cette fonction est de permettre à l’utilisateur de saisir un entier n compris strictement entre deux bornes inf et sup.

1- La fonction saisie(inf, sup) demande à l’utilisateur d’entrer un entier n.

2- Elle vérifie que n appartient à l’intervalle ouvert ] inf , sup [ (c’est-à-dire inf < n < sup). 3- Tant que la valeur saisie n’est pas valide (n ≤ inf ou n ≥ sup), la fonction redemande la saisie. 4- Une fois une valeur correcte entrée, la fonction retourne n.

Déclaration des objets

Objet Type / Nature
n entier

 

La fonction test_octet

Cette fonction sert à vérifier si une chaîne de caractères représente un octet valide, c’est-à-dire un nombre binaire composé de 8 bits, contenant uniquement les caractères 0 et 1.

1- Vérification de la longueur

La fonction commence par tester si la chaîne octet contient exactement 8 caractères.

Si ce n’est pas le cas → elle retourne False.

2- Vérification du contenu

Elle parcourt la chaîne caractère par caractère à l’aide d’une boucle while.

Tant que l’indice i est inférieur à len(octet)-1 et que le caractère courant est '0' ou '1', on continue.

Après la boucle, elle vérifie aussi que le dernier caractère est bien '0' ou '1'.

3- Valeur retournée

Vrai : si la chaîne contient 8 caractères et tous sont 0 ou 1

Faux : sinon

Déclaration des objets

Objet Type / Nature
i entier

 

La fonction saisie_pixel()

Cette fonction permet de saisir un pixel représenté sous forme binaire, en s’assurant que la valeur entrée par l’utilisateur est un octet valide (8 bits composés uniquement de 0 et de 1).

1- Saisie de l’octet

La fonction demande à l’utilisateur de saisir un pixel sous forme d’un octet (chaîne de caractères).

2- Vérification de la validité

Elle utilise la fonction test_octet(octet) pour vérifier si la saisie correspond bien à un octet valide.

Tant que la valeur saisie n’est pas valide, la fonction redemande la saisie.

3- Retour du résultat

Une fois un octet correct saisi, la fonction retourne cet octet valide.

Déclaration des objets

Objet Type / Nature
octet chaîne

 

La procédure remplir_fichier_image_init

Cette procédure permet de créer et remplir le fichier Image_Init.txt avec les pixels d’une image, saisis par l’utilisateur, ligne par ligne, sous forme d’octets binaires valides.

1- Affichage d’un message

Informe l’utilisateur qu’il est en train de remplir le fichier Image_Init.txt.

2- Ouverture du fichier

Le fichier Image_Init.txt est ouvert en mode écriture ("w").

S’il existe déjà, son contenu est écrasé.

3- Écriture des dimensions de l’image

Les dimensions de l’image sont écrites sur la première ligne du fichier sous la forme : hxl

où : h : nombre de lignes (hauteur) et l : nombre de colonnes (largeur)

4- Saisie et écriture des pixels

Deux boucles imbriquées parcourent l’image : i pour les lignes et j pour les colonnes

À chaque position (i, j) : un pixel est saisi via la fonction saisie_pixel() (qui garantit un octet valide) et le pixel est écrit dans le fichier.

Après chaque ligne de pixels, un retour à la ligne est ajouté.

5- Fermeture du fichier

Le fichier est fermé pour sauvegarder correctement les données.

Déclaration des objets

Objet Type / Nature
f fichier
i entier
j entier
pixel chaîne

 

La fonction exposant

Cette fonction permet de calculer et retourner la valeur de (2 puissance e), sans utiliser de fonction mathématique prédéfinie.

1- Initialisation

La variable valeur est initialisée à 1

2- Calcul par multiplication répétée

Une boucle for s’exécute e fois. À chaque itération, la valeur est multipliée par 2.

3- Retour du résultat

Après la fin de la boucle, la fonction retourne la valeur calculée.

Déclaration des objets

Objet Type / Nature
valeur entier

 

La fonction convsersion_octet_decimal

Cette fonction permet de convertir un octet binaire (chaîne de 8 bits) en son équivalent en nombre décimal.

1- Initialisation

La variable decimal est initialisée à 0. Elle servira à accumuler la valeur décimale finale.

2- Parcours des bits

La boucle parcourt les positions de l’octet. On lit les bits de droite à gauche (du bit de poids faible au bit de poids fort).

Pour chaque bit :

si le bit vaut '1', on ajoute à decimal la valeur de 2 exposant i (la puissance de 2 est calculée par la fonction exposant(i)).

3- Retour du résultat

La fonction retourne la valeur décimale correspondant à l’octet binaire.

Déclaration des objets

Objet Type / Nature
decimal entier
i entier

 

La procédure remplir_matrice_image

Cette procédure permet de charger une image enregistrée dans le fichier Image_Init.txt et de remplir la matrice M avec les valeurs décimales des pixels.

1- Ouverture du fichier

Le fichier Image_Init.txt est ouvert en mode lecture.

2- Lecture des dimensions

La première ligne du fichier (contenant les dimensions de l’image sous la forme hxl) est lue et stockée dans taille.

Cette information n’est pas utilisée directement dans la procédure, mais permet d’ignorer cette ligne.

3- Lecture des pixels

Toutes les lignes suivantes sont lues et stockées dans la liste image.

Chaque ligne correspond à une ligne de pixels binaires.

4- Remplissage de la matrice

i représente l’indice de la ligne dans la matrice.

Pour chaque ligne de pixels : on enlève le caractère de fin de ligne et on regroupe les bits 8 par 8 pour former un octet.

À chaque octet formé : il est converti de binaire en décimal grâce à convsersion_octet_decimal et la valeur obtenue est stockée dans la matrice m[i][j],

5- Fermeture du fichier

Le fichier est fermé après la lecture complète.

Déclaration des objets

Objet Type / Nature
f_image fichier
taille chaîne
i entier
j entier
pixels chaîne
octet chaîne

 

La procédure afficher_matrice

Cette procédure permet d’afficher le contenu d’une matrice m à l’écran, ligne par ligne, selon ses dimensions.

1- Parcours des lignes

La boucle externe parcourt les lignes de la matrice de 0 à hauteur - 1.

2- Parcours des colonnes

La boucle interne parcourt les colonnes de 0 à largeur - 1.

3- Affichage des éléments

Chaque élément m[i][j] est affiché suivi d’un espace.

L’instruction end=' ' permet d’afficher les valeurs sur la même ligne.

4- Retour à la ligne

Après l’affichage de chaque ligne de la matrice, un saut de ligne est effectué avec Ecrire().

Déclaration des objets

Objet Type / Nature
i entier
j entier

 

La procédure remplir_tableau

Cette procédure permet de remplir le tableau t avec les 9 pixels voisins du pixel situé à la position (i, j) dans la matrice m, y compris le pixel central.

La matrice m représente une image (ou une matrice de pixels).

Le pixel central est m[i][j].

Les pixels voisins correspondent au voisinage 3×3 autour de ce pixel.

 

La procédure trier

Le rôle de cette procédure trier est de  trier le tableau t par ordre croissant en utilisant l’algorithme du tri par sélection.

Déclaration des objets

Objet Type / Nature
i entier
j entier
min entier
temp entier

 

La procédure remplir_matrice_filtree

Le rôle de cette procédure remplir_matrice_filtree est de remplir la matrice mf en appliquant un filtre médian à partir de la matrice m (traitement d’image).

Explication du fonctionnement :

m : matrice originale (image d’origine).

mf : matrice filtrée (image résultante).

hauteur, largeur : dimensions de l’image.

t : tableau temporaire contenant les valeurs des pixels voisins (3×3 → 9 valeurs).

Étapes principales

1- Parcours de tous les pixels de l’image

Chaque pixel (i, j) est traité séparément.

2- Remplissage du tableau t

Cette procédure place dans t les 9 valeurs des pixels voisins du pixel (i, j) (fenêtre 3×3).

3- Tri des valeurs

Les 9 valeurs sont triées par ordre croissant.

4- Sélection de la médiane

L’élément central du tableau trié (t[4]) correspond à la médiane.

Cette valeur devient le nouveau pixel dans la matrice filtrée.

Déclaration des objets

Objet Type / Nature
i entier
j entier
t tableau

 

Solution en Python

Exécution du programme

0 commentaire

laisser un commentaire

Veuillez noter s'il vous plaît*

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Passion de robotique

Atelier robotique

Construction des robots

Bras robotique

Maison intelligente

But de ce site web

La robotique éducative joue un rôle important dans l'éducation des enfants et des jeunes en les aidant à acquérir des compétences en science et technologie.
Dans ce cadre notre site web représente une excellente ressource pour les parents, les enseignants et les enfants qui souhaitent découvrir la robotique.

Coordonnées

Zaouiet Kontech-Jemmel-Monastir-Tunisie

+216 92 886 231

medaliprof@gmail.com

Photos des articles

Site robotique réalisé par Mohamed Ali Haj Salah - Prof Info