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

📄 wavelet2ddlg.cpp

📁 用vc++来实现小波算法,某书例程,非常经典.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	 else
		 flag=1;
	 return HH(-1*i+1,m)*flag;
}

//H算子周期化过程
BOOL CWavelet2DDlg::HHH(int level,int size)
{
     int len,m,i;
	 double temp;
	 int sign;
	 len=size>>level;
	 m=m_nFilterLen/2;
	 if((ph=new double[sizeof(double)*len])==NULL)
	 {
	    AfxMessageBox("H算子内存分配失败!",MB_OK|MB_ICONINFORMATION);
		return FALSE;
	 }
	 for(sign=0;sign<len;sign++)
	 {
	     temp=0;
		 for(i=(-1*m+1);i<=m;i++)
		 {
		     if(((sign-i)%len)==0)
		     temp+=HH(i-1,m);
		 }
		 ph[sign]=temp;
	 }
	 return TRUE;
}

// G算子周期化过程
BOOL CWavelet2DDlg::GGG(int level,int size)
{
     int len,m,i;
	 double temp;
	 int sign;
	 len=size>>level;
	 m=m_nFilterLen/2;
	 if((pg=new double[sizeof(double)*len])==NULL)
	 {
	    AfxMessageBox("G算子内存分配失败!",MB_OK|MB_ICONINFORMATION);
		return FALSE;
	 }
	 for(sign=0;sign<len;sign++)
	 {
	     temp=0;
		 for(i=(-1*m+3);i<=m+2;i++)
		 {
		     if(((sign-i)%len)==0)
		     temp+=GG(i-1,m);
		 }
		 pg[sign]=temp;
	 }
	 return TRUE;
}

// H算子作用于行数据
void CWavelet2DDlg::HOperatorOnRow(int filterlen, int start, int len,int row)
{
     int i,i2,m,k,len1;
	 double temp1;
	 m=m_nFilterLen/2;
	 len1=len>>1;
	 for(i=0;i<len1;i++)
	 {
	     i2=2*i;
		 tempRow[i+start]=0;
		 if(len>filterlen)
		 {
		    for(k=i2-len;k<=i2-len+m;k++)
			{
			    if((k>=0)&&(k<len))
					if((temp1=ph[(k-i2+len)%len])!=0)
						tempRow[i+start]+=temp1*image[row][k+start];
			}
			for(k=i2-m+1;k<=i2+m;k++)
			{
			    if((k>=0)&&(k<len))
					if((temp1=ph[(k-i2+len)%len])!=0)
						tempRow[i+start]+=temp1*image[row][k+start];
			}
			for(k=i2+len-m+1;k<=i2+len;k++)
			{
			    if((k>=0)&&(k<len))
					if((temp1=ph[(k-i2+len)%len])!=0)
						tempRow[i+start]+=temp1*image[row][k+start];
			}
		 }
		 else
		 {
		    for(k=0;k<len;k++)
			{
			    if((temp1=ph[(k-i2+len)%len])!=0)
					tempRow[i+start]+=temp1*image[row][k+start];
			}
		 }
	 }
}

// H算子作用于列数据
void CWavelet2DDlg::HOperatorOnCol(int filterlen, int start, int len,int col)
{
	 int i,i2,m,k,len1;
	 double temp1;
	 m=m_nFilterLen/2;
	 len1=len>>1;
	 for(i=0;i<len1;i++)
	 {
	     i2=2*i;
		 tempCol[i+start]=0;
		 if(len>filterlen)
		 {
		    for(k=i2-len;k<=i2-len+m;k++)
			{
			    if((k>=0)&&(k<len))
					if((temp1=ph[(k-i2+len)%len])!=0)
						tempCol[i+start]+=temp1*image[k+start][col];
			}
			for(k=i2-m+1;k<=i2+m;k++)
			{
			    if((k>=0)&&(k<len))
					if((temp1=ph[(k-i2+len)%len])!=0)
						tempCol[i+start]+=temp1*image[k+start][col];
			}
			for(k=i2+len-m+1;k<=i2+len;k++)
			{
			    if((k>=0)&&(k<len))
					if((temp1=ph[(k-i2+len)%len])!=0)
						tempCol[i+start]+=temp1*image[k+start][col];
			}
		 }
		 else
		 {
		    for(k=0;k<len;k++)
			{
			    if((temp1=ph[(k-i2+len)%len])!=0)
					tempCol[i+start]+=temp1*image[k+start][col];
			}
		 }
	 }

}

