adds dct?
This commit is contained in:
+47
-3
@@ -1,4 +1,5 @@
|
|||||||
use image::GenericImageView;
|
use image::GenericImageView;
|
||||||
|
use std::f64::consts::PI;
|
||||||
|
|
||||||
pub trait Descriptor {
|
pub trait Descriptor {
|
||||||
fn info(&self) -> String {
|
fn info(&self) -> String {
|
||||||
@@ -10,16 +11,25 @@ pub trait Descriptor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn median64<T: Ord + Copy>(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;
|
pub struct Median;
|
||||||
|
|
||||||
impl Descriptor for Median {
|
impl Descriptor for Median {
|
||||||
fn describe(&self, img: image::DynamicImage) -> u64 {
|
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 img = img.grayscale().thumbnail_exact(8, 8);
|
||||||
|
let mut values: [u8; 64] = [0; 64];
|
||||||
|
let mut i: usize = 0;
|
||||||
for (_, _, pix) in img.pixels() {
|
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;
|
let mut mask: u64 = 0;
|
||||||
img.save("debug.png").unwrap();
|
img.save("debug.png").unwrap();
|
||||||
for (_, _, pix) in img.pixels() {
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+3
-3
@@ -1,4 +1,4 @@
|
|||||||
use descriptors::{Descriptor, Median};
|
use descriptors::{Descriptor, Median, DCT};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
|
|
||||||
@@ -28,10 +28,10 @@ fn main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (key, val) in map.iter() {
|
for (key, val) in map.iter() {
|
||||||
println!("{key}: {val}");
|
println!("{key: >15}: {val}\t {val:b}");
|
||||||
}
|
}
|
||||||
|
|
||||||
//Serialize hashmap with MessagePack:
|
//Serialize hashmap with MessagePack:
|
||||||
let serialized: Vec<u8> = rmp_serde::to_vec(&map).unwrap();
|
let serialized: Vec<u8> = rmp_serde::to_vec(&map).unwrap();
|
||||||
fs::write("map.messagepack",&serialized).unwrap();
|
//fs::write("map.messagepack",&serialized).unwrap();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user