diff --git a/src/nvimage/CMakeLists.txt b/src/nvimage/CMakeLists.txt index 9db199c..0d180f1 100644 --- a/src/nvimage/CMakeLists.txt +++ b/src/nvimage/CMakeLists.txt @@ -7,6 +7,7 @@ SET(IMAGE_SRCS DirectDrawSurface.h DirectDrawSurface.cpp Filter.h Filter.cpp FloatImage.h FloatImage.cpp + ErrorMetric.h ErrorMetric.cpp Image.h Image.cpp ImageIO.h ImageIO.cpp NormalMap.h NormalMap.cpp diff --git a/src/nvimage/Filter.cpp b/src/nvimage/Filter.cpp index 21a2609..6bcfded 100644 --- a/src/nvimage/Filter.cpp +++ b/src/nvimage/Filter.cpp @@ -265,6 +265,19 @@ void KaiserFilter::setParameters(float alpha, float stretch) this->stretch = stretch; } +GaussianFilter::GaussianFilter(float w) : Filter(w) { setParameters(1); } + +float GaussianFilter::evaluate(float x) const +{ + // variance = sigma^2 + return (1.0f / sqrtf(2 * PI * variance)) * expf(-x*x / (2 * variance)); +} + +void GaussianFilter::setParameters(float variance) +{ + this->variance = variance; +} + /// Ctor. diff --git a/src/nvimage/Filter.h b/src/nvimage/Filter.h index 407839b..bb9ca7d 100644 --- a/src/nvimage/Filter.h +++ b/src/nvimage/Filter.h @@ -116,6 +116,19 @@ namespace nv float stretch; }; + // Gaussian filter. + class GaussianFilter : public Filter + { + public: + GaussianFilter(float w); + virtual float evaluate(float x) const; + + void setParameters(float variance); + + private: + float variance; + }; + /// A 1D kernel. Used to precompute filter weights. diff --git a/src/nvmath/Color.h b/src/nvmath/Color.h index 02c3b70..f42a0a1 100644 --- a/src/nvmath/Color.h +++ b/src/nvmath/Color.h @@ -178,10 +178,10 @@ namespace nv inline float perceptualColorDistance(Vector3::Arg c0, Vector3::Arg c1) { - float rmean = (c0.r + c1.r) * 0.5f; - float r = c1.r - c0.r; - float g = c1.g - c0.g; - float b = c1.b - c0.b; + float rmean = (c0.x + c1.x) * 0.5f; + float r = c1.x - c0.x; + float g = c1.y - c0.y; + float b = c1.z - c0.z; return sqrtf((2 + rmean)*r*r + 4*g*g + (3 - rmean)*b*b); }