image_processing/filters/
morphological.rs1use image::{DynamicImage, ImageBuffer, GenericImageView};
2use crate::utils::image_utils;
3
4#[allow(dead_code)]
5pub fn erosion<T: std::cmp::PartialEq<image::Rgba<u8>>, const M: usize, const N: usize>(gabarit: &[[T; N]; M], img : DynamicImage) -> DynamicImage
6{
7 let gabarit_taille = gabarit.len() as u32;
8 let gabarit_centre = gabarit_taille / 2;
9
10 let (width, height) = img.dimensions();
11 let mut img_erodee: image::RgbaImage = ImageBuffer::new(width, height); for y in gabarit_centre..height-gabarit_centre
14 {
15 for x in gabarit_centre..width-gabarit_centre
16 {
17 let mut match_gabarit = true;
18 for ky in 0..gabarit_taille {
20 for kx in 0..gabarit_taille {
21
22 let nx = x + kx - gabarit_centre;
24 let ny = y + ky - gabarit_centre;
25
26 let pixel = img.get_pixel(nx, ny);
28
29 if pixel == image_utils::WHITEPIXEL && gabarit[ky as usize][kx as usize] == image_utils::BLACKPIXEL
31 {
32 match_gabarit = false;
33 break;
34 }
35 }
36 }
37 if match_gabarit {
40 img_erodee.put_pixel(x, y, image_utils::BLACKPIXEL);
41 } else {
43 img_erodee.put_pixel(x, y, image_utils::WHITEPIXEL);
44 }
45 }
46 }
47 return image::DynamicImage::ImageRgba8(img_erodee);
48}
49
50#[allow(dead_code)]
51pub fn dilatation<T: std::cmp::PartialEq<image::Rgba<u8>>, const M: usize, const N: usize>(gabarit: &[[T; N]; M], img : DynamicImage) -> DynamicImage
52{
53 let gabarit_taille = gabarit.len() as u32;
54 let gabarit_centre = gabarit_taille / 2;
55
56 let (width, height) = img.dimensions();
57 let mut img_dilatee: image::RgbaImage = ImageBuffer::new(width, height); for y in gabarit_centre..height-gabarit_centre
60 {
61 for x in gabarit_centre..width-gabarit_centre
62 {
63 let mut match_gabarit = false;
64 for ky in 0..gabarit_taille
66 {
67 for kx in 0..gabarit_taille
68 {
69 let nx = x + kx - gabarit_centre;
71 let ny = y + ky - gabarit_centre;
72
73 let pixel = img.get_pixel(nx, ny);
75
76 if pixel == image_utils::BLACKPIXEL && gabarit[ky as usize][kx as usize] == image_utils::BLACKPIXEL
78 {
79 match_gabarit = true;
80 break;
81 }
82 }
83 }
84 if match_gabarit {
87 img_dilatee.put_pixel(x, y, image_utils::BLACKPIXEL);
88 } else {
90 img_dilatee.put_pixel(x, y, image_utils::WHITEPIXEL);
91 }
92 }
93 }
94 return image::DynamicImage::ImageRgba8(img_dilatee);
95}