int QccWAVWaveletDWT2DInt(QccMatrixInt
matrix, int num_rows, int num_cols, int origin_row, int origin_col, int
subsample_pattern_row, int subsample_pattern_col, int num_scales, const
QccWAVWavelet *wavelet);
int QccWAVWaveletInverseDWT2DInt(QccMatrixInt
matrix, int num_rows, int num_cols, int origin_row, int origin_col, int
subsample_pattern_row, int subsample_pattern_col, int num_scales, const
QccWAVWavelet *wavelet);
QccWAVWaveletInverseDWT2DInt() performs the corresponding separable 2DInt inverse DWT of matrix which is assumed to have been produced by QccWAVWaveletDWT2DInt(). num_scales gives the number of levels of decomposition that exist in matrix. QccWAVWaveletInverseDWT2DInt() calls QccWAVWaveletSynthesis2DInt(3) for each level of synthesis.
subsample_pattern_row and subsample_pattern_col indicate the even- or odd-phase subsampling to be used at each level of row and column decomposition. In most applications, even subsampling at all levels is desired, in which case both subsample_pattern_row and subsample_pattern_col should be set to zero. In more general settings, when some mixture of even- and odd-phase subsampling is desired, subsample_pattern_row and subsample_pattern_col can be integers between 0 and (2 ^ num_levels) - 1. In these integers, the jth bit (where j = 1 is the least-significant bit) indicates whether the jth level of decomposition employs even or odd subsampling (0 = even, 1 = odd). For example, if subsample_pattern_row is 5, then the first and third row decompositions use odd-phase subsampling, while all others use even subsampling.
Use QccWAVSubbandPyramidIntDWT(3) and QccWAVSubbandPyramidIntInverseDWT(3) to perform a 2D separable DWT or inverse DWT on a QccWAVSubbandPyramidInt data structure (which is the recommended way to do it, since the QccWAVSubbandPyramidInt structure stores the number of levels of decomposition along with the transform coefficients).
In traditional floating-point lifting, the prediction and update steps are generally followed by a single application of scaling by a constant in order to produce the usual unitary normalization. This scaling step is somewhat problematic for integer-valued lifting since the scaling constant is usually not an integer. In applications wherein unitary scaling is not required (e.g., in some applications that process each subband completely independently), the scaling step is simply dropped in order to implement an integer-valued version of the transform. Alternatively, one can append three additional lifting steps to implement the scaling; these additional lifting steps can then be rendered integer-valued via appropriate rounding (e.g., Xiong et al.) making the transforms approximately normalized. This latter approach of scaling via additional lifting steps is employed in the integer-valued lifting schemes implemented in QccPack.
A. R. Calderbank, I. Daubechies, W. Sweldens, B.-L. Yeo, "Lossless Image Compression Using Integer to Integer Wavelet Transforms", in Proceedings of the International Conference on Image Processing, Lausanne, Switzerland, pp. 596-599, September 1997.
Z. Xiong, X. Wu, S. Cheng, J. Hua, "Lossy-to-Lossless Compression of Medical Volumetric Data Using Three-Dimensional Integer Wavelet Transforms," IEEE Transactions on Medical Imaging, vol. 22, pp. 459-470, March 2003.
I. Daubechies and W. Sweldens, "Factoring Wavelet Transforms Into Lifting Steps," J. Fourier Anal. Appl., vol. 4, no. 3, pp. 245-267, 1998.