2007-04-17 08:49:19 +00:00
|
|
|
// This code is in the public domain -- castanyo@yahoo.es
|
|
|
|
|
|
|
|
#ifndef NV_IMAGE_FILTER_H
|
|
|
|
#define NV_IMAGE_FILTER_H
|
|
|
|
|
|
|
|
#include <nvimage/nvimage.h>
|
2007-12-03 08:34:32 +00:00
|
|
|
#include <nvcore/Debug.h>
|
2007-04-17 08:49:19 +00:00
|
|
|
|
|
|
|
namespace nv
|
|
|
|
{
|
|
|
|
class Vector4;
|
|
|
|
|
2007-12-02 10:31:37 +00:00
|
|
|
/// Base filter class.
|
|
|
|
class Filter
|
2007-04-17 08:49:19 +00:00
|
|
|
{
|
2007-12-02 10:31:37 +00:00
|
|
|
public:
|
|
|
|
NVIMAGE_API Filter(float width);
|
2007-12-03 08:34:32 +00:00
|
|
|
NVIMAGE_API virtual ~Filter();
|
2007-12-02 10:31:37 +00:00
|
|
|
|
|
|
|
NVIMAGE_API float width() const { return m_width; }
|
2007-12-06 10:13:01 +00:00
|
|
|
NVIMAGE_API float sampleDelta(float x, float scale) const;
|
|
|
|
NVIMAGE_API float sampleBox(float x, float scale, int samples) const;
|
|
|
|
NVIMAGE_API float sampleTriangle(float x, float scale, int samples) const;
|
2007-12-02 10:31:37 +00:00
|
|
|
|
|
|
|
virtual float evaluate(float x) const = 0;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
const float m_width;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Box filter.
|
|
|
|
class BoxFilter : public Filter
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
NVIMAGE_API BoxFilter();
|
|
|
|
NVIMAGE_API BoxFilter(float width);
|
|
|
|
NVIMAGE_API virtual float evaluate(float x) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Triangle (bilinear/tent) filter.
|
|
|
|
class TriangleFilter : public Filter
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
NVIMAGE_API TriangleFilter();
|
|
|
|
NVIMAGE_API TriangleFilter(float width);
|
|
|
|
NVIMAGE_API virtual float evaluate(float x) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Quadratic (bell) filter.
|
|
|
|
class QuadraticFilter : public Filter
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
NVIMAGE_API QuadraticFilter();
|
|
|
|
NVIMAGE_API virtual float evaluate(float x) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Cubic filter from Thatcher Ulrich.
|
|
|
|
class CubicFilter : public Filter
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
NVIMAGE_API CubicFilter();
|
|
|
|
NVIMAGE_API virtual float evaluate(float x) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Cubic b-spline filter from Paul Heckbert.
|
|
|
|
class BSplineFilter : public Filter
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
NVIMAGE_API BSplineFilter();
|
|
|
|
NVIMAGE_API virtual float evaluate(float x) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
/// Mitchell & Netravali's two-param cubic
|
|
|
|
/// @see "Reconstruction Filters in Computer Graphics", SIGGRAPH 88
|
|
|
|
class MitchellFilter : public Filter
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
NVIMAGE_API MitchellFilter();
|
|
|
|
NVIMAGE_API virtual float evaluate(float x) const;
|
|
|
|
|
|
|
|
NVIMAGE_API void setParameters(float a, float b);
|
|
|
|
|
|
|
|
private:
|
|
|
|
float p0, p2, p3;
|
|
|
|
float q0, q1, q2, q3;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Lanczos3 filter.
|
|
|
|
class LanczosFilter : public Filter
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
NVIMAGE_API LanczosFilter();
|
|
|
|
NVIMAGE_API virtual float evaluate(float x) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Sinc filter.
|
|
|
|
class SincFilter : public Filter
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
NVIMAGE_API SincFilter(float w);
|
|
|
|
NVIMAGE_API virtual float evaluate(float x) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Kaiser filter.
|
|
|
|
class KaiserFilter : public Filter
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
NVIMAGE_API KaiserFilter(float w);
|
|
|
|
NVIMAGE_API virtual float evaluate(float x) const;
|
|
|
|
|
|
|
|
NVIMAGE_API void setParameters(float a, float stretch);
|
2007-11-28 10:34:40 +00:00
|
|
|
|
2007-12-02 10:31:37 +00:00
|
|
|
private:
|
|
|
|
float alpha;
|
|
|
|
float stretch;
|
2007-04-17 08:49:19 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2007-12-02 10:31:37 +00:00
|
|
|
|
2007-04-17 08:49:19 +00:00
|
|
|
/// A 1D kernel. Used to precompute filter weights.
|
|
|
|
class Kernel1
|
|
|
|
{
|
2007-12-03 08:34:32 +00:00
|
|
|
NV_FORBID_COPY(Kernel1);
|
2007-04-17 08:49:19 +00:00
|
|
|
public:
|
2007-12-03 08:34:32 +00:00
|
|
|
NVIMAGE_API Kernel1(const Filter & f, int iscale, int samples = 32);
|
2007-04-17 08:49:19 +00:00
|
|
|
NVIMAGE_API ~Kernel1();
|
|
|
|
|
|
|
|
float valueAt(uint x) const {
|
2007-12-03 08:34:32 +00:00
|
|
|
nvDebugCheck(x < (uint)m_windowSize);
|
2007-11-28 10:34:40 +00:00
|
|
|
return m_data[x];
|
2007-04-17 08:49:19 +00:00
|
|
|
}
|
|
|
|
|
2007-12-03 08:34:32 +00:00
|
|
|
int windowSize() const {
|
2007-11-28 10:34:40 +00:00
|
|
|
return m_windowSize;
|
2007-04-17 08:49:19 +00:00
|
|
|
}
|
2007-12-03 08:34:32 +00:00
|
|
|
|
|
|
|
float width() const {
|
|
|
|
return m_width;
|
|
|
|
}
|
2007-04-17 08:49:19 +00:00
|
|
|
|
|
|
|
NVIMAGE_API void debugPrint();
|
|
|
|
|
|
|
|
private:
|
2007-12-03 08:34:32 +00:00
|
|
|
int m_windowSize;
|
|
|
|
float m_width;
|
2007-11-28 10:34:40 +00:00
|
|
|
float * m_data;
|
2007-04-17 08:49:19 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/// A 2D kernel.
|
|
|
|
class Kernel2
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
NVIMAGE_API Kernel2(uint width);
|
|
|
|
NVIMAGE_API Kernel2(const Kernel2 & k);
|
|
|
|
NVIMAGE_API ~Kernel2();
|
|
|
|
|
|
|
|
NVIMAGE_API void normalize();
|
|
|
|
NVIMAGE_API void transpose();
|
|
|
|
|
|
|
|
float valueAt(uint x, uint y) const {
|
2007-11-28 10:34:40 +00:00
|
|
|
return m_data[y * m_windowSize + x];
|
2007-04-17 08:49:19 +00:00
|
|
|
}
|
|
|
|
|
2007-11-28 10:34:40 +00:00
|
|
|
uint windowSize() const {
|
|
|
|
return m_windowSize;
|
2007-04-17 08:49:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
NVIMAGE_API void initLaplacian();
|
|
|
|
NVIMAGE_API void initEdgeDetection();
|
|
|
|
NVIMAGE_API void initSobel();
|
|
|
|
NVIMAGE_API void initPrewitt();
|
2007-11-28 05:04:16 +00:00
|
|
|
|
2007-04-17 08:49:19 +00:00
|
|
|
NVIMAGE_API void initBlendedSobel(const Vector4 & scale);
|
2007-11-28 05:04:16 +00:00
|
|
|
|
2007-04-17 08:49:19 +00:00
|
|
|
private:
|
2007-11-28 10:34:40 +00:00
|
|
|
const uint m_windowSize;
|
|
|
|
float * m_data;
|
2007-04-17 08:49:19 +00:00
|
|
|
};
|
|
|
|
|
2007-12-02 10:31:37 +00:00
|
|
|
|
2007-11-28 05:04:16 +00:00
|
|
|
/// A 1D polyphase kernel
|
|
|
|
class PolyphaseKernel
|
|
|
|
{
|
2007-12-03 08:34:32 +00:00
|
|
|
NV_FORBID_COPY(PolyphaseKernel);
|
2007-11-28 05:04:16 +00:00
|
|
|
public:
|
2007-12-03 08:34:32 +00:00
|
|
|
NVIMAGE_API PolyphaseKernel(const Filter & f, uint srcLength, uint dstLength, int samples = 32);
|
2007-11-28 05:04:16 +00:00
|
|
|
NVIMAGE_API ~PolyphaseKernel();
|
|
|
|
|
2007-12-03 08:34:32 +00:00
|
|
|
int windowSize() const {
|
2007-12-02 10:31:37 +00:00
|
|
|
return m_windowSize;
|
2007-11-28 05:04:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
uint length() const {
|
|
|
|
return m_length;
|
|
|
|
}
|
2007-12-02 10:31:37 +00:00
|
|
|
|
|
|
|
float width() const {
|
|
|
|
return m_width;
|
|
|
|
}
|
|
|
|
|
|
|
|
float valueAt(uint column, uint x) const {
|
|
|
|
nvDebugCheck(column < m_length);
|
2007-12-03 08:34:32 +00:00
|
|
|
nvDebugCheck(x < (uint)m_windowSize);
|
2007-12-02 10:31:37 +00:00
|
|
|
return m_data[column * m_windowSize + x];
|
|
|
|
}
|
|
|
|
|
|
|
|
NVIMAGE_API void debugPrint() const;
|
2007-11-28 05:04:16 +00:00
|
|
|
|
|
|
|
private:
|
2007-12-03 08:34:32 +00:00
|
|
|
int m_windowSize;
|
2007-12-02 10:31:37 +00:00
|
|
|
uint m_length;
|
|
|
|
float m_width;
|
2007-11-28 05:04:16 +00:00
|
|
|
float * m_data;
|
|
|
|
};
|
2007-04-17 08:49:19 +00:00
|
|
|
|
|
|
|
} // nv namespace
|
|
|
|
|
|
|
|
#endif // NV_IMAGE_FILTER_H
|