整理日:2015/4/6
源码来源: Visual C++小波变换技术与工程实践code
void CWvltTrans::DWT_Once ( short** spOriginData, short** spTransData0, short** spTransData1, int nHeight, int nHeight_H, int nWidth, int nWidth_H, int layer, float fRadius) { int Trans_W, // 图像扫描线控制:横坐标 int Trans_H, // 图像扫描线控制:纵坐标 int Trans_M, // 图像矩阵的横坐标 int Trans_N; // 图像矩阵的纵坐标 short Trans_Coeff0; // 小波变换系数 signed short Trans_Coeff1; fRadius=1.414; // 变换滤波系数 // 本模块完成变换系数的赋值采样 // 行变换,第一次(layer=1时)时nHeight即为原始图像的高度值 for(Trans_H=0; Trans_H<nHeight; Trans_H++) // 行坐标 { if(layer == 1) { // layer=1时,nWidth_H为原始图像宽度值的一半 for(Trans_N=0; Trans_N<nWidth_H; Trans_N++) { Trans_W=Trans_N<<1;// Trans_W=Trans_N*2; // 行采样 if (fRadius==2) { spTransData0[Trans_H][Trans_N] = (spOriginData[Trans_H][Trans_W]); spTransData0[Trans_H][nWidth_H+Trans_N] = (spOriginData[Trans_H][Trans_W+1]); } else { spTransData0[Trans_H][Trans_N] = (spOriginData[Trans_H][Trans_W]-128); spTransData0[Trans_H][nWidth_H+Trans_N] = (spOriginData[Trans_H][Trans_W+1]-128); } } } // 若变换层数大于1,则仅采样低频的小波系数 if(layer > 1){ for(Trans_N=0; Trans_N<nWidth_H; Trans_N++) { Trans_W=Trans_N<<1; spTransData0[Trans_H][Trans_N] = spTransData1[Trans_H][Trans_W]; spTransData0[Trans_H][nWidth_H+Trans_N] = spTransData1[Trans_H][Trans_W+1]; } } } for(Trans_H=0; Trans_H<nHeight; Trans_H++) { for(Trans_N=0; Trans_N<nWidth_H-1; Trans_N++) { // 奇偶数值和的一半 Trans_Coeff1 = ((spTransData0[Trans_H][Trans_N]+spTransData0[Trans_H][Trans_N+1])>>1); // 逻辑非操做后数值加1 Trans_Coeff1=~Trans_Coeff1+1; // 系数预测 spTransData0[Trans_H][nWidth_H+Trans_N] = spTransData0[Trans_H][nWidth_H+Trans_N]+Trans_Coeff1; } // 完成一个偶系数的边界处理 Trans_Coeff1 = ((spTransData0[Trans_H][nWidth_H-1]+spTransData0[Trans_H][nWidth_H-2])>>1); Trans_Coeff1=~Trans_Coeff1+1; spTransData0[Trans_H][nWidth-1] = spTransData0[Trans_H][nWidth-1]+Trans_Coeff1; // 完成一个奇系数的边界处理 Trans_Coeff0 = ((spTransData0[Trans_H][nWidth_H]+spTransData0[Trans_H][nWidth_H+1])>>2); spTransData0[Trans_H][0] = spTransData0[Trans_H][0]+Trans_Coeff0; // 提高,整数到整数的变换 for(Trans_N=1; Trans_N<nWidth_H; Trans_N++) { Trans_Coeff0 = ((spTransData0[Trans_H][nWidth_H+Trans_N]+spTransData0[Trans_H][nWidth_H+Trans_N-1])>>2); spTransData0[Trans_H][Trans_N] = spTransData0[Trans_H][Trans_N]+Trans_Coeff0; } } // 水平方向的变换结束 // 竖直方向的变换开始,数据源为水平变换后的小波系数 for(Trans_M=0; Trans_M<nHeight; Trans_M++) { for(Trans_N=0; Trans_N<nWidth_H; Trans_N++) { spTransData0[Trans_M][Trans_N]*=fRadius; spTransData0[Trans_M][Trans_N+nWidth_H]/=fRadius; } } // 行提高后的数据在spTransData0中,spTransData0中的数据天然奇偶有序 for(Trans_N=0; Trans_N<nWidth_H; Trans_N++) { // 列变换 for(Trans_M=0; Trans_M<nHeight_H; Trans_M++) { Trans_H =Trans_M<<1; // 频带LL部分 spTransData1[Trans_M][Trans_N] = spTransData0[Trans_H][Trans_N]; // 频带HL部分 spTransData1[nHeight_H+Trans_M][Trans_N] = spTransData0[Trans_H+1][Trans_N]; // 频带LH部分 spTransData1[Trans_M][nWidth_H+Trans_N] = spTransData0[Trans_H][nWidth_H+Trans_N]; // 频带HH部分 spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N] = spTransData0[Trans_H+1][nWidth_H+Trans_N]; } // 第一次提高奇数坐标系数 for(Trans_M=0; Trans_M<nHeight_H-1; Trans_M++) { // 竖直方向的变换 Trans_Coeff1 = ((spTransData1[Trans_M][Trans_N]+spTransData1[Trans_M+1][Trans_N])>>1); Trans_Coeff1=~Trans_Coeff1+1; spTransData1[nHeight_H+Trans_M][Trans_N] = spTransData1[nHeight_H+Trans_M][Trans_N]+Trans_Coeff1; Trans_Coeff1 = ((spTransData1[Trans_M][nWidth_H+Trans_N]+spTransData1[Trans_M+1][nWidth_H+Trans_N])>>1); Trans_Coeff1=~Trans_Coeff1+1; spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N] = spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N]+Trans_Coeff1; } Trans_Coeff1 = ((spTransData1[nHeight_H-1][Trans_N]+spTransData1[nHeight_H-2][Trans_N])>>1); Trans_Coeff1=~Trans_Coeff1+1; spTransData1[nHeight-1][Trans_N] = spTransData1[nHeight-1][Trans_N]+Trans_Coeff1; Trans_Coeff1 = ((spTransData1[nHeight_H-1][nWidth_H+Trans_N]+spTransData1[nHeight_H-2][nWidth_H+Trans_N])>>1); Trans_Coeff1=~Trans_Coeff1+1; // 边界处理 spTransData1[nHeight-1][nWidth_H+Trans_N] = spTransData1[nHeight-1][nWidth_H+Trans_N]+Trans_Coeff1; Trans_Coeff0 = ((spTransData1[nHeight_H][Trans_N]+spTransData1[nHeight_H+1][Trans_N])>>2); spTransData1[0][Trans_N] = spTransData1[0][Trans_N]+Trans_Coeff0; Trans_Coeff0 = ((spTransData1[nHeight_H][nWidth_H+Trans_N]+spTransData1[nHeight_H+1][nWidth_H+Trans_N])>>2); // 边界处理 spTransData1[0][nWidth_H+Trans_N] = spTransData1[0][nWidth_H+Trans_N]+Trans_Coeff0; // 第一次提高偶数坐标系数 for(Trans_M=1; Trans_M<nHeight_H; Trans_M++) { Trans_Coeff0 = ((spTransData1[nHeight_H+Trans_M][Trans_N]+spTransData1[nHeight_H+Trans_M-1][Trans_N])>>2); spTransData1[Trans_M][Trans_N] = spTransData1[Trans_M][Trans_N]+Trans_Coeff0; Trans_Coeff0 = ((spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N]+spTransData1[nHeight_H+Trans_M-1][nWidth_H+Trans_N])>>2); spTransData1[Trans_M][nWidth_H+Trans_N] = spTransData1[Trans_M][nWidth_H+Trans_N]+Trans_Coeff0; } } // 存放小波系数,LL频带的系数进行幅值加强处理,其它高频频带的系数则削弱其幅值 for(Trans_N=0; Trans_N<nWidth; Trans_N++) { for(Trans_M=0; Trans_M<nHeight_H; Trans_M++) { spTransData1[Trans_M][Trans_N]*=fRadius; spTransData1[Trans_M+nHeight_H][Trans_N]/=fRadius; } } }