⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wavetranform.cpp

📁 使用小波变换的处理方法对图象进行图象的压缩。
💻 CPP
📖 第 1 页 / 共 2 页
字号:

/*************************************************************************
 *
 * 函数名称:
 *   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 + -