首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

小波变折算法看不懂

2012-08-16 
小波变换算法看不懂红色的部分,也就是进行小波变换和反变换的部分,不知道是怎么回事?向高手请教!void CDIm

小波变换算法看不懂
红色的部分,也就是进行小波变换和反变换的部分,不知道是怎么回事?向高手请教!
void CDImageProcessView::OnWl() 
{
CDImageProcessDoc* pDoc = GetDocument();//获取文档
LPSTR lpDIB;//指向源图像的指针
LPSTR lpDIBBits;//指向DIB像素指针
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHObject());//锁定DIB
lpDIBBits = pDoc->m_dib.GetBits(lpDIB);//找到DIB图像像素起始位置
if (pDoc->m_dib.GetColorNum(lpDIB) != 256)//判断是否是256色位图
{
//提示用户
//MessageBox("目前只支持256色位图!", "系统提示" , MB_ICONINFORMATION | MB_OK);
::GlobalUnlock((HGLOBAL) pDoc->GetHObject());//解除锁定
return;//返回
}
int nWidth;//图像宽度
int nHeight;//图像高度
nWidth=(int)pDoc->m_dib.GetWidth(lpDIB);//获取图像宽度
nHeight=(int)pDoc->m_dib.GetHeight(lpDIB);//获取图像高度

DIBDWTStep(lpDIBBits,m_pDbImage, nWidth,nHeight, 0, m_nDWTCurDepth,1);
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL) pDoc->GetHObject());

}
/*************************************************************************
*
* \函数名称:
* DWTStep_2D()
*
* \输入参数:
* double * pDbSrc- 指向源数据的指针
* int nCurWLevel- X方向上当前分解的层数
* int nCurHLevel- Y方向上当前分解的层数
* int nMaxWLevel- X方向上最大可分解的层数
* int nMaxHLevel- Y方向上最大可分解的层数
* int nInv- 是否为DWT,1表示为IDWT,0表示DWT
* int nStep- 当前的计算层数
* int nSupp- 小波基的紧支集的长度
*
* \返回值:
* BOOL- 成功则返回TRUE,否则返回FALSE
*
* \说明:
* 该函数用对存放在pDBSrc中的数据进行一层的二维DWT或者IDWT。
* 计算后数据仍存放在pDbSrc中
*
*************************************************************************
*/
BOOL DWTStep_2D(double* pDbSrc, int nCurWLevel, int nCurHLevel,
int nMaxWLevel, int nMaxHLevel, int nInv, int nStep, int nSupp)
{
// 计算图像的长度和宽度(2次幂对齐)
int W = 1<<nMaxWLevel, H = 1<<nMaxHLevel;

// 计算当前分解的图像的长度和宽度
int CurW = 1<<nCurWLevel, CurH = 1<<nCurHLevel;

// 判断是进行DWT还是IDWT
if (!nInv)
{
int i = 0;
// 对行进行一维DWT
for (i=0; i<CurH; i++)
if (!DWTStep_1D(pDbSrc+(int)i*W*nStep, nCurWLevel, nInv, nStep, nSupp)) return FALSE;
// 对列进行一维DWT
for (i=0; i<CurW; i++)
if (!DWTStep_1D(pDbSrc+i*nStep, nCurHLevel, nInv, W*nStep, nSupp)) return FALSE;
}

// 否则进行IDWT
else
{
// 计算当前变换的图像的长度和宽度
CurW <<= 1;
CurH <<= 1;

int i = 0;
// 对列进行IDWT
for (i=0; i<CurW; i++)
if (!DWTStep_1D(pDbSrc+i*nStep, nCurHLevel, nInv, W*nStep, nSupp)) return FALSE;
// 对行进行IDWT
for (i=0; i<CurH; i++)
if (!DWTStep_1D(pDbSrc+(int)i*W*nStep, nCurWLevel, nInv, nStep, nSupp)) return FALSE;
}

// 返回
return TRUE;
}

