aboutsummaryrefslogtreecommitdiff
path: root/src/embedders.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/embedders.rs')
-rw-r--r--src/embedders.rs96
1 files changed, 1 insertions, 95 deletions
diff --git a/src/embedders.rs b/src/embedders.rs
index 8911e95..7257a27 100644
--- a/src/embedders.rs
+++ b/src/embedders.rs
@@ -1,4 +1,4 @@
-use anyhow::{bail, Result};
+use anyhow::Result;
use rayon::prelude::*;
use std::path::{Path, PathBuf};
use serde::{Deserialize, Serialize};
@@ -40,97 +40,3 @@ impl<T: EmbedderT> BatchEmbedder for T {
}
}
-pub struct BrightnessEmbedder;
-impl EmbedderT for BrightnessEmbedder {
- type Embedding = f64;
- const NAME: &'static str = "Brightness";
-
- fn embed(&self, path: &Path) -> Result<f64> {
- let im = image::open(path)?;
- let num_bytes = 3 * (im.height() * im.width());
-
- if num_bytes == 0 {
- bail!("Encountered NaN brightness, due to an empty image");
- }
-
- Ok(im.to_rgb8()
- .iter()
- .map(|e| *e as u64)
- .sum::<u64>() as f64 / num_bytes as f64)
- }
-}
-
-#[repr(transparent)]
-#[derive(Serialize, Deserialize)]
-pub struct Hue (f64);
-impl MetricElem for Hue {
- fn dist(&self, b: &Hue) -> f64 {
- let d = self.0.dist(&b.0);
- d.min(6.-d)
- }
-}
-
-pub struct HueEmbedder;
-impl EmbedderT for HueEmbedder {
- type Embedding = Hue;
- const NAME: &'static str = "Hue";
-
- fn embed(&self, path: &Path) -> Result<Hue> {
- let im = image::open(path)?;
- let num_pixels = im.height() * im.width();
- let [sr, sg, sb] = im
- .to_rgb8()
- .pixels()
- .fold([0, 0, 0], |[or, og, ob], n| {
- let [nr, ng, nb] = n.0;
- [or + nr as u64, og + ng as u64, ob + nb as u64]
- })
- .map(|e| e as f64 / 255. / num_pixels as f64);
-
- let hue =
- if sr >= sg && sr >= sb {
- (sg - sb) / (sr - sg.min(sb))
- }
- else if sg >= sb {
- 2. + (sb - sr) / (sg - sr.min(sb))
- }
- else {
- 4. + (sr - sg) / (sb - sr.min(sg))
- };
-
- if hue.is_nan() {
- bail!("Encountered NaN hue, possibly because of a colorless or empty image");
- }
-
- Ok(Hue(hue))
- }
-}
-
-impl MetricElem for (f64, f64, f64) {
- fn dist(&self, o: &(f64, f64, f64)) -> f64 {
- let (dr, dg, db) =
- ((self.0 - o.0), (self.1 - o.1), (self.2 - o.2));
- (dr*dr + dg*dg + db*db).sqrt()
- }
-}
-
-pub struct ColorEmbedder;
-impl EmbedderT for ColorEmbedder {
- type Embedding = (f64, f64, f64);
- const NAME: &'static str = "Color";
-
- fn embed(&self, path: &Path) -> Result<(f64, f64, f64)> {
- let im = image::open(path)?;
- let num_pixels = im.height() * im.width();
- let [sr, sg, sb] = im
- .to_rgb8()
- .pixels()
- .fold([0, 0, 0], |[or, og, ob], n| {
- let [nr, ng, nb] = n.0;
- [or + nr as u64, og + ng as u64, ob + nb as u64]
- })
- .map(|e| e as f64 / num_pixels as f64);
-
- Ok((sr, sg, sb))
- }
-}