// G算子作用于行数据
void CWavelet2DDlg::GOperatorOnRow(int filterlen, int start, int len,int row)
{
	 int i,i2,m,k,len1;
	 double temp1;
	 m=m_nFilterLen/2;
	 len1=len>>1;
	 for(i=0;i<len1;i++)
	 {
	     i2=2*i;
		 tempRow[i+start+len1]=0;
		 if(len>filterlen)
		 {
		    for(k=i2-len;k<=i2-len+m+2;k++)
			{
			    if((k>=0)&&(k<len))
					if((temp1=pg[(k-i2+len)%len])!=0)
						tempRow[i+start+len1]+=temp1*image[row][k+start];
			}
			for(k=i2-m+3;k<=i2+m+2;k++)
			{
			    if((k>=0)&&(k<len))
					if((temp1=pg[(k-i2+len)%len])!=0)
						tempRow[i+start+len1]+=temp1*image[row][k+start];
			}
			for(k=i2+len-m+3;k<=i2+len;k++)
			{
			    if((k>=0)&&(k<len))
					if((temp1=pg[(k-i2+len)%len])!=0)
						tempRow[i+start+len1]+=temp1*image[row][k+start];
			}
		 }
		 else
		 {
		    for(k=0;k<len;k++)
			{
			    if((temp1=pg[(k-i2+len)%len])!=0)
					tempRow[i+start]+=temp1*image[row][k+start];
			}
		 }
	 }
}

// G算子作用于列数据
void CWavelet2DDlg::GOperatorOnCol(int filterlen, int start, int len,int col)
{
	 int i,i2,m,k,len1;
	 double temp1;
	 m=m_nFilterLen/2;
	 len1=len>>1;
	 for(i=0;i<len1;i++)
	 {
	     i2=2*i;
		 tempCol[i+start+len1]=0;
		 if(len>filterlen)
		 {
		    for(k=i2-len;k<=i2-len+m+2;k++)
			{
			    if((k>=0)&&(k<len))
					if((temp1=pg[(k-i2+len)%len])!=0)
						tempCol[i+start+len1]+=temp1*image[k+start][col];
			}
			for(k=i2-m+3;k<=i2+m+2;k++)
			{
			    if((k>=0)&&(k<len))
					if((temp1=pg[(k-i2+len)%len])!=0)
						tempCol[i+start+len1]+=temp1*image[k+start][col];
			}
			for(k=i2+len-m+3;k<=i2+len;k++)
			{
			    if((k>=0)&&(k<len))
					if((temp1=pg[(k-i2+len)%len])!=0)
						tempCol[i+start+len1]+=temp1*image[k+start][col];
			}
		 }
		 else
		 {
		    for(k=0;k<len;k++)
			{
			    if((temp1=pg[(k-i2+len)%len])!=0)
					tempCol[i+start+len1]+=temp1*image[k+start][col];
			}
		 }
	 }
}

// 进行第stage层行变换
void CWavelet2DDlg::DecompStageRow(int row, int stage, int numx)
{
     int i,start,end;
	 int filterlen,len;
	 filterlen=m_nFilterLen;
	 len=m_nImageWidth>>stage;
	 start=len*numx;
	 end=start+len;
	 HOperatorOnRow(filterlen,start,len,row); // H算子作用于行
	 GOperatorOnRow(filterlen,start,len,row); // G算子作用于行
	 for(i=start;i<end;i++)
		 image[row][i]=tempRow[i];
}

// 进行第stage层列变换
void CWavelet2DDlg::DecompStageCol(int col, int stage, int numx)
{
     int i,start,end;
	 int filterlen,len;
	 filterlen=m_nFilterLen;
	 len=m_nImageHeight>>stage;
	 start=len*numx;
	 end=start+len;
	 HOperatorOnCol(filterlen,start,len,col);  // H算子作用于列
	 GOperatorOnCol(filterlen,start,len,col);  // G算子作用于列
	 for(i=start;i<end;i++)
		 image[i][col]=tempCol[i];
}

// 二维小波变换
void CWavelet2DDlg::Wavelet2D()
{
     int row,col,stage;
	 // 进行第stage层小波变换
	 for(stage=0;stage<m_nDecomposeStage;stage++)
	 {
	     // 初始化H算子和G算子
		 if((!HHH(stage,m_nImageWidth))||(!GGG(stage,m_nImageWidth)))
			 break;
		 else
			 // 逐行变换
			 for(row=0;row<(m_nImageHeight>>stage);row++)
			 {
			     DecompStageRow(row,stage,0);  
			 }
	     if(ph&&pg)      // 释放资源
		 {
		    delete  ph;
			delete  pg;
			ph=NULL;
			pg=NULL;
		 }
    	 // 初始化H算子和G算子
		 if((!HHH(stage,m_nImageHeight))||(!GGG(stage,m_nImageHeight)))
			 break;
		 else
			 // 逐列变换
			 for(col=0;col<(m_nImageWidth>>stage);col++)
			 {
			     DecompStageCol(col,stage,0);
			 }
         if(ph&&pg)      // 释放资源
		 {
		    delete  ph;
			delete  pg;
			ph=NULL;
			pg=NULL;
		 }
	 }
}