/*************************************************************************
*
* \函数名称:
* DWTStep_1D()
*
* \输入参数:
* double * pDbSrc- 指向源数据的指针
* int nCurLevel- 当前分界的层数
* int nInv- 是否为DWT,1表示为IDWT,0表示DWT
* int nStep- 当前的计算层数
* int nSupp- 小波基的紧支集的长度
*
* \返回值:
* BOOL- 成功则返回TRUE,否则返回FALSE
*
* \说明:
* 该函数用对存放在pDBSrc中的数据进行一层的一维DWT或者IDWT。其中,nInv为表示进行
* DWT或者IDWT的标志。nCurLevel为当前需要进行分界的层数。nStep为已经分界的层数
* 计算后数据仍存放在pDbSrc中
*
*************************************************************************
*/
BOOL DWTStep_1D(double* pDbSrc, int nCurLevel,
int nInv, int nStep,int nSupp)
{
double s = sqrt((double)2);
// 获得小波基的指针
double* h = (double*)hCoef[nSupp-1];
// 确认当前层数有效
ASSERT(nCurLevel>=0);

// 计算当前层数的长度
int CurN = 1<<nCurLevel;
if (nInv) CurN <<= 1;

// 确认所选择的小波基和当前层数的长度有效
if (nSupp<1 || nSupp>10 || CurN<2*nSupp) 
return FALSE;

// 分配临时内存用于存放结果
double *ptemp = new double[CurN];


if (!ptemp) return FALSE;

doubles1, s2;
intIndex1, Index2;

// 判断是进行DWT还是IDWT
if (!nInv)
{// DWT
Index1=0;
Index2=2*nSupp-1;

// 进行卷积,其中s1为低频部分,s2为高频部分的结果
for (int i=0; i<CurN/2; i++)
{
s1 = s2 = 0;
double t = -1;
for (int j=0; j<2*nSupp; j++, t=-t)
{
s1 += h[j]*pDbSrc[(Index1 & CurN-1) * nStep];
s2 += t*h[j]*pDbSrc[(Index2 & CurN-1) * nStep];

Index1++;
Index2--;
}

// 将结果存放在临时内存中
ptemp[i] = s1/s;
ptemp[i+CurN/2] = s2/s;

Index1 -= 2*nSupp;
Index2 += 2*nSupp;
Index1 += 2;
Index2 += 2;
}
}

// 否则进行IDWT
else
{// IDWT
Index1 = CurN/2;
Index2 = CurN/2-nSupp+1;

// 进行卷积,其中其中s1为低频部分,s2为高频部分的结果
for (int i=0; i<CurN/2; i++)
{
s1 = s2 = 0;
int Index3 = 0;
for (int j=0; j<nSupp; j++)
{
s1 += h[Index3]*pDbSrc[(Index1 & CurN/2-1) * nStep]
+h[Index3+1]*pDbSrc[((Index2 & CurN/2-1) + CurN/2) * nStep];
s2 += h[Index3+1]*pDbSrc[(Index1 & CurN/2-1) * nStep]
-h[Index3]*pDbSrc[((Index2 & CurN/2-1) + CurN/2) * nStep];

Index3+=2;
Index1--,Index2++;
}

// 将结果存入临时内存
ptemp[2*i] = s1*s;
ptemp[2*i+1] = s2*s;

Index1 += nSupp;
Index2 -= nSupp;
Index1++;
Index2++;
}
}

// 将结果存入源图像中
for (int i=0; i<CurN; i++)
pDbSrc[i*nStep] = ptemp[i];

// 释放临时内存,并返回
delete[] ptemp;
return TRUE;
}



[解决办法]
楼主最好先把小波算法的理论知识看懂了,再来看程序的实现,这样比较容易理解,算法都不懂,不容易理解程序
[解决办法]
我留个记号,学些下,过段时间,我可能得处理声波了。

热点排行