📄 wvlttrans.cpp
字号:
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;
}
}
}
/********************************************************************************
*函数描述: DWT_TwoLayers完成两次图像的小波变换 *
*函数参数: short **spOriginData:二维指针,指向原始的图像数据 *
* short **spTransData0:小波变换系数,存放一次水平变换后的小波系数 *
* short **spTransData1:小波变换系数,存放一次数值变换后的小波系数 *
* int nHeight :图像属性参数,数值为原始图像的高度值 *
* int nHeight_H :图像属性参数,数值为原始图像高度值的一半 *
* int nWidth :图像属性参数,数值为原始图像的宽度值 *
* int nWidth_H :图像属性参数,数值为原始图像宽度值的一半 *
* int layer :小波变换的层数,数值为2层 *
* float fRadius :小波变换因子,在调用时候已指定数值为1.414 *
********************************************************************************/
void CWvltTrans::DWT_TwoLayers(short** spOriginData, short** spTransData0, short** spTransData1, int nHeight, int nHeight_H, int nWidth, int nWidth_H, int layer, float fRadius)
{
int i;
short **pData, **pTran0, **pTran1;
//图像的属性参数
int iWidth, iHeight, iWidth_H, iHeight_H;
float fr = fRadius;
//获得数据空间的指针
pData = spOriginData;
pTran0 = spTransData0;
pTran1 = spTransData1;
//图像属性参数赋值
iWidth = nWidth; iWidth_H = nWidth_H;
iHeight = nHeight; iHeight_H = nHeight_H;
//利用循环完成两次小波变换
for(i=1; i<=layer; i++)
{
DWT_Once(pData,pTran0,pTran1,iHeight,iHeight_H,iWidth,iWidth_H,i,fr);
iHeight=iHeight>>1; iWidth=iWidth>>1;
iHeight_H=iHeight/2; iWidth_H=iWidth/2;
}
}
/********************************************************************************
*函数描述: DWT_TriLayers完成三次图像的小波变换 *
*函数参数: short **spOriginData:二维指针,指向原始的图像数据 *
* short **spTransData0:小波变换系数,存放一次水平变换后的小波系数 *
* short **spTransData1:小波变换系数,存放一次数值变换后的小波系数 *
* int nHeight :图像属性参数,数值为原始图像的高度值 *
* int nHeight_H :图像属性参数,数值为原始图像高度值的一半 *
* int nWidth :图像属性参数,数值为原始图像的宽度值 *
* int nWidth_H :图像属性参数,数值为原始图像宽度值的一半 *
* int layer :小波变换的层数,数值为3层 *
* float fRadius :小波变换因子,在调用时候已指定数值为1.414 *
********************************************************************************/
void CWvltTrans::DWT_TriLayers(short** spOriginData, short** spTransData0, short** spTransData1, int nHeight, int nHeight_H, int nWidth, int nWidth_H, int layer, float fRadius)
{
int i;
short **pData, **pTran0, **pTran1;
//图像的属性参数
int iWidth, iHeight, iWidth_H, iHeight_H;
float fr = fRadius;
//获得数据空间的指针
pData = spOriginData;
pTran0 = spTransData0;
pTran1 = spTransData1;
//图像属性参数赋值
iWidth = nWidth; iWidth_H = nWidth_H;
iHeight = nHeight; iHeight_H = nHeight_H;
//利用循环完成两次小波变换
for(i=1; i<=layer; i++)
{
DWT_Once(pData,pTran0,pTran1,iHeight,iHeight_H,iWidth,iWidth_H,i,fr);
iHeight=iHeight>>1; iWidth=iWidth>>1;
iHeight_H=iHeight/2; iWidth_H=iWidth/2;
}
}
/********************************************************************************
*函数描述: DWTi_Once完成一次图像小波变换的逆变换 *
*函数参数: short **spData :二维指针,其数据空间存放小波逆变换后的图像数据*
* short **spTransData0:小波变换系数,存放一次水平变换后的小波系数 *
* short **spTransData1:小波变换系数,存放一次数值变换后的小波系数 *
* int nHeight :图像属性参数,数值为原始图像的高度值 *
* int nHeight_H :图像属性参数,数值为原始图像高度值的一半 *
* int nWidth :图像属性参数,数值为原始图像的宽度值 *
* int nWidth_H :图像属性参数,数值为原始图像宽度值的一半 *
* int layer :小波变换的层数,数值为3层 *
* float fRadius :小波变换因子,在调用时候已指定数值为1.414 *
********************************************************************************/
void CWvltTrans::DWTi_Once(short **spData, short **spTransData0, short **spTransData1, int nHeight, int nHeight_H, int nWidth, int nWidth_H, int layer, float fRadius)
{
int Trans_W, //图像扫描线控制:横坐标
Trans_H, //图像扫描线控制:纵坐标
Trans_M, //图像矩阵的横坐标
Trans_N; //图像矩阵的纵坐标
short WvltCoeff0; //小波变换系数
signed short WvltCoeff1;
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;
}
}
//逆变换是一个逆过程,所以现从竖直方向开始
//竖直方向的逆变换(此时自然奇偶有序排列),Trans_N为图像矩阵的纵坐标
for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
{
//偶数坐标的小波系数逆变换时的边界处理
WvltCoeff0 = ((spTransData1[nHeight_H][Trans_N]+spTransData1[nHeight_H+1][Trans_N])>>2);
spTransData1[0][Trans_N] = spTransData1[0][Trans_N]-WvltCoeff0;
WvltCoeff0 = ((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]-WvltCoeff0;
//竖直方向逆变换的第二次偶数坐标小波系数的逆变换
for(Trans_M=1; Trans_M<nHeight_H; Trans_M++)
{
WvltCoeff0 = ((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]-WvltCoeff0;
WvltCoeff0 = ((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]-WvltCoeff0;
}
//第二次奇数坐标小波系数的逆变换
for(Trans_M=0; Trans_M<nHeight_H-1; Trans_M++)
{
WvltCoeff1 = ((spTransData1[Trans_M][Trans_N]+spTransData1[Trans_M+1][Trans_N])>>1);
WvltCoeff1=~WvltCoeff1+1;
spTransData1[nHeight_H+Trans_M][Trans_N] = spTransData1[nHeight_H+Trans_M][Trans_N]-WvltCoeff1;
WvltCoeff1 = ((spTransData1[Trans_M][nWidth_H+Trans_N]+spTransData1[Trans_M+1][nWidth_H+Trans_N])>>1);
WvltCoeff1=~WvltCoeff1+1;
spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N] = spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N]-WvltCoeff1;
}
//奇数坐标小波系数逆变换时的边界处理
WvltCoeff1 = ((spTransData1[nHeight_H-1][Trans_N]+spTransData1[nHeight_H-2][Trans_N])>>1);
WvltCoeff1=~WvltCoeff1+1;
spTransData1[nHeight-1][Trans_N] = spTransData1[nHeight-1][Trans_N]-WvltCoeff1;
WvltCoeff1 = ((spTransData1[nHeight_H-1][nWidth_H+Trans_N]+spTransData1[nHeight_H-2][nWidth_H+Trans_N])>>1);
WvltCoeff1=~WvltCoeff1+1;
spTransData1[nHeight-1][nWidth_H+Trans_N] = spTransData1[nHeight-1][nWidth_H+Trans_N]-WvltCoeff1;
//本模块完成变换系数的赋值采样的逆操作
for(Trans_M=0; Trans_M<nHeight_H; Trans_M++)
{
Trans_H =Trans_M<<1;
spTransData0[Trans_H][Trans_N] = spTransData1[Trans_M][Trans_N];
spTransData0[Trans_H+1][Trans_N] = spTransData1[nHeight_H+Trans_M][Trans_N];
spTransData0[Trans_H][nWidth_H+Trans_N] = spTransData1[Trans_M][nWidth_H+Trans_N];
spTransData0[Trans_H+1][nWidth_H+Trans_N]= spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N];
}
}
//去除小波变换中频带系数的滤波影像
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;
}
}
//下面进行水平方向的逆变换
//水平方向的逆变换
for(Trans_H=0; Trans_H<nHeight; Trans_H++)
{
//偶数坐标小波系数逆变换时的边界处理
WvltCoeff0 = ((spTransData0[Trans_H][nWidth_H]+spTransData0[Trans_H][nWidth_H+1])>>2);
spTransData0[Trans_H][0] = spTransData0[Trans_H][0]-WvltCoeff0;
//第二次偶数坐标小波系数的逆变换
for(Trans_N=1; Trans_N<nWidth_H; Trans_N++)
{
WvltCoeff0 = ((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]-WvltCoeff0;
}
//第二次奇数坐标小波系数的逆变换
for(Trans_N=0; Trans_N<nWidth_H-1; Trans_N++)
{
WvltCoeff1 = ((spTransData0[Trans_H][Trans_N]+spTransData0[Trans_H][Trans_N+1])>>1);
WvltCoeff1=~WvltCoeff1+1;
spTransData0[Trans_H][nWidth_H+Trans_N] = spTransData0[Trans_H][nWidth_H+Trans_N]-WvltCoeff1;
}
//奇数坐标小波系数逆变换时的边界处理
WvltCoeff1 = ((spTransData0[Trans_H][nWidth_H-1]+spTransData0[Trans_H][nWidth_H-2])>>1);
WvltCoeff1=~WvltCoeff1+1;
spTransData0[Trans_H][nWidth-1] = spTransData0[Trans_H][nWidth-1]-WvltCoeff1;
if(layer > 1)
{
for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
{
Trans_W =Trans_N<<1;
spTransData1[Trans_H][Trans_W] = spTransData0[Trans_H][Trans_N];
spTransData1[Trans_H][Trans_W+1] = spTransData0[Trans_H][nWidth_H+Trans_N];
}
}
if(layer == 1)
{
for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
{
Trans_W =Trans_N<<1;
if(fRadius!=2)
{
spTransData0[Trans_H][Trans_N]=spTransData0[Trans_H][Trans_N]+128;
spTransData0[Trans_H][nWidth_H+Trans_N]=spTransData0[Trans_H][nWidth_H+Trans_N]+128;
}
if(spTransData0[Trans_H][Trans_N]>255) spTransData0[Trans_H][Trans_N]=255;
if(spTransData0[Trans_H][Trans_N]<0) spTransData0[Trans_H][Trans_N]=0;
if(spTransData0[Trans_H][nWidth_H+Trans_N]>255) spTransData0[Trans_H][nWidth_H+Trans_N]=255;
if(spTransData0[Trans_H][nWidth_H+Trans_N]<0) spTransData0[Trans_H][nWidth_H+Trans_N]=0;
// spData[Trans_H][Trans_W] = (unsigned char)spTransData0[Trans_H][Trans_N];
spData[Trans_H][Trans_W] = spTransData0[Trans_H][Trans_N];
// spData[Trans_H][Trans_W+1] = (unsigned char)spTransData0[Trans_H][nWidth_H+Trans_N];
spData[Trans_H][Trans_W+1] =spTransData0[Trans_H][nWidth_H+Trans_N];
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -