Un projet complet de vision par ordinateur développé en C, implémentant une variété d'algorithmes et de techniques de traitement d'images.
Ce projet est un outil de traitement d'images en ligne de commande permettant d'appliquer diverses techniques de vision par ordinateur sur des images au format PGM (Portable GrayMap). Il supporte des opérations de filtrage, segmentation, détection d'edges, et transformations.
- C (95.8%) - Langage principal
- Makefile (4.2%) - Build system
- Compilateur C (gcc-9 ou supérieur)
- Make
- Math library (-lm)
- Eye of GNOME (eog) pour visualiser les résultats
cd TP_vision_par_ordinateur
makePour nettoyer les fichiers compilés :
make clean # Supprime les fichiers .o
make mrproper # Supprime .o et l'exécutableL'application se lance via ligne de commande avec la syntaxe suivante :
./main [OPTION] [ARGUMENTS]Pour afficher l'aide détaillée :
./main -h./main -ADD source1.pgm source2.pgm output.pgmAdditionne deux images pixel par pixel.
- ET Logique :
./main -AND source1.pgm source2.pgm output.pgm - OU Logique :
./main -OR source1.pgm source2.pgm output.pgm - NOT :
./main -NOT source.pgm output.pgm- Inverse les couleurs
./main -LT min max source.pgm output.pgmRedimensionne les valeurs de pixels à la plage [min, max].
./main -HI source.pgm output.pgmAffiche et génère une visualisation de l'histogramme.
./main -EH source.pgm output.pgmAméliore le contraste en égalisant la distribution des pixels.
./main -G source.pgm output.pgm # Sans seuillage
./main -G seuil source.pgm output.pgm # Avec seuillage
./main -G -A source.pgm output.pgm # Seuillage automatiqueDétecte les changements d'intensité dans l'image.
./main -S source.pgm output.pgm # Sans seuillage
./main -S seuil source.pgm output.pgm # Avec seuillage
./main -S -A source.pgm output.pgm # Seuillage automatiqueOpérateur de détection de bords très populaire utilisant des noyaux 3x3.
./main -R source.pgm output.pgm # Sans seuillage
./main -R seuil source.pgm output.pgm # Avec seuillage
./main -R -A source.pgm output.pgm # Seuillage automatiqueDétecteur de bords basé sur le calcul des gradients diagonaux.
./main -P source.pgm output.pgm # Sans seuillage
./main -P seuil source.pgm output.pgm # Avec seuillage
./main -P -A source.pgm output.pgm # Seuillage automatiqueOpérateur de détection de bords similaire à Sobel mais avec différents noyaux.
./main -L source.pgm output.pgm # Sans seuillage
./main -L seuil source.pgm output.pgm # Avec seuillage
./main -L -A source.pgm output.pgm # Seuillage automatiqueDétecteur de bords basé sur la dérivée seconde. Très sensible au bruit.
./main -FMO hauteur largeur source.pgm output.pgmLisse l'image en faisant la moyenne des pixels voisins. Les dimensions doivent être impaires.
./main -FG hauteur largeur source.pgm output.pgmLisse l'image avec un noyau gaussien. Préserve mieux les bords que le filtre moyenneur.
./main -FM hauteur largeur source.pgm output.pgmRemplace chaque pixel par la médiane de son voisinage. Excellent pour éliminer le bruit salt-and-pepper.
Note : Les dimensions des filtres doivent être impaires (3, 5, 7, 11, etc.)
./main -CV source.pgm kernel.txt output.pgmApplique une convolution personnalisée définie par une matrice dans kernel.txt.
Format du fichier kernel.txt :
3 3 # hauteur largeur
-1 0 1 # les valeurs du noyau
-2 0 2
-1 0 1
./main -K nb_clusters max_iterations source.pgm output.pgmSegmente l'image en groupes de couleurs similaires.
nb_clusters: Nombre de clusters (2-256)max_iterations: Nombre maximum d'itérations- La convergence s'arrête si la stabilité est atteinte avant max_iterations
./main -GE nb_germs seuil source.pgm output.pgmCroissance de régions à partir de semences (germs).
nb_germs: Nombre de graines initialesseuil: Critère de similarité pour la croissance
./main -SE seuil source.pgm output.pgm # Avec seuillage manuel
./main -SE -A source.pgm output.pgm # Seuillage automatique (Otsu)Convertit l'image en binaire (noir/blanc) selon un seuil.
./main -SM [seuil1,seuil2,...] [val1,val2,...] source.pgm output.pgmApplique plusieurs seuils pour créer plusieurs niveaux de gris.
Exemple :
./main -SM [50,100] [0,50,100] source.pgm output.pgm- Si pixel ≤ 50 → valeur 0
- Si 50 < pixel ≤ 100 → valeur 50
- Si pixel > 100 → valeur 100
Note : Les seuils doivent être en ordre croissant et il faut n+1 valeurs pour n seuils.
./main -H theta rho algorithme_contour source.pgm output.pgmDétecte les droites dans l'image.
theta: Résolution en angles (ex: 1.0)rho: Résolution en distance (ex: 1.0)algorithme_contour: Algorithme pour extraire les contours (laplacien, sobel, etc.)
Après exécution, le programme vous demande d'entrer une valeur de seuil pour filtrer les droites.
./main -C source.pgmCalcule et affiche la valeur de contraste de l'image.
TP_vision_par_ordinateur/
├── Makefile # Configuration de build
├── README.md # Ce fichier
├── help.txt # Aide détaillée
├── main.c # Point d'entrée principal
├── main # Exécutable compilé
│
├── header/ # Fichiers d'en-têtes (.h)
│ ├── struct/ # Structures de données (Image, Matrix)
│ ├── filter/ # Filtres haute et basse fréquence
│ │ ├── high_pass/ # Gradient, Sobel, Robert, Prewitt, Laplacien
│ │ └── low_pass/ # Filtres moyenneur, gaussien, médian
│ ├── segmentation/ # K-means, Germ, Thresholding
│ ├── transformations/ # Hough transformation
│ ├── convolution/ # Convolution image
│ ├── base_operations/ # Opérations de base
│ ├── utilitaire/ # Fonctions utilitaires
│ └── data_structure/ # Listes chaînées, piles
│
├── source/ # Fichiers source (.c)
│ ├── struct/
│ ├── filter/
│ │ ├── high_pass/
│ │ └── low_pass/
│ ├── segmentation/
│ ├── transformations/
│ ├── convolution/
│ ├── base_operations/
│ ├── utilitaire/
│ └── data_structure/
│
├── images/ # Dossier pour les images d'entrée
│ ├── circuit.pgm
│ ├── oiseau.pgm
│ ├── photograph.pgm
│ └── ... (autres images de test)
│
└── result/ # Dossier pour les images de sortie
└── result.pgm
./main -S 50 oiseau.pgm result_edges.pgm./main -FM 5 5 noisy_image.pgm denoised.pgm./main -K 3 50 photo.pgm segmented.pgm# 1. Lisser l'image
./main -FG 3 3 source.pgm blurred.pgm
# 2. Détecter les bords
./main -S 50 blurred.pgm edges.pgm
# 3. Binariser
./main -SE 100 edges.pgm binary.pgmtypedef struct {
char type[3]; // "P2" (grayscale) ou "P3" (color)
int nbr_line; // Hauteur
int nbr_col; // Largeur
int val_max; // Valeur max des pixels (255)
int **M; // Matrice des pixels
} Image;typedef struct {
int **M; // Données de la matrice
int nbr_line; // Nombre de lignes
int nbr_col; // Nombre de colonnes
} Matrix;- Format d'entrée : Images PGM (Portable GrayMap)
- Format de sortie : Images PGM
- Profondeur de couleur : 8 bits (0-255)
- Visualisation : Eye of GNOME (eog) - peut être changé dans main.c
- Erreur "fichier non trouvé" : Vérifiez le chemin vers l'image source
- Segmentation fault : Vérifiez les dimensions des filtres (doivent être impaires)
- Résultats inattendus : Ajustez les valeurs de seuil ou les paramètres d'algorithme
Consultez help.txt pour une aide détaillée sur chaque commande :
./main -helpLe projet a été compilé avec GCC-9 et optimisé pour fonctionner sur des images de tailles variées. Les images de test vont de 50KB à 750KB environ.
- Les images doivent être au format PGM (grayscale ou color)
- Certaines opérations sont limitées aux images en niveaux de gris
- Les seuils doivent être entre 0 et 255
- Les valeurs de theta pour Hough sont généralement entre 0.5 et 2.0
- Les valeurs de rho pour Hough sont généralement entre 0.5 et 2.0
Les contributions sont les bienvenues ! N'hésitez pas à :
- Fork le projet
- Créer une branche pour votre fonctionnalité (
git checkout -b feature/AmazingFeature) - Commit vos changements (
git commit -m 'Add some AmazingFeature') - Push vers la branche (
git push origin feature/AmazingFeature) - Ouvrir une Pull Request
À définir
mende237 - GitHub Profile
- 06 avril 2022 - Création du projet
- 23 janvier 2023 - Dernière mise à jour
Pour plus d'informations ou des problèmes, consultez le code source ou ouvrez une issue.