From b2728da81069c05ad24c6728c38375b87da4754b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Do=CC=88rfler?= Date: Thu, 21 Jan 2016 19:41:31 +0100 Subject: [PATCH] Added primitive sobel convolution. --- src/conv.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/conv.rs b/src/conv.rs index 61e41ec..19649da 100644 --- a/src/conv.rs +++ b/src/conv.rs @@ -94,12 +94,32 @@ fn gaussian_kernel(w: usize, sigma: f32) -> Vec { k } +fn sobel_kernel(horizontal: bool) -> Vec { + let mut k = vec![0f32; 9]; + if horizontal { + k[0] = -1.0; k[1] = 0.0; k[2] = 1.0; + k[3] = -2.0; k[4] = 0.0; k[5] = 2.0; + k[6] = -1.0; k[7] = 0.0; k[8] = 1.0; + } else { + k[0] = -1.0; k[1] = -2.0; k[2] = -1.0; + k[3] = 0.0; k[4] = 0.0; k[5] = 0.0; + k[6] = 1.0; k[7] = 2.0; k[8] = 1.0; + } + + k +} + pub fn gaussian_blur(src: &Image, kernel_width :usize, sigma: f32) -> Image { assert!(kernel_width >= 1); let k = gaussian_kernel(kernel_width, sigma); conv2d_sep(src, &k, &k) } +pub fn sobel(src: &Image, horizontal: bool) -> Image { + let k = sobel_kernel(horizontal); + conv2d_sep(src, &k, &k) +} + #[cfg(test)] mod test { use std::path::Path;