Crates.io | image_processing |
lib.rs | image_processing |
version | 0.1.0 |
source | src |
created_at | 2024-11-19 17:15:01.034709 |
updated_at | 2024-11-19 17:15:01.034709 |
description | This package provides tools for image processing with a focus on edge detection and morphological transformations |
homepage | |
repository | https://github.com/Florian-ALEXANDRE-Efrei/image_processing.git |
max_upload_size | |
id | 1453572 |
size | 408,308 |
Un projet Rust pour appliquer plusieurs types de filtres d'image, notamment des filtres de détection de contours et des transformations morphologiques.
Ce projet est basé sur les cours de Mr.Patrick J Bonnin, enseignat à l'Efrei Paris pour les cours de "Vision robotique et analyse" et "Vision et Perception de l'Environnement"
Détection de contours : Kirsch, Sobel, Robinson, Prewitt.
Opérateurs morphologiques : Dilatation et érosion.
Outils généraux : Inversion des couleurs, seuillage classique, etc.
image_processing/
├── src/
│ ├── main.rs # Point d'entrée principal
│ ├── filters/ # Contient les filtres
│ │ ├── edge_detection.rs # Détection de contours (Kirsch, Sobel, etc.)
│ │ └── morphological.rs # Opérateurs morphologiques (dilatation, érosion)
│ ├── utils/
│ │ └── image_utils.rs # Fonctions utilitaires (chargement d'images_src, etc.)
│ └── lib.rs # Déclaration des modules
├── images_src/ # Images d'entrée
├── images_res/ # Images générées après traitement
└── Cargo.toml # Configuration du projet
Cargo.toml
.Clonez ce dépôt :
git clone https://github.com/Florian-ALEXANDRE-Efrei/image_processing.git
Accédez au répertoire du projet :
cd image_processing
Compilez le projet :
cargo build --release
Ajoutez vos images sources dans le dossier images_sources/
.
Exécutez le programme en ligne de commande :
cargo run --release
Exemple :
images_sources/input.png
sera traitée avec les filtres définis dans le code.images_resultat/
.Modifiez le fichier main.rs
pour expérimenter différents filtres ou traitements :
Filtre | Image Originale | Image Résultante |
---|---|---|
Prewitt | ||
Thresholding | ||
Dilatation |
G_x = 1/3
\begin{bmatrix}
-1 & 0 & 1 \\
-1 & 0 & 1 \\
-1 & 0 & 1
\end{bmatrix},
\quad
G_y = 1/3
\begin{bmatrix}
-1 & -1 & -1 \\
0 & 0 & 0 \\
1 & 1 & 1
\end{bmatrix}
// main.rs
let img = image_utils::get_image("images_src/Bureau.png"); // Ouverture de l'image
let img_prewitt = edge_detection::prewitt(img.clone()); // Application du filtre de Prewitt
img_prewitt.save("images_res/bureau_prewitt.png").expect("Failed to save image"); // Enregistrement de l'image résultante
Masques de convolution :
G_x = 1/4
\begin{bmatrix}
-1 & 0 & 1 \\
-2 & 0 & 2 \\
-1 & 0 & 1
\end{bmatrix},
\quad
G_y = 1/4
\begin{bmatrix}
-1 & -2 & -1 \\
0 & 0 & 0 \\
1 & 2 & 1
\end{bmatrix}
Utilisation
// main.rs
let img = image_utils::get_image("images_src/Bureau.png"); // Ouverture de l'image
let img_sobel = edge_detection::sobel(img.clone()); // Application du filtre de Sobel
img_sobel.save("images_res/bureau_sobel.png").expect("Failed to save image"); // Enregistrement de l'image résultante
Masques de convolution
G_x = 1/15
\begin{bmatrix}
-3 & -3 & 5 \\
-3 & 0 & 5 \\
-3 & -3 & 5
\end{bmatrix},
\quad
G_{45°} = 1/15
\begin{bmatrix}
-3 & 5 & 5 \\
-3 & 0 & 5 \\
-3 & -3 & -3
\end{bmatrix}
G_{-45°} = 1/15
\begin{bmatrix}
-3 & -3 & -3 \\
-3 & 0 & 5 \\
-3 & 5 & 5
\end{bmatrix},
\quad
G_y = 1/15
\begin{bmatrix}
-3 & -3 & -3 \\
-3 & 0 & -3 \\
5 & 5 & 5
\end{bmatrix}
Utilisation
// main.rs
let img = image_utils::get_image("images_src/Bureau.png"); // Ouverture de l'image
let img_kirsch = edge_detection::kirsch(img.clone()); // Application du filtre de Kirsch
img_kirsch.save("images_res/bureau_kirsch.png").expect("Failed to save image"); // Enregistrement de l'image résultante
Masques de convolution :
G_{E} = 1/5
\begin{bmatrix}
-1 & 1 & 1 \\
-1 & 2 & 1 \\
-1 & 1 & 1
\end{bmatrix},
\quad
G_{NE} = 1/5
\begin{bmatrix}
1 & 1 & 1 \\
-1 & 2 & 1 \\
-1 & -1 & 1
\end{bmatrix},
\quad
G_{N} = 1/5
\begin{bmatrix}
1 & 1 & 1 \\
1 & -2 & 1 \\
-1 & -1 & -1
\end{bmatrix}
G_{NO} = 1/5
\begin{bmatrix}
1 & 1 & 1 \\
1 & -2 & -1 \\
1 & -1 & -1
\end{bmatrix},
\quad
G_{O} = 1/5
\begin{bmatrix}
1 & 1 & -1 \\
1 & -2 & -1 \\
1 & 1 & -1
\end{bmatrix},
\quad
G_{SO} = 1/5
\begin{bmatrix}
1 & -1 & -1 \\
1& -2 & -1 \\
1& 1 & 1
\end{bmatrix}
G_{S} = 1/5
\begin{bmatrix}
-1 & -1 & -1 \\
1 & 0 & 1 \\
1 & 1 & 1
\end{bmatrix},
\quad
G_{SE} = 1/5
\begin{bmatrix}
-1 & -1 & 1 \\
-1 & -2 & 1 \\
1 & 1 & 1
\end{bmatrix}
Utilisation
// main.rs
let img = image_utils::get_image("images_src/Bureau.png"); // Ouverture de l'image
let img_robinson = edge_detection::robinson(img.clone()); // Application du filtre de Robinson
img_robinson.save("images_res/bureau_robinson.png").expect("Failed to save image"); // Enregistrement de l'image résultante
Algorithme :
Utilisation :
// main.rs
img_threshold.save("images_res/bureau_thresholding.png").expect("Failed to save image"); // Enregistrement de l'image résultante
let gabarit = [ // création du gabarit pour la dilatation et l'érosion
[image_utils::WHITEPIXEL, image_utils::BLACKPIXEL, image_utils::WHITEPIXEL],
[image_utils::BLACKPIXEL, image_utils::BLACKPIXEL, image_utils::BLACKPIXEL],
[image_utils::WHITEPIXEL, image_utils::BLACKPIXEL, image_utils::WHITEPIXEL],
];
let img_erodee = morphological::erosion(&gabarit, img_threshold); // Application de l'érosion
img_erodee.save("images_res/bureau_erodee.png").expect("Failed to save image"); // Enregistrement de l'image résultante
Principe : Agrandit les objets en remplacant des pixels objets par des pixels fond au bord des objets.
Algorithme :
Utilisation :
// main.rs
img_threshold.save("images_res/bureau_thresholding.png").expect("Failed to save image"); // Enregistrement de l'image résultante
let gabarit = [ // création du gabarit pour la dilatation et l'érosion
[image_utils::WHITEPIXEL, image_utils::BLACKPIXEL, image_utils::WHITEPIXEL],
[image_utils::BLACKPIXEL, image_utils::BLACKPIXEL, image_utils::BLACKPIXEL],
[image_utils::WHITEPIXEL, image_utils::BLACKPIXEL, image_utils::WHITEPIXEL],
];
let img_dilatee = morphological::dilatation(&gabarit, img_threshold.clone()); // Application de la dilatation
img_dilatee.save("images_res/bureau_dilatee.png").expect("Failed to save image"); // Enregistrement de l'image résultante
Le choix du gabarit est crucial :
E =
\begin{bmatrix}
1 & 1 & 1 \\
1 & 1 & 1 \\
1 & 1 & 1
\end{bmatrix}
E =
\begin{bmatrix}
0 & 1 & 0 \\
1 & 1 & 1 \\
0 & 1 & 0
\end{bmatrix}
Les contributions sont les bienvenues ! Voici comment vous pouvez aider :
Ce projet est sous licence MIT. Consultez le fichier LICENSE pour plus d'informations.
Si vous avez des questions ou des problèmes, n'hésitez pas à ouvrir une issue ou à me contacter directement.
Ce projet est conçu pour les personnes souhaitant explorer le traitement d'images en Rust et peut servir de base à des projets plus complexes.