Table of Contents
QccWAVWaveletAnalysis2DInt, QccWAVWaveletSynthesis2DInt - integer-valued
separable wavelet analysis/synthesis of a 2DInt signal
#include
"libQccPack.h"
int QccWAVWaveletAnalysis2DInt(QccMatrixInt matrix, int
num_rows, int num_cols, int phase_row, int phase_col, const QccWAVWavelet
*wavelet);
int QccWAVWaveletSynthesis2DInt(QccMatrixInt matrix, int num_rows,
int num_cols, int phase_row, int phase_col, const QccWAVWavelet *wavelet);
QccWAVWaveletAnalysis2DInt() performs one level of an integer-valued
separable 2D wavelet decomposition for a two-dimensional signal, matrix,
which is represented as a matrix of num_rows rows and num_cols columns.
Essentially, QccWAVWaveletAnalysis2DInt() calls QccWAVWaveletAnalysis1DInt(3)
once for each row of the matrix, then once for each column of the matrix.
phase_row and phase_col indicate whether the rows and columns, respectively,
of the image start with even- or odd-indexed samples. Usually, one assumes
that the upper-left corner of the image is indexed as (0, 0) - in this case,
both phase_row and phase_col would be QCCWAVWAVELET_PHASE_EVEN. In any
event, phase_row is passed as the phase argument for each call to QccWAVWaveletAnalysis1DInt(3)
for the rows, and similarly for phase_col for analysis of the columns.
The result of the separable decomposition is returned in matrix. The low-low
subband (baseband) is returned in the upper-left quadrant of matrix, the
low-high subband (vertical subband) is returned in the upper-right quadrant,
the high-low subband (horizontal subband) is returned in the lower-left
quadrant, and the high-high subband (diagonal subband) is returned in the
lower-right quadrant. wavelet must indicate an integer-valued lifting scheme
(see QccWAVLiftingSchemeInteger(3)
).
QccWAVWaveletSynthesis2DInt() performs
one level of integer-valued separable wavelet synthesis for a 2D signal.
Subbands in matrix are assumed to be organized as described above for
the output of QccWAVWaveletAnalysis2DInt(). QccWAVWaveletSynthesis2DInt()
calls QccWAVWaveletSynthesis1DInt(3)
once for each column then once for
each row. The result of the separable wavelet synthesis is returned in
matrix.
Note: In general, you will probably want to use QccWAVWaveletDWT2DInt(3)
and QccWAVWaveletInverseDWT2DInt(3)
instead of these routines for implementing
a discrete wavelet transform and its inverse since QccWAVWaveletDWT2DInt(3)
and QccWAVWaveletInverseDWT2DInt(3)
allow any number of scales, or levels,
of decomposition to be performed.
Transforms generally provide perfect reconstruction in that the inverse
transform will perfectly invert transform coefficients into an exact representation
of the original signal. However, when implemented in floating-point arithmetic,
the potential for loss arises due to the limits of finite precision in
both the forward and inverse transforms. On the other hand, transforms
that map integer-valued signals into integer-valued transforms coefficients
can guarantee perfect reconstruction, provided an inverse transform can
be found. For this reason, lifting schemes, in which inverse transforms
are trivial, are favored for the implementation of integer-valued wavelet
transforms. Typically, the general approach proposed by Calderbank et al.
is followed wherein rounding of floating-point values to integers is performed
at each prediction and update step in a lifting scheme. Integer versions
of several popular biorthogonal wavelets were created in this manner by
Calderbank et al., as well as by Xiong et al.
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.
These routines return 0 on success and 1 on error.
QccWAVWaveletAnalysis1DInt(3)
, QccWAVWaveletSynthesis1DInt(3)
, QccWAVWaveletDWT2DInt(3)
,
QccWAVWaveletInverseDWT2DInt(3)
, QccWAVWavelet(3)
, QccPackWAV(3)
, QccPack(3)
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.
Copyright (C) 1997-2021
James E. Fowler
Table of Contents