diff --git a/src/interpolation/mod.rs b/src/interpolation/mod.rs index 78c8bc6..cf95ce3 100644 --- a/src/interpolation/mod.rs +++ b/src/interpolation/mod.rs @@ -32,9 +32,9 @@ pub trait InterpolatedRemapper<'a>: Sync { } type ColorTree = KdTree; -fn euclidean(a: &[f64; 3], b: &[f64; 3]) -> f64 { +fn squared_euclidean(a: &[f64; 3], b: &[f64; 3]) -> f64 { let dl = (a[0] - b[0]).powi(2); let da = (a[1] - b[1]).powi(2); let db = (a[2] - b[2]).powi(2); - (dl + da + db).sqrt() + dl + da + db } diff --git a/src/interpolation/nearest_neighbor.rs b/src/interpolation/nearest_neighbor.rs index 90a1ca7..56fd130 100644 --- a/src/interpolation/nearest_neighbor.rs +++ b/src/interpolation/nearest_neighbor.rs @@ -1,7 +1,7 @@ use image::Rgb; use oklab::{srgb_to_oklab, Oklab}; -use super::{euclidean, ColorTree, InterpolatedRemapper}; +use super::{squared_euclidean, ColorTree, InterpolatedRemapper}; use crate::{GenerateLut, Image}; /// Simple remapper that doesn't do any interpolation. Mostly used internally by the other @@ -40,7 +40,7 @@ impl<'a> InterpolatedRemapper<'a> for NearestNeighborRemapper<'a> { let Oklab { l, a, b } = srgb_to_oklab(pixel.0.into()); let (_, nearest) = self.tree.nearest_one( &[l as f64 * self.lum_factor, a as f64, b as f64], - &euclidean, + &squared_euclidean, ); *pixel = Rgb(self.palette[nearest as usize]); } diff --git a/src/interpolation/rbf/gaussian.rs b/src/interpolation/rbf/gaussian.rs index 5431ff4..095dd66 100644 --- a/src/interpolation/rbf/gaussian.rs +++ b/src/interpolation/rbf/gaussian.rs @@ -6,7 +6,7 @@ pub struct GaussianFn { } impl RadialBasisFn for GaussianFn { fn radial_basis(&self, distance: f64) -> f64 { - (-self.shape * distance.powf(2.0)).exp() + (-self.shape * distance).exp() } } diff --git a/src/interpolation/rbf/mod.rs b/src/interpolation/rbf/mod.rs index 8b4730b..8c29b81 100644 --- a/src/interpolation/rbf/mod.rs +++ b/src/interpolation/rbf/mod.rs @@ -2,7 +2,7 @@ use std::f64; use kiddo::float::{kdtree::KdTree, neighbour::Neighbour}; -use super::{euclidean, ColorTree, InterpolatedRemapper}; +use super::{squared_euclidean, ColorTree, InterpolatedRemapper}; use crate::GenerateLut; pub mod gaussian; @@ -70,7 +70,7 @@ impl<'a, F: RadialBasisFn> InterpolatedRemapper<'a> for RBFRemapper { match &self.tree { None => { for p_color in self.palette.iter() { - let distance = euclidean(&color, p_color); + let distance = squared_euclidean(&color, p_color); let weight = self.rbf.radial_basis(distance); numerator[0] += p_color[0] * weight; @@ -81,7 +81,7 @@ impl<'a, F: RadialBasisFn> InterpolatedRemapper<'a> for RBFRemapper { }, Some((nearest, tree)) => { for Neighbour { item, distance } in - tree.nearest_n(&color, *nearest, &euclidean) + tree.nearest_n(&color, *nearest, &squared_euclidean) { let weight = self.rbf.radial_basis(distance); let p_color = self.palette[item as usize]; diff --git a/src/interpolation/rbf/shepard.rs b/src/interpolation/rbf/shepard.rs index 5997019..13bdd22 100644 --- a/src/interpolation/rbf/shepard.rs +++ b/src/interpolation/rbf/shepard.rs @@ -6,7 +6,7 @@ pub struct InverseDistanceFn { } impl RadialBasisFn for InverseDistanceFn { fn radial_basis(&self, distance: f64) -> f64 { - 1.0 / distance.powf(self.power) + 1.0 / distance.sqrt().powf(self.power) } }