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