www.pudn.com > VC_图像小波分解.rar > wavelet.cpp
#include "stdafx.h"
#include "wavelet.h"
double spline[21]
= { 0.7661300537597422, 0.4339226335893024, -0.0502017246714322,
-0.1100370183880987, 0.0320808974701767, 0.0420683514407039,
-0.0171763154919797, -0.0179823209809603, 0.0086852948130698,
0.0082014772059938, -0.0043538394577629, -0.0038824252655926,
0.0021867123701413, 0.0018821335238871, -0.0011037398203844,
-0.0009271987314557, 0.0005599366433624, 0.0004621152275223,
-0.0002853837186721, -0.0002323472940263, 0.0001460418697826 };
double d4[4]
= { 0.482962913145, 0.836516303738, 0.224143868042, -0.129409522551 };
double d8[8]
= { 0.230377813309, 0.714846570553, 0.630880767930, -0.027983769417,
-0.187034811719, 0.030841381836, 0.032883011667, -0.010597401785 };
double d16[16]
= { 0.054415842243, 0.312871590914, 0.675630736297, 0.585354683654,
-0.015829105256, -0.284015542962, 0.000472484574, 0.128747426620,
-0.017369301002, -0.044088253931, 0.013981027917, 0.008746094047,
-0.004870352993, -0.000391740373, 0.000675449409, -0.000117476784 };
/* ------------------------------------------------------------ */
wavelet_2d(double* image,int m,int n,int l,int s)
{
int i, j, ii;
double tmp;
if (l == 0) /* check termination condition */
{
return(n);
}
switch (s) {
case 0:
if (n == 8)
return(n);
break;
case 1:
if (n == 1)
return(n);
break;
case 2:
if (n == 2)
return(n);
break;
case 4:
if (n == 4)
return(n);
break;
case 8:
if (n == 8)
return(n);
break;
default: /* undefined scaling function */
return(-1);
}
for (i = 0; i < n; i++) /* rowwise decomposition */
decomposition(image+i*m, image+i*m, image+i*m+n/2, n, s);
for (i = 1; i < n; i++) { /* matrix transpose */
ii = i*m;
for (j = 0; j < i; j++) {
tmp = image[ii+j];
image[ii+j] = image[j*m+i];
image[j*m+i] = tmp;
}
}
for ( i = 0; i < n; i++) /* columnwise decomposition */
decomposition(image+i*m, image+i*m, image+i*m+n/2, n, s);
for (i = 1; i < n; i++) { /* another matrix transpose */
ii = i*m;
for (j = 0; j < i; j++) {
tmp = image[ii+j];
image[ii+j] = image[j*m+i];
image[j*m+i] = tmp;
}
}
return(wavelet_2d(image, m/2, n/2, --l, s)); /* recursion */
}
/* --------------------------------------------------------------- */
i_wavelet_2d(double* image,int m,int n,int s)
{
int i, j, ii, jj, k, kk1, kk2, nn, th1;
double tmp;
if (m == n) /* check termination condition */
return 0;
nn = n << 1;
th1 = m/nn;
if (nn != m) {
for (k=0; k