// 绘制原始图像
void CWavelet2DDlg::DrawOriginalBmp()
{
	// 得到客户区
	CDC* pDC=GetDC();
    CRect RectClient,Workarea;
    GetClientRect(RectClient);
	
	// 锁定DIB
	lpDIB = (LPSTR)::GlobalLock((HGLOBAL) GetHDIB());

    // 在对话框右上部分创建绘制原始图像区域
	Workarea.left=RectClient.left+(RectClient.right-RectClient.left)/5*2;
    Workarea.right=RectClient.right-10;
    Workarea.top=RectClient.top+10;
	Workarea.bottom=RectClient.top+(RectClient.bottom-RectClient.top-10)/2;

	// 设置区域背景色为白色
	pDC->Rectangle(Workarea);
    pDC->SetBkColor(0x00FFFFFF);	

	// 绘制原始图像
	m_pBmpInfo->bmiHeader.biWidth = m_nImageWidth;
    m_pBmpInfo->bmiHeader.biHeight = m_nImageHeight;
	::StretchDIBits(pDC->GetSafeHdc(), Workarea.left+1, Workarea.top+1, Workarea.Width(),Workarea.Height(),//m_nImageWidth, m_nImageHeight,
	                0, 0, m_nImageWidth, m_nImageHeight, (unsigned char *)lpDIBBits,
					(LPBITMAPINFO) m_pBmpInfo, DIB_RGB_COLORS, SRCCOPY);	
    // 解除锁定
	::GlobalUnlock((HGLOBAL)GetHDIB());

}

// 绘制二维小波变换后图像
void CWavelet2DDlg::DrawWavelet2D()
{
	// 找到图像变换后数据中的最大最小值
	double min=image[0][0],max=0;
    for(int a=0;a<m_nImageHeight;a++)
	   for(int b=0;b<m_nImageWidth;b++)
	   {
		   if(image[a][b]>10000)
			   image[a][b]=max;
		   if(image[a][b]<-10000)
			   image[a][b]=min;
		   if(max<image[a][b])
	          max=image[a][b];
	       if(min>image[a][b])
	          min=image[a][b];
	   }

    // 将图像变换后数据归一化到256级灰度
	for(int m=0;m<m_nImageHeight;m++)
		for(int n=0;n<m_nImageWidth;n++)
		{  			
		  	image[m][n]=(image[m][n]-min)/(max-min)*256.0;
		    *((unsigned char *)lpDIBBits+m_nImageWidth*m+n)=(unsigned char )image[m][n];
		}
	
	// 得到客户区
	CDC* pDC=GetDC();
    CRect RectClient,Workarea;
    GetClientRect(RectClient);

	// 锁定DIB
	lpDIB = (LPSTR)::GlobalLock((HGLOBAL) GetHDIB());

	// 在对话框右下部分创建绘制原始图像区域
	Workarea.left=RectClient.left+(RectClient.right-RectClient.left)/5*2;
    Workarea.right=RectClient.right-10;
	Workarea.top=RectClient.top+10+(RectClient.bottom-RectClient.top-10)/2;
    Workarea.bottom=RectClient.bottom-10;
	
	// 设置区域背景色为白色 
    pDC->Rectangle(Workarea);
    pDC->SetBkColor(0x00FFFFFF);

	// 绘制原始图像
	m_pBmpInfo->bmiHeader.biWidth = m_nImageWidth;
    m_pBmpInfo->bmiHeader.biHeight = m_nImageHeight;
	::StretchDIBits(pDC->GetSafeHdc(), Workarea.left+1, Workarea.top+1, Workarea.Width(),Workarea.Height(),//m_nImageWidth, m_nImageHeight,
	                0, 0, m_nImageWidth, m_nImageHeight, (unsigned char *)lpDIBBits,
					(LPBITMAPINFO) m_pBmpInfo, DIB_RGB_COLORS, SRCCOPY);	

	// 解除锁定
	::GlobalUnlock((HGLOBAL)GetHDIB());
}

// 得到小波变换所需的层次、滤波器长度等参数
void CWavelet2DDlg::GetParam()
{
	// 得到待分解层次信息
	if(m_combDecomposeStage.GetCurSel()==CB_ERR)
	   m_nDecomposeStage=1;
	else
   	   m_nDecomposeStage=m_combDecomposeStage.GetItemData(m_combDecomposeStage.GetCurSel());
		
	// 得到滤波器长度
	if(m_combFilterLen.GetCurSel()==CB_ERR)
	   m_nFilterLen=6;
	else
	   m_nFilterLen=m_combFilterLen.GetItemData(m_combFilterLen.GetCurSel());
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -