Calculates basic phashes for images and their mutations. More stats are needed, but it's a start
This commit is contained in:
+40
-28
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user