From 6276ca1f77f20b9b815e142b5c72714069c286d5 Mon Sep 17 00:00:00 2001 From: Mark Hoekveen Date: Fri, 3 May 2024 13:34:16 +0200 Subject: [PATCH] adds dct? --- src/descriptors.rs | 50 +++++++++++++++++++++++++++++++++++++++++++--- src/main.rs | 6 +++--- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/src/descriptors.rs b/src/descriptors.rs index d4b0e02..39815c1 100644 --- a/src/descriptors.rs +++ b/src/descriptors.rs @@ -1,4 +1,5 @@ use image::GenericImageView; +use std::f64::consts::PI; pub trait Descriptor { fn info(&self) -> String { @@ -10,16 +11,25 @@ pub trait Descriptor { } } +fn median64(values: &[T]) -> T { + let mut sorted_values = values.to_vec(); + sorted_values.sort(); + let len = sorted_values.len(); + sorted_values[len/2] +} + pub struct Median; impl Descriptor for Median { fn describe(&self, img: image::DynamicImage) -> u64 { - let mut median: u64 = 0; //Average for now while i figure out sorting in rust let img = img.grayscale().thumbnail_exact(8, 8); + let mut values: [u8; 64] = [0; 64]; + let mut i: usize = 0; for (_, _, pix) in img.pixels() { - median += pix[0] as u64; + values[i] = pix[0]; + i = i+1; } - let median: u8 = (median/64) as u8; + let median = median64(&values); let mut mask: u64 = 0; img.save("debug.png").unwrap(); for (_, _, pix) in img.pixels() { @@ -32,3 +42,37 @@ impl Descriptor for Median { } } +pub struct DCT; + +impl Descriptor for DCT { + fn describe(&self, img: image::DynamicImage) -> u64 { + let mut dct_values: [f64; 64] = [0.0; 64]; + let img = img.grayscale().thumbnail_exact(8, 8); + let mut total_sum: f64 = 0.0; + + for j in 0..7 { + for i in 0..7 { + let mut sum: f64 = 0.0; + let k = (i*8)+j; + for (x, y, pix) in img.pixels() { + let n: f64 = ((y*8)+x).into(); + let pixel: i16 = pix[0] as i16 - 127; + sum += pixel as f64 * (PI/64.0 * (n + 0.5) * k as f64).cos(); + } + dct_values[k] = sum; + total_sum += sum; + //println!("{sum}"); + } + } + total_sum /= 64.0; + + let mut mask: u64 = 0; + for dct in dct_values { + if dct > 0.0 { + mask += 1 + } + mask = mask << 1; + } + mask + } +} diff --git a/src/main.rs b/src/main.rs index 5bd9dc0..b8883fb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use descriptors::{Descriptor, Median}; +use descriptors::{Descriptor, Median, DCT}; use std::collections::HashMap; use std::fs; @@ -28,10 +28,10 @@ fn main() { } for (key, val) in map.iter() { - println!("{key}: {val}"); + println!("{key: >15}: {val}\t {val:b}"); } //Serialize hashmap with MessagePack: let serialized: Vec = rmp_serde::to_vec(&map).unwrap(); - fs::write("map.messagepack",&serialized).unwrap(); + //fs::write("map.messagepack",&serialized).unwrap(); }