Adds mutators and experiment setup
continuous-integration/drone/push Build is failing

Calculates basic phashes for images and their mutations.
More stats are needed, but it's a start
This commit is contained in:
2024-05-27 01:00:06 +02:00
parent 4e6d9e09ba
commit 57bb30b970
8 changed files with 218 additions and 182 deletions
+40 -28
View File
@@ -1,6 +1,8 @@
//! Descriptors that can be used to describe an image.
//! If two images are (almost) the same, their descriptions will be the same.
use image::GenericImageView;
pub trait Descriptor {
/// Print the name of the descriptor,
fn info(&self) -> String;
@@ -36,34 +38,44 @@ pub struct DCT {
}
pub mod dct;
// 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]
// }
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 {
fn info(&self) -> String {
"median".to_string()
}
// impl Descriptor for Median {
// fn describe(&self, img: image::DynamicImage) -> u64 {
// let img = self.resize(img);
// let mut values: [u8; 64] = [0; 64];
// let mut i: usize = 0;
// for (_, _, pix) in img.pixels() {
// values[i] = pix[0];
// i = i+1;
// }
// let median = median64(&values);
// let mut mask: u64 = 0;
// img.save("debug.png").unwrap();
// for (_, _, pix) in img.pixels() {
// if pix[0] > median {
// mask += 1;
// }
// mask = mask << 1;
// }
// mask
// }
// }
fn describe(&self, img: &image::DynamicImage) -> u64 {
let img = self.resize(img);
let mut values: [u8; 64] = [0; 64];
let mut i: usize = 0;
for (_, _, pix) in img.pixels() {
values[i] = pix[0];
i = i+1;
}
let median = median64(&values);
let mut mask: u64 = 0;
img.save("debug.png").unwrap();
for (_, _, pix) in img.pixels() {
if pix[0] > median {
mask += 1;
}
mask = mask << 1;
}
mask
}
}
pub fn get_all_descriptors() -> Vec<Box<dyn Descriptor>> {
let mut descriptors: Vec<Box<dyn Descriptor>> = Vec::with_capacity(2);
descriptors.push(Box::new(DCT::new()));
descriptors.push(Box::new(Median));
descriptors
}