refactors and new dct binary
This commit is contained in:
Generated
+71
-7
@@ -144,6 +144,46 @@ version = "1.0.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap"
|
||||||
|
version = "4.5.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0"
|
||||||
|
dependencies = [
|
||||||
|
"clap_builder",
|
||||||
|
"clap_derive",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap_builder"
|
||||||
|
version = "4.5.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4"
|
||||||
|
dependencies = [
|
||||||
|
"anstream",
|
||||||
|
"anstyle",
|
||||||
|
"clap_lex",
|
||||||
|
"strsim",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap_derive"
|
||||||
|
version = "4.5.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64"
|
||||||
|
dependencies = [
|
||||||
|
"heck",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn 2.0.64",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap_lex"
|
||||||
|
version = "0.7.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "color_quant"
|
name = "color_quant"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
@@ -384,6 +424,12 @@ dependencies = [
|
|||||||
"crunchy",
|
"crunchy",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "heck"
|
||||||
|
version = "0.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hermit-abi"
|
name = "hermit-abi"
|
||||||
version = "0.1.19"
|
version = "0.1.19"
|
||||||
@@ -424,6 +470,7 @@ version = "0.1.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"base64 0.22.1",
|
"base64 0.22.1",
|
||||||
"bktree",
|
"bktree",
|
||||||
|
"clap",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
"image",
|
"image",
|
||||||
"log",
|
"log",
|
||||||
@@ -685,7 +732,7 @@ checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 1.0.103",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -702,18 +749,18 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.47"
|
version = "1.0.82"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725"
|
checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quote"
|
name = "quote"
|
||||||
version = "1.0.21"
|
version = "1.0.36"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179"
|
checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
]
|
]
|
||||||
@@ -887,6 +934,12 @@ dependencies = [
|
|||||||
"lock_api",
|
"lock_api",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "strsim"
|
||||||
|
version = "0.11.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "1.0.103"
|
version = "1.0.103"
|
||||||
@@ -898,6 +951,17 @@ dependencies = [
|
|||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "2.0.64"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7ad3dee41f36859875573074334c200d1add8e4a87bb37113ebd31d926b7b11f"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tempfile"
|
name = "tempfile"
|
||||||
version = "3.10.1"
|
version = "3.10.1"
|
||||||
@@ -994,7 +1058,7 @@ dependencies = [
|
|||||||
"once_cell",
|
"once_cell",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 1.0.103",
|
||||||
"wasm-bindgen-shared",
|
"wasm-bindgen-shared",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -1016,7 +1080,7 @@ checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 1.0.103",
|
||||||
"wasm-bindgen-backend",
|
"wasm-bindgen-backend",
|
||||||
"wasm-bindgen-shared",
|
"wasm-bindgen-shared",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -14,3 +14,4 @@ log = "0.4.21"
|
|||||||
env_logger = "0.11.3"
|
env_logger = "0.11.3"
|
||||||
bktree = "1.0.1"
|
bktree = "1.0.1"
|
||||||
viuer = "0.7.1"
|
viuer = "0.7.1"
|
||||||
|
clap = { version = "4.5.4", features = ["derive"] }
|
||||||
|
|||||||
@@ -0,0 +1,66 @@
|
|||||||
|
use std::env;
|
||||||
|
use std::f64::consts::{PI, SQRT_2};
|
||||||
|
use image::{save_buffer, GenericImageView, GrayImage};
|
||||||
|
|
||||||
|
fn dct(img: &image::DynamicImage) -> GrayImage {
|
||||||
|
//let mut dct_values: = [0.0; img.width() * img.height()];
|
||||||
|
let w = img.width();
|
||||||
|
let h = img.height();
|
||||||
|
let mut dct_img = GrayImage::new(w, h);
|
||||||
|
|
||||||
|
//let mut dct_values: Vec<f64> = Vec::new();
|
||||||
|
for u in 0..w {
|
||||||
|
for v in 0..h {
|
||||||
|
let w = w as f64;
|
||||||
|
let h = h as f64;
|
||||||
|
//let k = (v*img.width())+u;
|
||||||
|
let mut alpha = 0.25;
|
||||||
|
if u == 0 {
|
||||||
|
alpha = alpha / SQRT_2
|
||||||
|
}
|
||||||
|
if v == 0 {
|
||||||
|
alpha = alpha / SQRT_2
|
||||||
|
}
|
||||||
|
let v: f64 = v as f64;
|
||||||
|
let u: f64 = u as f64;
|
||||||
|
let mut sum: f64 = 0.0;
|
||||||
|
for (x, y, pix) in img.pixels() {
|
||||||
|
let x: f64 = x as f64;
|
||||||
|
let y: f64 = y as f64;
|
||||||
|
let pixel = pix[0] as f64;
|
||||||
|
// sum +=
|
||||||
|
// pixel *
|
||||||
|
// (x*u*PI/16.0).cos() *
|
||||||
|
// (y*v*PI/16.0).cos()
|
||||||
|
sum +=
|
||||||
|
pixel *
|
||||||
|
(
|
||||||
|
PI/w*
|
||||||
|
(x+0.5)*u
|
||||||
|
).cos()
|
||||||
|
*
|
||||||
|
(
|
||||||
|
PI/h*
|
||||||
|
(y+0.5)*v
|
||||||
|
).cos()
|
||||||
|
}
|
||||||
|
//dct_values[k] = alpha * sum;
|
||||||
|
//dct_values.push(alpha * sum);
|
||||||
|
print!("{sum}\t");
|
||||||
|
//sum = (sum + 200000.0)/784.0;
|
||||||
|
print!("{}\n", sum * alpha);
|
||||||
|
let pixel = (sum).abs() as u8;
|
||||||
|
println!("{u}, {v}:\t {sum}");
|
||||||
|
dct_img.put_pixel(u as u32, v as u32, image::Luma([pixel]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dct_img
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let args: Vec<String> = env::args().collect();
|
||||||
|
let path = args[1].clone();
|
||||||
|
let img = image::open(&path).unwrap();
|
||||||
|
let dct = dct(&img);
|
||||||
|
dct.save("dct.png").unwrap();
|
||||||
|
}
|
||||||
+6
-18
@@ -1,34 +1,22 @@
|
|||||||
//use image_similarity::descriptors::dct::DCT;
|
//use image_similarity::descriptors::dct::DCT;
|
||||||
use image_similarity::descriptors::{DCT, Descriptor};
|
use image_similarity::descriptors::{DCT, Descriptor};
|
||||||
use std::env;
|
use std::path::PathBuf;
|
||||||
use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine as _};
|
use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine as _};
|
||||||
use log::debug;
|
use log::debug;
|
||||||
|
use clap::Parser;
|
||||||
|
|
||||||
|
#[derive(Parser)]
|
||||||
|
#[command(version, about, long_about = None)]
|
||||||
struct Cfg {
|
struct Cfg {
|
||||||
path: String
|
path: PathBuf
|
||||||
}
|
|
||||||
|
|
||||||
impl Cfg{
|
|
||||||
fn load(args: &[String]) -> Result<Cfg, &'static str> {
|
|
||||||
if args.len() < 2 {
|
|
||||||
return Err("Filename argument required");
|
|
||||||
}
|
|
||||||
let path = args[1].clone();
|
|
||||||
Ok(Cfg { path })
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
env_logger::init();
|
env_logger::init();
|
||||||
|
let cfg = Cfg::parse();
|
||||||
|
|
||||||
//Init all descriptors:
|
|
||||||
let desc = DCT::new().with_quality(50);
|
let desc = DCT::new().with_quality(50);
|
||||||
|
|
||||||
let args: Vec<String> = env::args().collect();
|
|
||||||
|
|
||||||
let cfg = Cfg::load(&args)
|
|
||||||
.expect("Error loading config");
|
|
||||||
|
|
||||||
let img = image::open(cfg.path)
|
let img = image::open(cfg.path)
|
||||||
.expect("Unable to open file");
|
.expect("Unable to open file");
|
||||||
let phash: u64 = desc.describe(&img);
|
let phash: u64 = desc.describe(&img);
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ use image_similarity::descriptors::{DCT, Descriptor};
|
|||||||
use image_similarity::store::DescriptorStore;
|
use image_similarity::store::DescriptorStore;
|
||||||
use std::env;
|
use std::env;
|
||||||
use log::{info, debug, error};
|
use log::{info, debug, error};
|
||||||
use viuer::{Config, print};
|
|
||||||
|
|
||||||
struct Cfg {
|
struct Cfg {
|
||||||
path: String
|
path: String
|
||||||
|
|||||||
+50
-8
@@ -1,17 +1,59 @@
|
|||||||
use image_similarity::store::DescriptorStore;
|
use image_similarity::store::DescriptorStore;
|
||||||
use image_similarity::descriptors::DCT;
|
use image_similarity::descriptors::{Descriptor, DCT};
|
||||||
use log::info;
|
use log::info;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
use std::thread;
|
||||||
|
use clap::Parser;
|
||||||
|
|
||||||
fn main() {
|
#[derive(Parser)]
|
||||||
env_logger::init();
|
#[command(version, about, long_about = None)]
|
||||||
|
struct Cfg {
|
||||||
|
/// Path that contains the input images. Will not traverse directories.
|
||||||
|
path: PathBuf
|
||||||
|
}
|
||||||
|
|
||||||
|
fn make_store<T: Descriptor>(descriptor: T, input_path: PathBuf, save_path: PathBuf) -> () {
|
||||||
let mut store =
|
let mut store =
|
||||||
DescriptorStore::new()
|
DescriptorStore::new()
|
||||||
.with_file("store.messagepack");
|
.with_file(save_path);
|
||||||
info!("{}", store);
|
info!("{}", store);
|
||||||
let desc =
|
store.insert_directory(input_path, descriptor);
|
||||||
DCT::new()
|
|
||||||
.with_quality(30);
|
|
||||||
store.insert_directory("data", desc);
|
|
||||||
info!("{}", store);
|
info!("{}", store);
|
||||||
store.save().expect("Error saving");
|
store.save().expect("Error saving");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
env_logger::init();
|
||||||
|
let cfg = Cfg::parse();
|
||||||
|
|
||||||
|
let mut threads = vec![];
|
||||||
|
|
||||||
|
let dct_50 =
|
||||||
|
DCT::new()
|
||||||
|
.with_quality(50);
|
||||||
|
let dct_30 =
|
||||||
|
DCT::new()
|
||||||
|
.with_quality(30);
|
||||||
|
let dct_10 =
|
||||||
|
DCT::new()
|
||||||
|
.with_quality(10);
|
||||||
|
|
||||||
|
threads.push(
|
||||||
|
thread::spawn(move || {
|
||||||
|
make_store(dct_50, "data".into(), "dct50.messagepack".into());
|
||||||
|
})
|
||||||
|
);
|
||||||
|
threads.push(
|
||||||
|
thread::spawn(move || {
|
||||||
|
make_store(dct_30, "data".into(), "dct30.messagepack".into());
|
||||||
|
})
|
||||||
|
);
|
||||||
|
threads.push(
|
||||||
|
thread::spawn(move || {
|
||||||
|
make_store(dct_10, "data".into(), "dct10.messagepack".into());
|
||||||
|
})
|
||||||
|
);
|
||||||
|
for thread in threads {
|
||||||
|
let _ = thread.join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+2
-2
@@ -8,7 +8,6 @@ use std::path::Path;
|
|||||||
use std::fmt;
|
use std::fmt;
|
||||||
use log::{info, debug, error};
|
use log::{info, debug, error};
|
||||||
use bktree::*;
|
use bktree::*;
|
||||||
use viuer::{Config, print};
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum SaveError {
|
pub enum SaveError {
|
||||||
@@ -66,6 +65,7 @@ impl DescriptorStore {
|
|||||||
/// Inserts a single value into the store
|
/// Inserts a single value into the store
|
||||||
pub fn insert(&mut self, key: u64, value: String) {
|
pub fn insert(&mut self, key: u64, value: String) {
|
||||||
self.map.insert(key, value);
|
self.map.insert(key, value);
|
||||||
|
self.bktree.insert(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Calculates all descriptions with a given descriptor
|
/// Calculates all descriptions with a given descriptor
|
||||||
@@ -112,7 +112,7 @@ impl DescriptorStore {
|
|||||||
match name {
|
match name {
|
||||||
Some(n) => {
|
Some(n) => {
|
||||||
println!("{element:b}: {n} (distance: {distance})");
|
println!("{element:b}: {n} (distance: {distance})");
|
||||||
if x+16 >= term_width {
|
if x+16 >= term_width {
|
||||||
x = 0;
|
x = 0;
|
||||||
y += 8;
|
y += 8;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user