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

View file

@ -9,8 +9,8 @@ use std::marker::PhantomData;
use image::RgbaImage; use image::RgbaImage;
use palette::{ use palette::{
Clamp, IntoColor, Lab, Srgb, Clamp, IntoColor, Lab, Oklab, Srgb,
color_difference::{Ciede2000, HyAb}, color_difference::{Ciede2000, EuclideanDistance, HyAb},
}; };
use rand::{Rng, SeedableRng, rngs::SmallRng}; 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; pub struct DiffManhattan;
impl<C: AsRef<[f32; 3]>> Difference<C> for DiffManhattan { impl<C: AsRef<[f32; 3]>> Difference<C> for DiffManhattan {