Add convolution method to TexImage. Fixes issue 166.

pull/216/head
castano 13 years ago
parent 8c65e4c62d
commit 91e6bbe5c3

@ -283,7 +283,6 @@ void GaussianFilter::setParameters(float variance)
/// Ctor.
Kernel1::Kernel1(const Filter & f, int iscale, int samples/*= 32*/)
{
nvDebugCheck(iscale > 1);
@ -312,13 +311,12 @@ Kernel1::Kernel1(const Filter & f, int iscale, int samples/*= 32*/)
}
}
/// Dtor.
Kernel1::~Kernel1()
{
delete m_data;
}
/// Print the kernel for debugging purposes.
// Print the kernel for debugging purposes.
void Kernel1::debugPrint()
{
for (int i = 0; i < m_windowSize; i++) {
@ -328,13 +326,18 @@ void Kernel1::debugPrint()
/// Ctor.
Kernel2::Kernel2(uint ws) : m_windowSize(ws)
{
m_data = new float[m_windowSize * m_windowSize];
}
/// Copy ctor.
Kernel2::Kernel2(uint ws, const float * data) : m_windowSize(ws)
{
m_data = new float[m_windowSize * m_windowSize];
memcpy(m_data, data, sizeof(float) * m_windowSize * m_windowSize);
}
Kernel2::Kernel2(const Kernel2 & k) : m_windowSize(k.m_windowSize)
{
m_data = new float[m_windowSize * m_windowSize];
@ -344,13 +347,12 @@ Kernel2::Kernel2(const Kernel2 & k) : m_windowSize(k.m_windowSize)
}
/// Dtor.
Kernel2::~Kernel2()
{
delete m_data;
}
/// Normalize the filter.
// Normalize the filter.
void Kernel2::normalize()
{
float total = 0.0f;
@ -364,7 +366,7 @@ void Kernel2::normalize()
}
}
/// Transpose the kernel.
// Transpose the kernel.
void Kernel2::transpose()
{
for(uint i = 0; i < m_windowSize; i++) {
@ -374,7 +376,7 @@ void Kernel2::transpose()
}
}
/// Init laplacian filter, usually used for sharpening.
// Init laplacian filter, usually used for sharpening.
void Kernel2::initLaplacian()
{
nvDebugCheck(m_windowSize == 3);
@ -392,7 +394,7 @@ void Kernel2::initLaplacian()
}
/// Init simple edge detection filter.
// Init simple edge detection filter.
void Kernel2::initEdgeDetection()
{
nvCheck(m_windowSize == 3);
@ -401,7 +403,7 @@ void Kernel2::initEdgeDetection()
m_data[6] = 0; m_data[7] = 0; m_data[8] = 0;
}
/// Init sobel filter.
// Init sobel filter.
void Kernel2::initSobel()
{
if (m_windowSize == 3)
@ -460,7 +462,7 @@ void Kernel2::initSobel()
}
}
/// Init prewitt filter.
// Init prewitt filter.
void Kernel2::initPrewitt()
{
if (m_windowSize == 3)
@ -486,7 +488,7 @@ void Kernel2::initPrewitt()
}
}
/// Init blended sobel filter.
// Init blended sobel filter.
void Kernel2::initBlendedSobel(const Vector4 & scale)
{
nvCheck(m_windowSize == 9);
@ -609,7 +611,7 @@ PolyphaseKernel::~PolyphaseKernel()
}
/// Print the kernel for debugging purposes.
// Print the kernel for debugging purposes.
void PolyphaseKernel::debugPrint() const
{
for (uint i = 0; i < m_length; i++)

@ -166,6 +166,7 @@ namespace nv
{
public:
Kernel2(uint width);
Kernel2(uint width, const float * data);
Kernel2(const Kernel2 & k);
~Kernel2();

@ -943,6 +943,26 @@ FloatImage * FloatImage::resize(const Filter & filter, uint w, uint h, uint d, W
}
void FloatImage::convolve(const Kernel2 & k, uint c, WrapMode wm)
{
AutoPtr<FloatImage> tmpImage = clone();
uint w = m_width;
uint h = m_height;
uint d = m_depth;
for (uint z = 0; z < d; z++)
{
for (uint y = 0; y < h; y++)
{
for (uint x = 0; x < w; x++)
{
pixel(c, x, y, 0) = tmpImage->applyKernelXY(&k, x, y, z, c, wm);
}
}
}
}
/// Apply 2D kernel at the given coordinates and return result.
float FloatImage::applyKernelXY(const Kernel2 * k, int x, int y, int z, uint c, WrapMode wm) const

@ -81,6 +81,7 @@ namespace nv
NVIMAGE_API FloatImage * resize(const Filter & filter, uint w, uint h, WrapMode wm, uint alpha) const;
NVIMAGE_API FloatImage * resize(const Filter & filter, uint w, uint h, uint d, WrapMode wm, uint alpha) const;
NVIMAGE_API void convolve(const Kernel2 & k, uint c, WrapMode wm);
//NVIMAGE_API FloatImage * downSample(const Kernel1 & filter, WrapMode wm) const;
//NVIMAGE_API FloatImage * downSample(const Kernel1 & filter, uint w, uint h, WrapMode wm) const;

@ -1490,6 +1490,16 @@ void TexImage::abs(int channel)
}
}
void TexImage::convolve(int channel, int kernelSize, float * kernelData)
{
if (m->image == NULL) return;
detach();
Kernel2 k(kernelSize, kernelData);
m->image->convolve(k, channel, (FloatImage::WrapMode)m->wrapMode);
}
/*
void TexImage::blockLuminanceScale(float scale)
{

@ -471,6 +471,7 @@ namespace nvtt
NVTT_API void toLUVW(float range = 1.0f);
NVTT_API void fromLUVW(float range = 1.0f);
NVTT_API void abs(int channel);
NVTT_API void convolve(int channel, int kernelSize, float * kernelData);
//NVTT_API void blockLuminanceScale(float scale);

Loading…
Cancel
Save