📄 wavelet.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <io.h>
#include <fcntl.h>
#define C0 0.4829629131445341
#define C1 0.8365163037378079
#define C2 0.2241438680420134
#define C3 -0.1294095225512604
#define LD0 3.782845550726404e-002
#define LD1 -2.384946501955684e-002
#define LD2 -1.106244044184372e-001
#define LD3 3.774028556128307e-001
#define LD4 8.526986790088939e-001
#define LD5 3.774028556128307e-001
#define LD6 -1.106244044184372e-001
#define LD7 -2.384946501955684e-002
#define LD8 3.782845550726404e-002
#define HD0 -6.453888262869706e-002
#define HD1 4.068941760916406e-002
#define HD2 4.180922732216172e-001
#define HD3 -7.884856164055829e-001
#define HD4 4.180922732216172e-001
#define HD5 4.068941760916406e-002
#define HD6 -6.453888262869706e-002
#define LR0 -6.453888262869706e-002
#define LR1 -4.068941760916406e-002
#define LR2 4.180922732216172e-001
#define LR3 7.884856164055829e-001
#define LR4 4.180922732216172e-001
#define LR5 -4.068941760916406e-002
#define LR6 -6.453888262869706e-002
#define HR0 -3.782845550726404e-002
#define HR1 -2.384946501955684e-002
#define HR2 1.106244044184372e-001
#define HR3 3.774028556128307e-001
#define HR4 -8.526986790088939e-001
#define HR5 3.774028556128307e-001
#define HR6 1.106244044184372e-001
#define HR7 -2.384946501955684e-002
#define HR8 -3.782845550726404e-002
#define len 256
void function1( unsigned char *ch, int nn0, int nn1, unsigned int ns, double bpp, double *image);
void function2( unsigned char *u, double *checked1);
void wdecom(double *image, unsigned long int * nn, int ndim, int direction, int ns);
void main()
{
static double a[len]=
{
87123, 87369, 86749, 86853,
85839, 83805, 80595, 76003,
31108, 31526, 31510, 31630,
94151, 95761, 97075, 98451,
60664, 58524, 56448, 54124,
59226, 60040, 61246, 60788,
68391, 70339, 71941, 73267,
82019, 81271, 80415, 79753,
82673, 84299, 85021, 85217,
78279, 78863, 77525, 77655,
80395, 80809, 79463, 79851,
84945, 86597, 86651, 85223,
35914, 32376, 31536, 31366,
73019, 78407, 83393, 87817,
74709, 70531, 66411, 62284,
55522, 57458, 58512, 59396,
86899, 86737, 87033, 87061,
71187, 67241, 63280, 58602,
33520, 37460, 41828, 46404,
99079, 98327, 96577, 94845,
51804, 52136, 51450, 51452,
59130, 59292, 58638, 59366,
75187, 77079, 78595, 79863,
78617, 77353, 77083, 77749,
84547, 84859, 83891, 84191,
77499, 77543, 78157, 77603,
78485, 79063, 77877, 78005,
84101, 82955, 79691, 75329,
31144, 31444, 31568, 31516,
90843, 92235, 93021, 94103,
58866, 56608, 54794, 52822,
60562, 61994, 63186, 62730,
86637, 86925, 86979, 86471,
54204, 50574, 46280, 40450,
50884, 56250, 62502, 69041,
92387, 88547, 84121, 80033,
51088, 52058, 53680, 54702,
60132, 61090, 62158, 63960,
81217, 81019, 81823, 81541,
79089, 78931, 79669, 79339,
82645, 83481, 81637, 81835,
78927, 78749, 79501, 79079,
78179, 77983, 78337, 78781,
72931, 71633, 68143, 62988,
33004, 35786, 38080, 41290,
94727, 95265, 94627, 93037,
50836, 49546, 48818, 48194,
63698, 63792, 63706, 64012,
87677, 87465, 88193, 87125,
35094, 32010, 31564, 31382,
75641, 81677, 86915, 91175,
76103, 71903, 67707, 63772,
55692, 57484, 59126, 58540,
66181, 66213, 66599, 66797,
82643, 82107, 83539, 82789,
80617, 80131, 81359, 81495,
80679, 81427, 80591, 79747,
80281, 79949, 80765, 80537,
79713, 80895, 82359, 83479,
59044, 55204, 48450, 40856,
45998, 51800, 58896, 66445,
90139, 86755, 82969, 78873,
48876, 50012, 51356, 53096,
65565, 66991, 67441, 68007
};
double ab[len];
unsigned char c1[len/2];
int i;
for (i=0;i<len;i++)
{
a[i]=a[i]*255/100000;
}
function1(c1,16,16,3,4,a);
for (i=0;i<len/2;i++)
{
printf("%d \n",c1[i]);
}
function2(c1,ab);
for (i=0;i<len;i++)
{
printf("%f \n",ab[i]*100000/255);
}
getchar();
}
void function1( unsigned char ch[], int nn0, int nn1, unsigned int ns, double bpp, double image[])
{
double wmax;
unsigned long int imagelength;
int linelength;
unsigned int n1, row, col, i, j, k, l,m, nn[2], lnn[2], width, length;
unsigned int lis[len/4+1], lip[len+1], lsp[len+1], last_lsp_adds[len+1], count, stlength, count1;
unsigned int count2, threshold, count3, row1;
unsigned int O[2], clus_siz;
unsigned char type[len/4+1], pointer, sn,byt, checked[len/4+1];
imagelength = nn0 * nn1;
linelength = nn0;
nn[0]=nn0;
nn[1]=nn1;
// wdecom(image, nn, 2, 1, ns);
wmax = -1;
for (i = 0; i < imagelength; i++)
{
wmax = ( fabs(image[i]) > wmax ? fabs(image[i]) : wmax);
}
n1 = (int)(log(wmax) / log(2));
stlength = (int)(bpp * (double)imagelength);
ch[0]=n1;
m=1;
imagelength = (unsigned long)1;
imagelength = nn0 * nn1;
lsp[0] = 0;
lip[0] = (unsigned int)imagelength;
lnn[0] = (unsigned int)nn0;
lnn[1] = (unsigned int)nn1;
for (i = 0; i < ns; i++)
{
lip[0] /= 4;
lnn[0] /= 2;
lnn[1] /= 2;
}
lis[0] = 3 * lip[0] / 4;
count = 1;
for (i = 0; i < lnn[0]; i+= 2)
{
for (j = 0; j < lnn[1]; j+= 2)
{
for ( k = 0; k < 4; k++, count++)
{
lip[count] = (j + (k % 2)) * linelength + (i + ( k > 1));
}
}
}
count = 1;
for (i = 0; i < lnn[0]; i += 2)
{
for (j = 0; j < lnn[1]; j += 2)
{
for (k = 0; k < 3; k++, count++)
{
type[count] = 'a';
lis[count] = (j + (k + 1) % 2) * linelength + (i + ( k > 0));
}
}
}
pointer = 8;
byt = 0;
threshold = 1;
for ( i = 0; i < (n1 + 1); i++)
threshold <<= 1;
count1 = 8;
while ( count1 < stlength)
{
i--;
threshold >>= 1;
last_lsp_adds[0] = 0;
row = (int)nn0;
col = (int)nn1;
count = 1;
count3 = 1;
while ((count <= lip[0]) && (fabs(image[lip[count]]) < (double)threshold))
{
count++;
byt <<= 1;
pointer--;
count1++;
if (!pointer)
{
ch[m]=byt;
m++;
byt = 0;
pointer = 8;
}
if (count1 == stlength)
break;
}
if (count1 == stlength)
break;
for ( count2 = count; count <= lip[0]; )
{
while ((count <= lip[0]) && (fabs(image[lip[count]]) >= (double)threshold))
{
last_lsp_adds[count3] = lip[count];
count++;
count3++;
byt = (byt << 1) + 1;
pointer--;
count1++;
if (!pointer)
{
ch[m]=byt;
m++;
byt = 0;
pointer = 8;
}
if (count1 == stlength)
break;
sn = (image[lip[count - 1]] < 0);
byt = (byt << 1) + sn;
pointer--;
count1++;
if (!pointer)
{
ch[m]=byt;
m++;
byt = 0;
pointer = 8;
}
if (count1 == stlength)
break;
}
if (count1 == stlength)
break;
while ((count <= lip[0]) && (fabs(image[lip[count]]) < (double)threshold))
{
lip[count2] = lip[count];
count++;
count2++;
byt <<= 1;
pointer--;
count1++;
if (!pointer)
{
ch[m]=byt;
m++;
byt = 0;
pointer = 8;
}
if (count1 == stlength)
break;
}
if (count1 == stlength)
break;
}
if (count1 == stlength)
break;
lip[0] = count2 - 1;
last_lsp_adds[0] = count3 - 1;
row1 = lis[0];
for (j = 1; j <= row1; j++)
checked[j] = 0;
j = 1;
while ( j <= row1)
{
if (checked[j] == 0)
{
checked[j] = 1;
width = lis[j] % row;
length = lis[j] / row;
if ((width >= lnn[0]) || (length >= lnn[1]))
{
width <<= 1;
length <<= 1;
}
else if (!(width % 2))
length += lnn[1] -1;
else if (!(length % 2))
width += lnn[0] -1;
else
{
length += lnn[1] -1;
width += lnn[0] -1;
}
O[0] = width;
O[1] = length;
//2.2.1 type A
if (type[j] == 'a')
{
clus_siz=2;
sn = 0;
while((width < row) && (length < col))
{
for ( k = 0; k < clus_siz; k++)
{
for (l =0; l < clus_siz; l++)
{
if (fabs(image[width + k + (length + l) * row]) >= (double)threshold)
{
sn = 1;
break;
}
}
if (sn)
break;
}
if (sn)
break;
else
{
clus_siz <<= 1;
width <<= 1;
length <<= 1;
}
}
byt = (byt << 1) + sn;
pointer--;
count1++;
if (!pointer)
{
ch[m]=byt;
m++;
byt = 0;
pointer = 8;
}
if (count1 == stlength)
break;
if (!sn)
j++;
else
{
for (k = 0; k < 2; k++)
{
for (l = 0; l < 2; l++)
{
sn = (fabs(image[O[0] + k + (O[1] +l) * row]) >= threshold);//sn(i,j)
byt = (byt << 1) + sn;
pointer--;
count1++;
if (!pointer)
{
ch[m]=byt;
m++;
byt = 0;
pointer = 8;
}
if (count1 == stlength)
break;
if (sn)
{
last_lsp_adds[count3++] = O[0] + k + (O[1] + l) * row;
last_lsp_adds[0]++;
sn = (image[last_lsp_adds[count3 - 1]] < 0);
byt = (byt << 1) + sn;
pointer--;
count1++;
if (!pointer)
{
ch[m]=byt;
m++;
byt = 0;
pointer = 8;
}
if (count1 == stlength)
break;
}
else
{
lip[count2++] = O[0] + k + (O[1] + l) * row;
lip[0]++;
}
}
if (count1 == stlength)
break;
}
if (count1 == stlength)
break;
if (((O[0] << 1) < row) && ((O[1] << 1) < col))//if L(i,j)!= {},
{
l = lis[j];
for (k = j + 1; k <= row1; k++)
{
lis[k - 1] = lis[k];
type[k - 1] = type[k];
checked[k - 1] = checked[k];
}
lis[row1] = l;
type[row1]= 'b';
checked[row1] = 1;
length = (O[1] << 1);
width= (O[0] << 1);
clus_siz=4;
sn = 0;
while((width < row) && (length < col))
{
for ( k = 0; k < clus_siz; k++)
{
for (l =0; l < clus_siz; l++)
if (fabs(image[width + k + (length + l) * row]) >= (double)threshold)
{
sn = 1;
break;
}
if (sn)
break;
}
if (sn)
break;
else
{
clus_siz <<= 1;
width <<= 1;
length <<= 1;
}
}
byt = (byt << 1) + sn;
pointer--;
count1++;
if (!pointer)
{
ch[m]=byt;
m++;
byt = 0;
pointer = 8;
}
if (count1 == stlength)
break;
if (sn)
{
count = row1;
for (k = 0; k < 2; k++)
for (l = 0; l < 2; l++, count++)
{
lis[count] = O[0] + k + (O[1] + l) * row ;
type[count] = 'a';
checked[count] = 0;
}
row1 += 3;
lis[0] = row1;
}
}
else
{
for (k = j + 1; k <= row1; k++)
{
lis[k - 1] = lis[k];
type[k - 1] = type[k];
checked[k - 1] = checked[k];
}
row1--;
lis[0]--;
}
}
if (count1 == stlength)
break;
}
else
{
length = (O[1] << 1);
width = (O[0] << 1);
clus_siz=4;
sn = 0;
while((width < row) && (length < col))
{
for ( k = 0; k < clus_siz; k++)
{
for (l =0; l < clus_siz; l++)
if (fabs(image[width + k + (length + l) * row]) >= (double)threshold)
{
sn = 1;
break;
}
if (sn)
break;
}
if (sn)
break;
else
{
clus_siz <<= 1;
width <<= 1;
length <<= 1;
}
}
byt = (byt << 1) + sn;
pointer--;
count1++;
if (!pointer)
{
ch[m]=byt;
m++;
byt = 0;
pointer = 8;
}
if (count1 == stlength)
break;
if (sn)
{
for (k = j + 1; k <= row1; k++)
{
lis[k - 1] = lis[k];
type[k - 1] = type[k];
checked[k - 1] = checked[k];
}
count = row1;
for (k = 0; k < 2; k++)
for (l = 0; l < 2; l++, count++)
{
lis[count] = O[0] + k + (O[1] + l) * row ;
type[count] = 'a';
checked[count] = 0;
}
row1 += 3;
lis[0] = row1;
}
else
j++;
}
}
else
j++;
if (count1 == stlength)
break;
}
if (count1 == stlength)
break;
row1 = lsp[0];
for (j = 1; j <= row1; j++)
{
sn = ((((unsigned int)fabs(image[lsp[j]])) >> i) & (unsigned int)1);
byt = (byt << 1) + sn;
pointer--;
count1++;
if (!pointer)
{
ch[m]=byt;
m++;
byt = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -