Add euclid-in-oklab distance option

This commit is contained in:
Joscha 2025-03-14 18:23:19 +01:00
parent 2a862a69d6
commit 4fcf68aef2
2 changed files with 16 additions and 2 deletions

View file

@ -94,6 +94,8 @@ enum DitherDifference {
HyAbClamp,
Ciede2000,
Ciede2000Clamp,
Oklab,
OklabClamp,
Manhattan,
ManhattanClamp,
}
@ -187,6 +189,8 @@ impl DitherCmd {
HyAbClamp => self.run_cd::<C, DiffClamp<DiffHyAb>>(image),
Ciede2000 => self.run_cd::<C, DiffCiede2000>(image),
Ciede2000Clamp => self.run_cd::<C, DiffClamp<DiffCiede2000>>(image),
Oklab => self.run_cd::<C, DiffCiede2000>(image),
OklabClamp => self.run_cd::<C, DiffClamp<DiffCiede2000>>(image),
Manhattan => self.run_cd::<C, DiffManhattan>(image),
ManhattanClamp => self.run_cd::<C, DiffClamp<DiffManhattan>>(image),
}

View file

@ -9,8 +9,8 @@ use std::marker::PhantomData;
use image::RgbaImage;
use palette::{
Clamp, IntoColor, Lab, Srgb,
color_difference::{Ciede2000, HyAb},
Clamp, IntoColor, Lab, Oklab, Srgb,
color_difference::{Ciede2000, EuclideanDistance, HyAb},
};
use rand::{Rng, SeedableRng, rngs::SmallRng};
@ -65,6 +65,16 @@ impl<C: IntoColor<Lab>> Difference<C> for DiffCiede2000 {
}
}
pub struct DiffOklab;
impl<C: IntoColor<Oklab>> Difference<C> for DiffOklab {
fn diff(a: C, b: C) -> f32 {
let a: Oklab = a.into_color();
let b: Oklab = b.into_color();
a.distance(b)
}
}
pub struct DiffManhattan;
impl<C: AsRef<[f32; 3]>> Difference<C> for DiffManhattan {