Skip to content

Latest commit

 

History

19 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 

Repository files navigation

Computer Vision

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.

📋 Description

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.

🛠️ Technologies

  • C (95.8%) - Langage principal
  • Makefile (4.2%) - Build system

📦 Installation

Prérequis

  • Compilateur C (gcc-9 ou supérieur)
  • Make
  • Math library (-lm)
  • Eye of GNOME (eog) pour visualiser les résultats

Build

cd TP_vision_par_ordinateur
make

Pour nettoyer les fichiers compilés :

make clean      # Supprime les fichiers .o
make mrproper   # Supprime .o et l'exécutable

🚀 Utilisation

L'application se lance via ligne de commande avec la syntaxe suivante :

./main [OPTION] [ARGUMENTS]

Pour afficher l'aide détaillée :

./main -h

📚 Algorithmes Implémentés

1. Opérations de Base

Addition d'images

./main -ADD source1.pgm source2.pgm output.pgm

Additionne deux images pixel par pixel.

Opérations Logiques

  • 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

Transformation Linéaire

./main -LT min max source.pgm output.pgm

Redimensionne les valeurs de pixels à la plage [min, max].

Histogramme

./main -HI source.pgm output.pgm

Affiche et génère une visualisation de l'histogramme.

Égalisation d'Histogramme

./main -EH source.pgm output.pgm

Améliore le contraste en égalisant la distribution des pixels.

2. Filtres Passe-Haut (Edge Detection)

Gradient

./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 automatique

Détecte les changements d'intensité dans l'image.

Sobel

./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 automatique

Opérateur de détection de bords très populaire utilisant des noyaux 3x3.

Robert

./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 automatique

Détecteur de bords basé sur le calcul des gradients diagonaux.

Prewitt

./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 automatique

Opérateur de détection de bords similaire à Sobel mais avec différents noyaux.

Laplacien

./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 automatique

Détecteur de bords basé sur la dérivée seconde. Très sensible au bruit.

3. Filtres Passe-Bas (Lissage)

Filtre Moyenneur (Averaging Filter)

./main -FMO hauteur largeur source.pgm output.pgm

Lisse l'image en faisant la moyenne des pixels voisins. Les dimensions doivent être impaires.

Filtre Gaussien

./main -FG hauteur largeur source.pgm output.pgm

Lisse l'image avec un noyau gaussien. Préserve mieux les bords que le filtre moyenneur.

Filtre Médian

./main -FM hauteur largeur source.pgm output.pgm

Remplace 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.)

4. Convolution Custom

./main -CV source.pgm kernel.txt output.pgm

Applique 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

5. Segmentation

K-Means Clustering

./main -K nb_clusters max_iterations source.pgm output.pgm

Segmente 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

Segmentation par Germ (Seed Region Growing)

./main -GE nb_germs seuil source.pgm output.pgm

Croissance de régions à partir de semences (germs).

  • nb_germs : Nombre de graines initiales
  • seuil : Critère de similarité pour la croissance

Seuillage Simple

./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.

Seuillage Multiple

./main -SM [seuil1,seuil2,...] [val1,val2,...] source.pgm output.pgm

Applique 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.

6. Transformations

Transformation de Hough

./main -H theta rho algorithme_contour source.pgm output.pgm

Dé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.

7. Analyses

Contraste

./main -C source.pgm

Calcule et affiche la valeur de contraste de l'image.

📁 Structure du Projet

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

🎯 Exemples Pratiques

Détection de bords sur une image

./main -S 50 oiseau.pgm result_edges.pgm

Réduction du bruit

./main -FM 5 5 noisy_image.pgm denoised.pgm

Segmentation en clusters

./main -K 3 50 photo.pgm segmented.pgm

Pipeline complet : Filtre + Détection + Seuillage

# 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.pgm

🔧 Structures de Données

Image

typedef 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;

Matrix

typedef struct {
    int **M;                // Données de la matrice
    int nbr_line;           // Nombre de lignes
    int nbr_col;            // Nombre de colonnes
} Matrix;

⚙️ Détails Techniques

  • 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

🐛 Dépannage

  • 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

📖 Documentation Additionnelle

Consultez help.txt pour une aide détaillée sur chaque commande :

./main -help

📈 Performance

Le 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.

📝 Notes

  • 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

🤝 Contribution

Les contributions sont les bienvenues ! N'hésitez pas à :

  1. Fork le projet
  2. Créer une branche pour votre fonctionnalité (git checkout -b feature/AmazingFeature)
  3. Commit vos changements (git commit -m 'Add some AmazingFeature')
  4. Push vers la branche (git push origin feature/AmazingFeature)
  5. Ouvrir une Pull Request

📄 Licence

À définir

👤 Auteur

mende237 - GitHub Profile

📅 Historique

  • 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.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages