![]() |
#2
zy19852009-11-24 15:01
]一个图像一次小波变换程序
void CBDBN::once(int n) { int i,j; LONG wide,height,nWide,nHeight; LPBYTE temp1, temp2, m_pData2; PostIndex=PostDib->GetIndex(); for(int k=1;k<=n;k++) { wide=PostDib->Width(); height=PostDib->Height(); PostIndex=PostDib->GetIndex(); m_pData2=*PostDib->GetIndex(); //分配临时数据空间 temp1 = new BYTE[height*wide]; temp2 = new BYTE[height*wide]; nWide=wide/pow(2,k); nHeight=height/pow(2,k); //完成行变换 for(j = height*(1-1/pow(2,(k-1))); j < height; j ++) { for(i = 0; i < nWide; i ++) { int w = i *2; temp1[j*wide+i] = PostIndex[j][w]; //偶 temp1[j*wide+nWide+i] = PostIndex[j][w+1]; //奇 } } //通过图像的差分,完成小波变换 for(j= height*(1-1/pow(2,(k-1))); j<height; j++) { for(i=0; i<nWide-1; i++) { temp1[j*wide+nWide-1+i] =temp1[j*wide+nWide-1+i] - temp1[j*wide+i]+128; } } //完成列变换 for(i = 0; i < wide/pow(2,k-1); i ++) { for(j = height*(1-1/pow(2,(k-1))); j < height*(1-1/pow(2,(k-1)))+nHeight; j ++) { int m, h; m=height*(1-1/pow(2,(k-1))); h= (j-m)*2 ; temp2[j*wide+i] = temp1[(m+h)*wide+i]; //even temp2[(nHeight + j)*wide+i] = temp1[(m+h+1)*wide+i]; //odd } } //通过图像的差分,完成小波变换 for(i=0; i<wide/pow(2,k-1); i++) { for(j = height*(1-1/pow(2,(k-1))); j < height*(1-1/pow(2,(k-1)))+nHeight; j ++) { temp2[ j*wide+i] = temp2[j*wide+i]-temp2[(nHeight + j)*wide+i]+128; } } //小波经过处理后,放入显示缓存中 for(j = height*(1-1/pow(2,(k-1))); j < height; j ++) { for(i=0; i<wide/pow(2,k-1); i++) { PostIndex[j] = temp2[j*wide+i]; } } //删除临时的数据空间 delete temp1; delete temp2; } } |
