?? wavelettrans.cpp
字號:
//頻帶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;
}
}
}
void CWaveletTrans::DWT_Two(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;
}
}
void CWaveletTrans::DWT_Three(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;
}
}
void CWaveletTrans::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 + -