Discrete wavelet transform (DWT) has been heavily studied and developed in several computer graphics applications. However, when dealing with enormous data volume in computer graphics, its performance may drastically reduce.

To solve this problem, we developed a DWT shader that runs on existing GPU hardwares. We implement the convolutionary based DWT and propose an indirect addressing technique that supports various boundary extension schemes. The proposed technique also unifies the computation of both forward and inverse DWT, hence making the shaders for FDWT and IDWT are basically the same. This may simplify the future hardware implementation. The software has already been successfully integrated into the well-known JPEG2000 codec, JasPer.

To popularize the usage of DWT on GPU, we release both the full source code and binary. The software is released in two forms:
1) JasPer unofficial GPU extension (both source code and compiled binary),
2) Standalone DWT-GPU C++ Class (source code with example program).

The JasPer Software is an open-source initiative to provide a free software-based reference implementation of the codec specified in the JPEG2000 Part 1 standard. More information about JasPer can be found here. We have successfully integrated our GPU-DWT class into the JasPer software, which significantly accelerates the encoding/decoding process and is useful for handling high-resolution images.

The DWT-GPU C++ class is a free open souce software module which you can incorporate into your application and perform fast discrete wavelet transform on large data set using the parallel power of current generation GPUs.

 
  • Free and open source
  • Fast DWT shader using GPU
  • Modifiable filter kernel and boundary extension scheme
  • Completely integrated in JPEG2000 codec, JasPer
  • Also as standalone C++ Class, with example usage. Easy integration into your own applications.
  • Can be used to handle geometric, image, or any other data in 2D grid structure.
dwtgpu.1.0.zip

Version :1.0 (Released on 18 July 2006)

System Requirement

Hardware: Pentium III or above, 128MB RAM, installed with graphics boards including nVidia GeForce FX, Quadro FX or above (large video RAM preferred)
OS: Windows 2000/XP, with OpenGL 1.4

Installation and Example Usage (Compiled Binary)

  1. Simply expand the zip to a directory, e.g. c:\jasper-1.701.0.gpu
  2. The program can be executed with GPU acceleration enabled (GPU mode) or disabled (software mode, i.e. original JasPer).

Encoding a .bmp into .jpc using GPU mode
c:\jasper-1.701.0.gpu\bin\> jasper -f myfile.bmp -t bmp -F myfile.jpc -T jpc -O mode=real -O rate=0.9

Decoding a .jpc into .bmp using GPU mode
c:\jasper-1.701.0.gpu\bin\> jasper -f myfile.jpc -t jpc -F myfile.bmp -T bmp

Encoding a .bmp into .jpc using software mode (original JasPer)
c:\jasper-1.701.0.gpu\bin\> jasper -f myfile.bmp -t bmp -F myfile.jpc -T jpc -O mode=real -O rate=0.9 -O nogpu

Decoding a .jpc into .bmp using software mode (original JasPer)
c:\jasper-1.701.0.gpu\bin\> jasper -f myfile.jpc -t jpc -F myfile.bmp -T bmp -o nogpu

for other options, please refer to the japser manual.

Screen Shot

 

Compilation Instructions (Source Code)

  1. Download the zip file and extract to a directory, e.g. c:\jasper-1.701.0.gpu
  2. Start .dsw project file with Visual C++
  3. Compile and run the executable as above

Note:

  • The performance of the GPU-accelerated JPEG2000 coding may vary depending on the current usage of graphics card resources, and the drivers from vendor
  • Large video memory preferred, or it may be unable to create the necessary textures. In case of problem, please switch to software mode using the -O nogpu (or -o nogpu if decoding a .jpc file).

JPEG2000 Viewer

  • You can use the JasPer image viewer jiv.exe to view the .jpc files
  • You can also download the Irfanview software for viewing jpc files at http://www.irfanview.com/


Version : 1.0 (Released on 18 July 2006)

System Requirement

Hardware: Pentium III or above, 128MB RAM, installed with graphics boards including nVidia GeForce FX, Quadro FX or above (large video RAM preferred)
OS: Windows 2000/XP, with OpenGL 1.4

Installation Instructions (source code)

  1. Download the zip file and extract to a directory, e.g. c:\jasper
  2. Start demo.dsw project file with Visual C++
  3. Compile and run the executable demo.exe

C++ Class API:

// DWT transform, suitable for tasks that only do forward or inverse DWT once
// detail information about the parameters please see comment inside the cpp file

bool dwtallinone(extmode mode, int imagewidth, int imageheight, float* imagebuffer, int level, bool isforward, bool initGL, bool initGLEW);
bool dwtallinone(extmode mode, int imagewidth, int imageheight, float* imagebuffer, int beg_level, int end_level, bool isforward, bool initGL, bool initGLEW);

// initialize and feed in the buffer, both forward and inverse dwt are available for call after return
bool initialize(extmode mode, int imagewidth, int imageheight, float* imagebuffer, bool initGL, bool initGLEW);

//render input image data to texture
bool createImgTex( float *imgbuffer);

// the forward and inverse dwt function
bool forwarddwt(int level);
bool inversedwt(int level);


// retrieve the transformed buffer back
void getbuffer(float *myfloatbuffer);

Example Usage

There are 2 major ways to use this class.

  1. For those who need to do either forward or inverse DWT only once. You only need to call the function dwtallinone() that handles everything and performs flexible levels of transform on your data. (Please note that levels start from 0, i.e. level 0 transform gives you 4 subbands, and level 1 will further process on the LL subband of level 0)

    e.g. do 2 levels of forward DWT to the imgbuffer

    imgbuffer=(float*)malloc(imgwidth*imgheight*3*sizeof(float));

    CDwtObj * mydwtobj = new CDwtObj;

    mydwtobj->dwtallinone(symper,imgwidth,imgheight,imgbuffer,2,true,true,true);
    delete mydwtobj;



  2. For those who need to get more control of the tranform process and do some processing to the data in the wavelet domain. Please use initialize(), forwarddwt(), inversedwt(), createImgTex() and getbuffer().

    e.g. data processing in the wavelet domain

    imgbuffer=(float*)malloc(imgwidth*imgheight*3*sizeof(float));
    CDwtObj *mydwtobj=new CDwtObj;
    ......

    mydwtobj->initialize(symper,imgwidth,imgheight,imgbuffer,false,true);
    mydwtobj->forwarddwt(0);
    mydwtobj->forwarddwt(1);
    mydwtobj->getbuffer(imgbuffer);


    // do my processing to imgbuffer in the wavelet domain
    ......

    // reinput the updated buffer
    mydwtobj->createImgTex(imgbuffer);

    // inverse transform back
    mydwtobj->inverse_dwt(1);
    mydwtobj->inverse_dwt(0);
    mydwtobj->getbuffer(imgbuffer);

    delete mydwtobj;

   

  • " Discrete Wavelet Transform on Consumer-Level Graphics Hardware",
    T. T. Wong, C. S. Leung, P. A. Heng and J. Wang,
    IEEE Transactions on Multimedia, Vol. 9, No. 3, April 2007, pp. 668-673.

  • "Discrete Wavelet Transform on GPU",
    J. Wang, T. T. Wong, P. A. Heng and C. S. Leung,
    in Proceedings of ACM Workshop on General Purpose Computing on Graphics Processors, Los Angeles, USA, August 2004, pp. C-41.

   

Please send any bug report to Jianqing Wang

For other queries, please contact Tien-Tsin Wong

2004 © The Chinese Univeristy of Hong Kong
Animation of Illumination - Texture Decoupling Animation of Stylish Image Processing