?? wavelettrans.cpp
字號:
// WaveletTrans.cpp: implementation of the CWaveletTrans class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "wavelet.h"
#include "WaveletTrans.h"
#include"WaveletNibianhua.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CWaveletTrans::CWaveletTrans()
{
}
CWaveletTrans::~CWaveletTrans()
{
}
void CWaveletTrans::Hori_Transform(short** spOriginData, short** spTransData0, int nHeight, int nWidth_H, float fRadius)
{
int Trans_W, //圖像掃描線控制:橫坐標
Trans_H, //圖像掃描線控制:縱坐標
Trans_M, //圖像矩陣的橫坐標
Trans_N; //圖像矩陣的縱坐標
int iWidth = nWidth_H * 2; //原始圖像的寬度值
short Trans_Coeff0; //小波變換系數
signed short Trans_Coeff1;
//本模塊完成變換系數的賦值采樣
for(Trans_H = 0; Trans_H < nHeight; Trans_H ++)
{
for(Trans_N = 0; Trans_N < nWidth_H; Trans_N ++)
{
Trans_W = Trans_N << 1;
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); //even
spTransData0[Trans_H][nWidth_H+Trans_N] = (spOriginData[Trans_H][Trans_W+1]-128); //odd
}
}
}
//通過圖像的差分,完成小波變換
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][iWidth-1] = spTransData0[Trans_H][iWidth-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;
}
}
}
void CWaveletTrans::Vert_Transform(short** spOriginData, short** spTransData1, int nHeight_H, int nWidth, float fRadius)
{
int Trans_W, //圖像掃描線控制:橫坐標
Trans_H, //圖像掃描線控制:縱坐標
Trans_M, //圖像矩陣的橫坐標
Trans_N; //圖像矩陣的縱坐標
int iHeight = nHeight_H * 2;//原始圖像的寬度值
short Trans_Coeff0; //小波變換系數
signed short Trans_Coeff1;
//本模塊完成變換系數的賦值采樣
for(Trans_W = 0; Trans_W < nWidth; Trans_W ++)
{
for(Trans_M = 0; Trans_M < nHeight_H; Trans_M ++)
{
Trans_H = Trans_M << 1;
if (fRadius == 2)
{
spTransData1[Trans_M][Trans_W] = (spOriginData[Trans_H][Trans_W]);
spTransData1[nHeight_H + Trans_M][Trans_W] = (spOriginData[Trans_H+1][Trans_W]);
}
else
{
spTransData1[Trans_M][Trans_W] = (spOriginData[Trans_H][Trans_W]-128); //even
spTransData1[nHeight_H + Trans_M][Trans_W] = (spOriginData[Trans_H+1][Trans_W]-128); //odd
}
}
}
//通過圖像的差分,完成小波變換
for(Trans_W=0; Trans_W<nWidth; Trans_W++)
{
for(Trans_M=0; Trans_M<nHeight_H-1; Trans_M++)
{
//奇偶數值和的一半
Trans_Coeff1 = ((spTransData1[Trans_M][Trans_W]+spTransData1[Trans_M+1][Trans_W])>>1);
//邏輯非操作后數值加1
Trans_Coeff1=~Trans_Coeff1+1;
//系數預測
spTransData1[nHeight_H + Trans_M][Trans_W] = spTransData1[nHeight_H + Trans_M][Trans_W]+Trans_Coeff1;
}
//完成一個偶系數的邊界處理
Trans_Coeff1 = ((spTransData1[nHeight_H-1][Trans_W]+spTransData1[nHeight_H-2][Trans_W])>>1);
Trans_Coeff1=~Trans_Coeff1+1;
spTransData1[iHeight-1][Trans_W] = spTransData1[iHeight-1][Trans_W]+Trans_Coeff1;
//完成一個奇系數的邊界處理
Trans_Coeff0 = ((spTransData1[nHeight_H][Trans_W]+spTransData1[nHeight_H+1][Trans_W])>>2);
spTransData1[0][Trans_W] = spTransData1[0][Trans_W]+Trans_Coeff0;
//提升,整數到整數的變換
for(Trans_M=1; Trans_M<nHeight_H; Trans_M++)
{
Trans_Coeff0 = ((spTransData1[nHeight_H + Trans_M][Trans_W]+spTransData1[nHeight_H + Trans_M -1][Trans_W])>>2);
spTransData1[Trans_M][Trans_W] = spTransData1[Trans_M][Trans_W]+Trans_Coeff0;
}
}
}
void CWaveletTrans::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, //圖像掃描線控制:橫坐標
Trans_H, //圖像掃描線控制:縱坐標
Trans_M, //圖像矩陣的橫坐標
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;
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];
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -