8 #include <OpenCLFramework/Algorithm/clfRecursiveGauss.hh>
9 #include <Base/Common/BIASpragma.hh>
10 #include <Base/Image/ImageIO.hh>
28 kernelNames_.push_back(
"RecursiveGaussianForwardXPacked");
29 kernelNames_.push_back(
"RecursiveGaussianForwardYPacked");
32 kernelNames_.push_back(
"RecursiveGaussianBackwardXPacked");
33 kernelNames_.push_back(
"RecursiveGaussianBackwardYPacked");
65 if (w % 16 == 0 && h % 16 == 0) {
69 BIASERR(
"recursive gauss needs images divisible by 16");
148 THROW_CL_EXCEPTION(cl::Error(-100,
"Need to use dst as tempory read/write"));
231 unsigned int w,h, worg, horg;
261 THROW_CL_EXCEPTION(cl::Error(-100,
"Need to use dst as temporary read/write"));
318 float alpha = 1.695f / sigma;
319 float ema = exp(-alpha);
320 float ema2 = exp(-2.0f * alpha);
332 const float k = (1.0f - ema)*(1.0f - ema)/(1.0f + (2.0f * alpha * ema) - ema2);
334 params_[1] = k * (alpha - 1.0f) * ema;
335 params_[2] = k * (alpha + 1.0f) * ema;
336 params_[3] = -k * ema2;
340 params_[0] = (1.0f - ema) * (1.0f - ema);
347 const float ea = exp(-alpha);
348 const float k = -(ema2 - 1.0f)/(2.0f * alpha * ema);
349 float kn = -2.0f * (-1.0f + (3.0f * ea) - (3.0f * ea * ea) + (ea * ea * ea));
350 kn /= (((3.0f * ea) + 1.0f + (3.0f * ea * ea) + (ea * ea * ea)));
352 params_[1] = -kn * (1.0f + (k * alpha)) * ema;
353 params_[2] = kn * (1.0f - (k * alpha)) * ema;
364 for (
unsigned int j=0;j<
params_.size();j++) {
int FilterX(clfImage2D *src, clfImage2D *&dst)
filter in X-direction
std::string AddSource(std::string filename)
adds source code from a file
clfImage2D * oneDirFilteredImage_
void GetImageDim(unsigned int &width, unsigned int &height) const
void Allocate(BIAS::ImageBase::EStorageType st, BIAS::ImageBase::EColorModel cm, unsigned int width, unsigned int height, unsigned int stride=0, bool readonly=false, bool writeonly=false, const void *hostptr=NULL, bool copy=false)
Allocation of a memory buffer as 2D image, either call directly or use wrapper for BIAS::ImageBase...
virtual ~clfRecursiveGauss()
std::vector< float > params_
clfImage2D * packedGreyImage_
BIAS::ImageBase::EColorModel ColorModel() const
void Build(int deviceNr=0, std::string options="")
builds the sources added by AddSource and AddSourceFromString
BIAS::ImageBase::EStorageType StorageType() const
void Finish()
force finishing the command queue
int Filter(clfImage2D *src, clfImage2D *&dst)
gauss filter rgba image
clfRecursiveGauss(float sigma=2.0f, clfContext *ctx=NULL, bool sharedGL=false, unsigned int device=0)
constructor, give context or let
int FilterGrey(clfImage2D *src, clfImage2D *&dst)
optimized gauss filter for grey images
void KernelSetArgument(std::string kernelname, unsigned int argnumber, clfBuffer &buffer)
set kernel argument
void AddKernel(std::string kernelname)
adds a kernel to the program.
void RunOn2DRange(clfProgram &program, std::string kernelname, unsigned int globalrangeX, unsigned int globalrangeY, unsigned int localrangeX=0, unsigned int localrangeY=0)
run a kernel on a 2D memory range
void Reset()
clear intermediate images resets storage of internal images, needs to be called if image sizes differ...
int FilterGreyColPacked(clfImage2D *src, clfImage2D *&dst)
optimized gauss filter for already packed grey images
void AddKernels(std::vector< std::string > kernelnames)
adds a vector of kernels to the program.
void AllocateFromTemplate(const clfImage2D &src, bool readonly=false, bool writeonly=false)
std::vector< std::string > kernelNames_
clfImage2D * CreateImage2D()
create buffer object
void RunOn1DRange(clfProgram &program, std::string kernelname, unsigned int globalrange, unsigned int localrange=0)
run a kernel on a 1D memory range
clfImage2D * intermediateImage_
int FilterY(clfImage2D *src, clfImage2D *&dst)
filter in Y-direction
void SetSigma(float sigma, int order=0)
Set Sigma and calculate coefficients for iir filter.
void CopyToImage(clfImage2D &outputimage, unsigned int srcoriginX=0, unsigned int srcoriginY=0, unsigned int dstoriginX=0, unsigned int dstoriginY=0, unsigned int regionX=0, unsigned int regionY=0, bool blocking=true)