📄 wavetranform.cpp
字号:
/*************************************************************************
*
* 函数名称:
* DIBDisWavelet()
*
* 参数:
* LPSTR lpDIB - 指向DIB图像指针
* LPSTR lpDIBBits - 指向源DIB象素指针
* double *LF - 使用的小波尺度函数,是常量
* double *HF - 使用的小波母函数,是常量
* int FWidth - 小波窗的宽度
* int nLevel - 小波分解的层数
*
* 返回值:
* BOOL - 成功返回TRUE,否则返回FALSE。
*
* 说明:
* 该函数用来对图像进行小波变换重建。于上面不同的是,此处是将二维
* 矩阵转换成一个列向量,然后对该列向量进行一次一维小波变换。
*
************************************************************************/
BOOL CWaveTranform::DIBDisWavelet(LPSTR lpDIB,LPSTR lpDIBBits,double* LF,double* HF,int FWidth,int nLevel)
{
unsigned char* lpSrc;// 指向源图像的指针
double dTemp;// 中间变量
LONG lLineBytes; // 图像每行的字节数
LONG lWidth,lHeight;
lWidth=::DIBWidth(lpDIB);
lHeight=::DIBHeight(lpDIB);
LONG i,j;//循环变量
double *f = new double[lWidth*lHeight];// 分配内存
if(::DIBNumColors(lpDIB)==256)
{
lLineBytes = WIDTHBYTES(lWidth * 8);// 计算图像每行的字节数
// 从源图像中读取数据。
for(i = 0; i < lHeight; i++)// 每列
{
for(j = 0; j < lWidth; j++)// 每行
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) +j; // 指向DIB第i行,第j个象素的指针
f[i*lWidth+j] = *(lpSrc);// 给时域赋值
//将规划处理后的值变回原样
f[i*lWidth+j]=(m_GrayMax-m_GrayMin)/255*f[i*lWidth+j]+m_GrayMin;
}
}
int n;//层数循环变量
//小波变换重建过程循环
for(n=nLevel-1;n>=0;n--)
{
LONG Height,Width;
Height=long(lHeight/pow(2,n));
Width=long(lWidth/pow(2,n));
double *H00=new double[Height]; //按列存放低低元素
double *H01=new double[Height]; //按列存放低高元素
double *H10=new double[Height]; //按列存放高低元素
double *H11=new double[Height]; //按列存放高高元素
for(i = 0; i < Width/2; i++)
{
for(j=0;j<Height/2;j++)
{
H00[2*j]=f[i+j*lWidth];
H00[2*j+1]=0;
}
for(j=Height/2;j<Height;j++)
{
H01[2*j-Height]=f[i+j*lWidth];
H01[2*j-Height+1]=0;
}
DisConvolution( LF,HF, FWidth,H00,H01 ,Height);// 对y方向进行解内积运算
for(j=0;j<Height;j++)
{
f[i+j*lWidth]=H00[j];
}
}
for(i =Width/2 ; i < Width; i++)
{
for(j=0;j<Height/2;j++)
{
H10[2*j]=f[i+j*lWidth];
H10[2*j+1]=0;
}
for(j=Height/2;j<Height;j++)
{
H11[2*j-Height]=f[i+j*lWidth];
H11[2*j-Height+1]=0;
}
DisConvolution( LF,HF, FWidth,H10,H11, Height); // 对y方向进行解内积运算
for(j=0;j<Height;j++)
{
f[i+j*lWidth]=H10[j];
}
}
delete H00,H01,H10,H11;//释放内存
double *H0=new double[Width]; //按行存放低元素
double *H1=new double[Width]; //按行存放高元素
for(i = 0; i < Height; i++)
{
for(j=0;j<Width/2;j++)
{
H0[2*j]=f[i*lWidth+j];
H0[2*j+1]=0;
}
for(j=Width/2;j<Width;j++)
{
H1[2*j-Width]=f[i*lWidth+j];
H1[2*j-Width+1]=0;
}
DisConvolution( LF,HF, FWidth,H0,H1, Width);// 对x方向进行解卷积运算
for(j=0;j<Width;j++)
{
f[i*lWidth+j]=H0[j];
}
}
delete H0,H1;
}
// 更新源图像
for(i = 0; i < lHeight; i++)// 每列
{
for(j = 0; j < lWidth; j++)// 每行
{
dTemp = f[i * lWidth + j]; // 计算频谱
if (dTemp > 255)
dTemp = 255;
if(dTemp < 0)
dTemp=0;
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;// 指向DIB第i行,第j个象素的指针
* (lpSrc) = (BYTE)(dTemp);// 更新源图像
}
}
}
else
{
int ncolor;
for(ncolor=0;ncolor<3;ncolor++)
{
lLineBytes = WIDTHBYTES(lWidth * 24);// 计算图像每行的字节数
// 从源图像中读取数据。
for(i = 0; i < lHeight; i++)// 每列
{
for(j = 0; j < lWidth; j++)// 每行
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) +3*j+ncolor; // 指向DIB第i行,第j个象素的指针
f[i*lWidth+j] = *(lpSrc);// 给时域赋值
//将规划处理后的值变回原样
f[i*lWidth+j]=(m_ColorMax[ncolor]-m_ColorMin[ncolor])/255*f[i*lWidth+j]+m_ColorMin[ncolor];
}
}
int n;//层数循环变量
//小波变换重建过程循环
for(n=nLevel-1;n>=0;n--)
{
LONG Height,Width;
Height=long(lHeight/pow(2,n));
Width=long(lWidth/pow(2,n));
double *H00=new double[Height]; //按列存放低低元素
double *H01=new double[Height]; //按列存放低高元素
double *H10=new double[Height]; //按列存放高低元素
double *H11=new double[Height]; //按列存放高高元素
for(i = 0; i < Width/2; i++)
{
for(j=0;j<Height/2;j++)
{
H00[2*j]=f[i+j*lWidth];
H00[2*j+1]=0;
}
for(j=Height/2;j<Height;j++)
{
H01[2*j-Height]=f[i+j*lWidth];
H01[2*j-Height+1]=0;
}
DisConvolution( LF,HF, FWidth,H00,H01 ,Height);// 对y方向进行解内积运算
for(j=0;j<Height;j++)
{
f[i+j*lWidth]=H00[j];
}
}
for(i =Width/2 ; i < Width; i++)
{
for(j=0;j<Height/2;j++)
{
H10[2*j]=f[i+j*lWidth];
H10[2*j+1]=0;
}
for(j=Height/2;j<Height;j++)
{
H11[2*j-Height]=f[i+j*lWidth];
H11[2*j-Height+1]=0;
}
DisConvolution( LF,HF, FWidth,H10,H11, Height); // 对y方向进行解内积运算
for(j=0;j<Height;j++)
{
f[i+j*lWidth]=H10[j];
}
}
delete H00,H01,H10,H11;//释放内存
double *H0=new double[Width]; //按行存放低元素
double *H1=new double[Width]; //按行存放高元素
for(i = 0; i < Height; i++)
{
for(j=0;j<Width/2;j++)
{
H0[2*j]=f[i*lWidth+j];
H0[2*j+1]=0;
}
for(j=Width/2;j<Width;j++)
{
H1[2*j-Width]=f[i*lWidth+j];
H1[2*j-Width+1]=0;
}
DisConvolution( LF,HF, FWidth,H0,H1, Width);// 对x方向进行解卷积运算
for(j=0;j<Width;j++)
{
f[i*lWidth+j]=H0[j];
}
}
delete H0,H1;
}
// 更新源图像
for(i = 0; i < lHeight; i++)// 每列
{
for(j = 0; j < lWidth; j++)// 每行
{
dTemp = f[i * lWidth + j]; // 计算频谱
if (dTemp > 255)
dTemp = 255;
if(dTemp < 0)
dTemp=0;
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + 3*j+ncolor;// 指向DIB第i行,第j个象素的指针
* (lpSrc) = (BYTE)(dTemp);// 更新源图像
}
}
}
}
delete f;//释放内存
return TRUE;// 返回
}
/*************************************************************************
*
* 函数名称:
* DIBQuantize()
*
* 参数:
* LPSTR lpDIB - 指向DIB图像指针
* LPSTR lpDIBBits - 指向源DIB象素指针
* int Thredhold - 小波窗的宽度
*
* 返回值:
* BOOL - 成功返回TRUE,否则返回FALSE。
*
* 说明:
* 该函数用来对小波变换后的图像进行量化
*
************************************************************************/
BOOL CWaveTranform::DIBQuantize(LPSTR lpDIB,LPSTR lpDIBBits,int* Thredhold)
{
unsigned char* lpSrc;// 指向源图像的指针
double dTemp;// 中间变量
LONG lLineBytes; // 图像每行的字节数
LONG lWidth,lHeight;
lWidth=::DIBWidth(lpDIB);
lHeight=::DIBHeight(lpDIB);
LONG i,j;//循环变量
if(::DIBNumColors(lpDIB)==256)
{
lLineBytes = WIDTHBYTES(lWidth * 8);// 计算图像每行的字节数
// 从源图像中读取数据。
for(i = 0; i < lHeight; i++)// 每列
{
for(j = 0; j < lWidth; j++)// 每行
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) +j; // 指向DIB第i行,第j个象素的指针
dTemp =*(lpSrc) ;
dTemp=(m_GrayMax-m_GrayMin)/255*dTemp+m_GrayMin;
if(fabs(dTemp) < *Thredhold)
dTemp= 0;
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;// 指向DIB第i行,第j个象素的指针
dTemp=255/(m_GrayMax-m_GrayMin)*(dTemp-m_GrayMin);
* (lpSrc) = (BYTE)(dTemp);// 更新源图像
}
}
}
else
{
int ncolor;
for(ncolor=0;ncolor<3;ncolor++)
{
lLineBytes = WIDTHBYTES(lWidth * 24);// 计算图像每行的字节数
// 从源图像中读取数据。
for(i = 0; i < lHeight; i++)// 每列
{
for(j = 0; j < lWidth; j++)// 每行
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) +3*j+ncolor; // 指向DIB第i行,第j个象素的指针
dTemp = *(lpSrc);
dTemp=(m_ColorMax[ncolor]-m_ColorMin[ncolor])/255*dTemp+m_ColorMin[ncolor];
if(fabs(dTemp) < Thredhold[ncolor])
dTemp= 0;
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + 3*j+ncolor;// 指向DIB第i行,第j个象素的指针
dTemp=255/(m_ColorMax[ncolor]-m_ColorMin[ncolor])*(dTemp-m_ColorMin[ncolor]);
* (lpSrc) = (BYTE)(dTemp);// 更新源图像
}
}
}
}
return TRUE;// 返回
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -