📄 no list spiht.txt
字号:
图像压缩 无链表SPIHT算法,需要较小的内存
//input,输入小波系数矩阵;levels小波分解层数;wide图像宽 high 图像高
NLSPIHT(short *input, unsigned char *outbit, int levels, int wide,int high)
{
int index,i,j,indexlen,d,c,Idc, t;
int skip[16],isskip[16];
indexlen=wide*high;
short *dmax, *gmax, *val,*sign;
unsigned char *mark;
sign=new short[indexlen];
dmax=new short[indexlen/4];
gmax=new short[indexlen/16];
mark=new unsigned char[indexlen*16];
val=new short[indexlen];
//初始化
this->SPIHTheight=high; this->SPIHTwidth=wide;
for (i=0;i<indexlen*16;i++) mark[i]=0;
for (i=0;i<high;i++)
for (j=0;j<wide;j++)
{sign[i*wide+j]=0;}
for (i=0;i<high;i++)
for (j=0;j<wide;j++)
{ index=SPIHTindex(i,j);
val[index]=abs(input[i*wide+j]);
if (input[i*wide+j]<0) sign[index]=1;
else sign[index]=0;
}
/*/////程序调试
CString QFile="c:\\blockcoding.txt";
CString Signfile="c:\\blocksign.txt";
FILE *stream1,*signstream1;
int No=0;
stream1 = fopen( QFile, "w" );
signstream1=fopen( Signfile, "w" );
for (i=0;i<high;i++)
{
fprintf( stream1, "%1s\n", " " );
fprintf(signstream1, "%1s\n", " " );
for (int j=0;j<wide;j++) //width
{ if (sign[No]==0) fprintf( stream1, "%7d", val[No] );
else if(sign[No]==1) fprintf( stream1, "%7d", (-1)*val[No] );
fprintf(signstream1, "%7d", sign[No] );
No=No+1;
}
fprintf( stream1, "%1s\n", " " );
fprintf(signstream1, "%1s\n", " " );
}
fclose( stream1 );
fclose(signstream1);
////////*/
for (i=indexlen/16;i<indexlen/4;i++)
{ dmax[i]=val[4*i]|val[4*i+1]|val[4*i+2]|val[4*i+3];
//if (dmax[i]<2) dmax[i]=0;
//val[4*i]=val[4*i+1]=val[4*i+2]=val[4*i+3]=0;
}
if (indexlen/64>0)
{ for (i=indexlen/64;i<indexlen/16;i++) gmax[i]=dmax[4*i]|dmax[4*i+1]|dmax[4*i+2]|dmax[4*i+3];
for (i=indexlen/64;i<indexlen/16;i++) dmax[i]=val[4*i]|val[4*i+1]|val[4*i+2]|val[4*i+3]|gmax[i];
//if (dmax[i]<2) dmax[i]=0;
// if (gmax[i]<2) gmax[i]=0;
}
if (indexlen/256>0)
{ for (i=indexlen/256;i<indexlen/64;i++) gmax[i]=dmax[4*i]|dmax[4*i+1]|dmax[4*i+2]|dmax[4*i+3];
for (i=indexlen/256;i<indexlen/64;i++) dmax[i]=val[4*i]|val[4*i+1]|val[4*i+2]|val[4*i+3]|gmax[i];
// if (dmax[i]<2) dmax[i]=0;
// if (gmax[i]<2) gmax[i]=0;
}
if (indexlen/1024>0)
{ for (i=indexlen/1024;i<indexlen/256;i++) gmax[i]=dmax[4*i]|dmax[4*i+1]|dmax[4*i+2]|dmax[4*i+3];
for (i=indexlen/1024;i<indexlen/256;i++) dmax[i]=val[4*i]|val[4*i+1]|val[4*i+2]|val[4*i+3]|gmax[i];
// if (dmax[i]<2) dmax[i]=0;
// if (gmax[i]<2) gmax[i]=0;
}
if (indexlen/4096>0)
{ for (i=indexlen/4096;i<indexlen/1024;i++) gmax[i]=dmax[4*i]|dmax[4*i+1]|dmax[4*i+2]|dmax[4*i+3];
for (i=indexlen/4096;i<indexlen/1024;i++) dmax[i]=val[4*i]|val[4*i+1]|val[4*i+2]|val[4*i+3]|gmax[i];
}
if (indexlen/16384>0)
{ for (i=indexlen/16384;i<indexlen/4096;i++) gmax[i]=dmax[4*i]|dmax[4*i+1]|dmax[4*i+2]|dmax[4*i+3];
for (i=indexlen/16384;i<indexlen/4096;i++) dmax[i]=val[4*i]|val[4*i+1]|val[4*i+2]|val[4*i+3]|gmax[i];
}
if (indexlen/65536>0)
{ for (i=indexlen/65536;i<indexlen/16384;i++) gmax[i]=dmax[4*i]|dmax[4*i+1]|dmax[4*i+2]|dmax[4*i+3];
for (i=indexlen/65536;i<indexlen/16384;i++) dmax[i]=val[4*i]|val[4*i+1]|val[4*i+2]|val[4*i+3]|gmax[i];
}
d=wide/int(pow(2,levels));
c=high/int(pow(2,levels));
Idc=d*c;
unsigned char MIP=0,MNP=1,MSP=2,MCP=3,MD=4,MG=5;
unsigned char MN2=8,MN3=9,MN4=10,MN5=11,MN6=12,MN7=13,MN8=14,MN9=15;
for (i=0;i<16;i++) skip[i]=1;
skip[MIP]=1;skip[MNP]=1;skip[MCP]=1;skip[MSP]=1;
skip[MD]=4; skip[MG]=16;
skip[MN2]=16; skip[MN3]=64; skip[MN4]=256;
skip[MN5]=1024;skip[MN6]=4096; skip[MN7]=16384;
for (i=0;i<16;i++) isskip[i]=0;
isskip[MIP]=4; isskip[MNP]=4; isskip[MCP]=4; isskip[MSP]=4;
isskip[MD]=4; isskip[MG]=16;
isskip[MN2]=16; isskip[MN3]=64; isskip[MN4]=256;
isskip[MN5]=1024; isskip[MN6]=4096; isskip[MN7]=16384;
for (i=0;i<Idc;i++) mark[i]=MIP;
for (i=Idc;i<4*Idc;i++)
{mark[i]=MD;
push(mark,i);}
//主算法
int outlocal=0,ql=this->Quan_levels;
int s=int(pow(2,ql));
// 非显著像素通道
while(s>1)
{ s=s/2;
i=0;
while (i<indexlen)
{if (mark[i]==MIP)
{d=val[i] & s;
this->BitWrite(outbit,outlocal,d);
outlocal=outlocal+1;
if (d>0)
{
BitWrite(outbit,outlocal,sign[i]); //输出符号位
outlocal=outlocal+1;
mark[i]=MNP;
}
i=i+1;
}
else i=i+skip[mark[i]];
}
int debugpoint=0;
i=0;
t=0;
while (i<indexlen)
{if( mark[i]==MD)
{d=dmax[i/4] & s;
BitWrite(outbit,outlocal,d); //输出符号位
outlocal=outlocal+1;
if (d>0)
{mark[i]=MCP;
mark[i+1]=MCP;mark[i+2]=MCP;mark[i+3]=MCP;
if ((4*i)<indexlen) mark[4*i]=MG;
}
else i=i+4;
}
else if(mark[i]==MG)
{d=gmax[i/16]&s;
BitWrite(outbit,outlocal,d);
outlocal=outlocal+1;
if (d>0)
{mark[i]=mark[i+4]=MD;
mark[i+8]=mark[i+12]=MD;
if(i<(wide*high/4)){
push(mark,i); push(mark,i+4); push(mark,i+8); push(mark,i+12);
}
}
else i=i+16;
}
else if(mark[i]==MCP)
/*
{ mark[i]=MIP;mark[i+1]=MIP; mark[i+2]=MIP; mark[i+3]=MIP;
int d0=0,d1=0,d2=0,d3=0,offset=0;
d0=val[i]&s;d1=val[i+1]&s;d2=val[i+2]&s;d3=val[i+3]&s;
if ((d0==0)&&(d1==0)&&(d2==0)&&(d3==0)) BitWrite(outbit,outlocal++,0);
else {BitWrite(outbit,outlocal++,1);
for (offset=0; offset<4;offset++)
{d=val[i+offset]&s;
BitWrite(outbit,outlocal++,d);
if (d>0)
{BitWrite(outbit,outlocal++,sign[i+offset]); mark[i+offset]=MNP;}
}
}
i=i+4;
}
//*/
/*
{ mark[i]=MIP;mark[i+1]=MIP; mark[i+2]=MIP; mark[i+3]=MIP;
int d0=0,d1=0,d2=0,d3=0,offset=0;
d0=val[i]&s;d1=val[i+1]&s;d2=val[i+2]&s;d3=val[i+3]&s;
if ((d0==0)&&(d1==0)&&(d2==0)&&(d3==0)) BitWrite(outbit,outlocal++,0);
else {BitWrite(outbit,outlocal++,1);
if (d0==1) offset=0;
if ((d0==0)&&(d1==1)) offset=1;
if ((d0==0)&&(d1==0)&&(d2==1)) offset=2;
if ((d0==0)&&(d1==0)&&(d2==0)&&(d3==1)) offset=3;
if (offset==0) {BitWrite(outbit,outlocal++,0); BitWrite(outbit,outlocal++,0);}
if(offset==1) {BitWrite(outbit,outlocal++,0); BitWrite(outbit,outlocal++,1);}
if(offset==2) {BitWrite(outbit,outlocal++,1); BitWrite(outbit,outlocal++,0);}
if(offset==3) {BitWrite(outbit,outlocal++,1); BitWrite(outbit,outlocal++,1);}
BitWrite(outbit,outlocal++,sign[i+offset]); //写入第一个显著性系数的符号
mark[i+offset]=MNP;
offset++;
while(offset<4)
{ d=val[i+offset]&s;
BitWrite(outbit,outlocal++,d);
if (d>0)
{BitWrite(outbit,outlocal++,sign[i+offset]); mark[i+offset]=MNP;}
offset++;
}
}
i=i+4;
}
//*/
/*
{ mark[i]=MIP;mark[i+1]=MIP; mark[i+2]=MIP; mark[i+3]=MIP;
int d0=0,d1=0,d2=0,d3=0,offset=0;
d0=val[i]&s;d1=val[i+1]&s;d2=val[i+2]&s;d3=val[i+3]&s;
if ((d0==0)&&(d1==0)&&(d2==0)&&(d3==0)) { BitWrite(outbit,outlocal++,0); offset=4;}
if (d0==1) offset=0;
if ((d0==0)&&(d1==1)) offset=1;
if ((d0==0)&&(d1==0)&&(d2==1)) offset=2;
if ((d0==0)&&(d1==0)&&(d2==0)&&(d3==1)) offset=3;
if (offset<4)
{ BitWrite(outbit,outlocal++,1);
//写入第一个显著性系数的位置信息
if (offset==0) {BitWrite(outbit,outlocal++,0); BitWrite(outbit,outlocal++,0);}
if(offset==1) {BitWrite(outbit,outlocal++,0); BitWrite(outbit,outlocal++,1);}
if(offset==2) {BitWrite(outbit,outlocal++,1); BitWrite(outbit,outlocal++,0);}
if(offset==3) {BitWrite(outbit,outlocal++,1); BitWrite(outbit,outlocal++,1);}
BitWrite(outbit,outlocal++,sign[i+offset]); //写入第一个显著性系数
mark[i+offset]=MNP;
offset++;
int sbits;
for( sbits=offset;sbits<4;sbits++)
{
d=val[i+sbits]&s;
BitWrite(outbit,outlocal++,d);
if (d>0)
{BitWrite(outbit,outlocal++,sign[i+offset]);
mark[i+sbits]=MNP;
}
else mark[i+sbits]=MIP;
}
}
i=i+4;
}
//*/
// /*
{
d=val[i]&s;
BitWrite(outbit,outlocal,d);
outlocal=outlocal+1;
if (d>0)
{BitWrite(outbit,outlocal,sign[i]);
outlocal=outlocal+1;
mark[i]=MNP;}
else mark[i]=MIP;
i=i+1;
}
//*/
else
{ t=isskip[mark[i]];
i=i+t;
}
} //while (i<indexlen)
//精细化通道
int ii=0;
while (ii<indexlen)
{ if (mark[ii]==MSP)
{d=val[ii]&s;
BitWrite(outbit,outlocal,d);
d=0;
outlocal=outlocal+1;
ii=ii+1;}
else if (mark[ii]==MNP)
{mark[ii]=MSP;
ii=ii+1;}
else
{ t=skip[mark[ii]];
ii=ii+t;
}
}
// int x=0;
}
delete[] dmax;
delete[] gmax;
delete[] mark;
return outlocal;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -