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

📄 testview.cpp

📁 方向自适应的小波变换程序(5/3) 本人自己编写
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	   int h=height>>l;
	   int i;
	   //竖直方向逆变换
	   for(i=0;i<w;i++)
	   {  int j;
	      for(j=0;j<h;j++)
			  tmp_column_in[j]=dst[j][i];  //倒序处理
		  inverse_wavelet_row(tmp_column_out,tmp_column_in,h);
		  for(j=0;j<h;j++)
			  dst[j][i]=tmp_column_out[j];  
	   }

	   //水平方向逆变换
	   for(i=0;i<h;i++)
	   {
		   inverse_wavelet_row(tmp_lastrow,dst[i],w);
		   memcpy(dst[i],tmp_lastrow,w*sizeof(int));
	   }
	}
	free(tmp_lastrow);
}

///////////////////////////////////////////////////////////////////////////////
///////以下是小波变换的菜单响应函数

void CTestView::OnIntWaveletForward() 
{
	 // 获取文档
	CTestDoc* pDoc = GetDocument();
	
	// 指向DIB的指针
	LPSTR lpDIB;
	
	// 指向DIB象素指针
	LPSTR    lpDIBBits;
	
	// 锁定DIB
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
	
	// 找到DIB图像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIB);
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图,其它的可以类推)
	if (::DIBNumColors(lpDIB) != 256)
	{
		// 提示用户
		MessageBox("目前只支持查看256色位图灰度直方图!", "系统提示" , MB_ICONINFORMATION | MB_OK);
		
		// 解除锁定
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
		
		// 返回
		return;
	}
	
	int lHeight,lWidth;
	int  i,j;
	lHeight=::DIBHeight(lpDIB);
	lWidth=::DIBWidth(lpDIB);
	DWORD dwLineBytes=WIDTHBYTES(lWidth*8);	
	
	Dialog1 tt;
	
	if(tt.DoModal()==IDOK)
	{ levels=tt.m_Levels;
	}
	free(tt);

	MyHeight=lHeight;
	MyWidth=lWidth;
	//申请空间,初始化原始图像数组
	origin=new int* [lHeight];
	for(i=0;i<lHeight;i++)
	   origin[i]=new int [lWidth];

	for(i=0;i<lHeight;i++)
      for(j=0;j<lWidth;j++)
	  {
			//LPSTR lptemp=lpDIBBits+(lHeight-i-1)*dwLineBytes+j; //-128---+127
			//origin[i][j]=(int)(*lptemp);
			BYTE *lptemp=(BYTE *)lpDIBBits+(lHeight-1-i)*dwLineBytes+j; //0--255
			origin[i][j]=(int)(*lptemp);
	  }

	wavelet_transform_overlap(origin,dwLineBytes,lHeight,levels);

	for(i=0;i<lHeight;i++)
      for(j=0;j<lWidth;j++)
	  {
		  BYTE* lptemp=(BYTE*)lpDIBBits+(lHeight-i-1)*dwLineBytes+j;
		  (*lptemp)=(BYTE)origin[i][j];
	  }

	// 更新视图
	pDoc->UpdateAllViews(NULL);
	
    // 解除锁定
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
	//下面是将得到的系数写入文件,保存起来,文件保存在工程所在的目录下
/*
	CFile CoeMatrix;
	CFileException fe;
	CoeMatrix.Open("coefficients.txt",CFile::modeCreate | CFile::modeReadWrite | CFile::shareExclusive,&fe);

	CString str;
	int max=-10000;
	int min=100000;
	for(i=0;i<lHeight/4;i++)
      for(DWORD j=0;j<lWidth/4;j++)
	  {
		  if(max<origin[i][j])
			  max=origin[i][j];
		  if(min>origin[i][j])
			  min=origin[i][j];

		  str.Format("%d",origin[i][j]);
		  CoeMatrix.Write(str,str.GetLength());
		  CoeMatrix.Write(",",1);
	  }
	CoeMatrix.Close();
	str.Format("Max:%d,Min:%d",max,min);
	AfxMessageBox(str);
*/
}


void CTestView::OnIntWaveletBackward() 
{
	// 获取文档
	CTestDoc* pDoc = GetDocument();
	
	// 指向DIB的指针
	LPSTR lpDIB;
	
	// 指向DIB象素指针
	LPSTR    lpDIBBits;
	
	// 锁定DIB
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
	
	// 找到DIB图像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIB);
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图,其它的可以类推)
	if (::DIBNumColors(lpDIB) != 256)
	{
		// 提示用户
		MessageBox("目前只支持查看256色位图灰度直方图!", "系统提示" , MB_ICONINFORMATION | MB_OK);
		
		// 解除锁定
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
		
		// 返回
		return;
	}
	
	DWORD lHeight,lWidth;
	lHeight=::DIBHeight(lpDIB);
	lWidth=::DIBWidth(lpDIB);
	DWORD dwLineBytes=WIDTHBYTES(lWidth*8);	

/*	int **origin=new int* [lHeight];
	for(DWORD i=0;i<lHeight;i++)
	   origin[i]=new int [lWidth];
   
	for(i=0;i<lHeight;i++)
      for(DWORD j=0;j<lWidth;j++)
	  {
		  LPSTR lptemp=lpDIBBits+(lHeight-i-1)*dwLineBytes+j;
		  origin[i][j]=(int)(*lptemp);
	  }
*/
	inverse_wavelet_transform_overlap(origin,lWidth,lHeight,levels);

	for(DWORD i=0;i<lHeight;i++)
      for(DWORD j=0;j<lWidth;j++)
	  {
		  BYTE* lptemp=(BYTE*)lpDIBBits+(lHeight-i-1)*dwLineBytes+j;
		  (*lptemp)=(BYTE)origin[i][j];
	  }

	// 更新视图
	pDoc->UpdateAllViews(NULL);

/*  
	//将逆变换后的图像与原图像相比较,求出峰值信噪比
	//打开与解码文件对应的源位图文件
    char FiltersSource[]="*.bmp";
	CString PathName;
	CFile bmpSourceFile;
    CFileException fe;
	HDIB hDIBSource;
    LPSTR lpDIBSource;
	LPSTR lpSource,lptemp;

    CFileDialog dlgFileSource(TRUE,"bmp","*.bmp",OFN_READONLY,FiltersSource,this);
    if(dlgFileSource.DoModal ()==IDOK)
       PathName=dlgFileSource.GetPathName();
    else
	   return;
    bmpSourceFile.Open((LPCTSTR)PathName,CFile::modeRead,&fe);

    hDIBSource=::ReadDIBFile(bmpSourceFile);
	lpDIBSource=(LPSTR)::GlobalLock((HGLOBAL)hDIBSource);
    lpSource=FindDIBBits(lpDIBSource);
	double difference=0.0;
	lptemp=lpDIBBits;
	LPSTR lpSourcetemp=lpSource;

	for(i=0;i<::DIBHeight(lpDIB);i++)
		for(unsigned int j=0;j<::DIBWidth(lpDIB);j++)
	  { lptemp=lpDIBBits+i*(::DIBWidth(lpDIB))+j;
	    lpSourcetemp=lpSource+i*(::DIBWidth(lpDIB))+j;
		difference+=pow((double)((*lptemp)-(*lpSourcetemp)),double(2));
	  }

	double temp=255*255*(double)(::DIBWidth(lpDIB))*(double)(::DIBHeight(lpDIB));
	double ratio=10 * log10((double)(temp/difference));

	::GlobalUnlock (hDIBSource);
*/   

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



void CTestView::OnIntAdlWaveletForward() 
{
	// 获取文档
	CTestDoc* pDoc = GetDocument();
	
	// 指向DIB的指针
	LPSTR lpDIB;
	
	// 指向DIB象素指针
	LPSTR    lpDIBBits;
	
	// 锁定DIB
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
	
	// 找到DIB图像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIB);
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图,其它的可以类推)
	if (::DIBNumColors(lpDIB) != 256)
	{
		// 提示用户
		MessageBox("目前只支持查看256色位图灰度直方图!", "系统提示" , MB_ICONINFORMATION | MB_OK);
		
		// 解除锁定
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
		
		// 返回
		return;
	}
	
	int lHeight,lWidth;
	int  i,j,m;
	lHeight=::DIBHeight(lpDIB);
	lWidth=::DIBWidth(lpDIB);
	DWORD dwLineBytes=WIDTHBYTES(lWidth*8);	
	
	MyHeight=lHeight;
	MyWidth=lWidth;
	M=8;
	N=8;
	

	Dialog1 tt;
	if(tt.DoModal()==IDOK)
	{ levels=tt.m_Levels;
	}
	free(tt);
	M_sample=tt.m_Samples/2;//取样点数
	
	Sinc_coefficitns();
	//申请空间,初始化原始图像数组
	origin=new int* [MyHeight];
	for(i=0;i<MyHeight;i++)
	   origin[i]=new int [MyWidth];
	for(i=0;i<MyHeight;i++)
      for(j=0;j<MyWidth;j++)
	  {
			//LPSTR lptemp=lpDIBBits+(lHeight-i-1)*dwLineBytes+j; //-128---+127
			//origin[i][j]=(int)(*lptemp);
			BYTE *lptemp=(BYTE *)lpDIBBits+(lHeight-1-i)*dwLineBytes+j; //0--255
			origin[i][j]=(int)(*lptemp);
	  }
	
	total_preDrection=new int* [levels];
	total_preDrection1=new int* [levels];

	for(m=0;m<levels;m++)
	{

		//列变换
		Horizontal_Sinc_interpolation();//插值
		Horizontal_Direction_Prediction();//判断预测的方向并预测

		Horizontal_Sinc_interpolation();//插值
		Horizontal_Update();//更新
		//ADLwavelet_transform_overlap(origin,dwLineBytes,lHeight,3);
		
		//行变换
		Vertical_Sinc_interpolation();//插值
		Vertical_Direction_Prediction();//判断预测的方向并预测
		

		Vertical_Sinc_interpolation();//插值
		Vertical_Update();//更新
	
		//保存预测的方向信息
		total_preDrection[m]=new int [(MyHeight/M)*(MyWidth/N)];
		for(i=0;i<MyHeight/M;i++)
			for(j=0;j<MyWidth/N;j++)
			{
				total_preDrection[m][i*(MyWidth/N)+j]=Predict_direc[i][j];
			}
		total_preDrection1[m]=new int [(MyHeight/M)*(MyWidth/N)];
		for(i=0;i<MyHeight/M;i++)
			for(j=0;j<MyWidth/N;j++)
			{
				total_preDrection1[m][i*(MyWidth/N)+j]=Predict_direc1[i][j];
			}
		//下一级分解初始化
		MyHeight=MyHeight/2;
		MyWidth=MyWidth/2;

		  if(ori_QuartPixel_interp!=NULL)
		  {delete ori_QuartPixel_interp;
		   ori_QuartPixel_interp=NULL;}
		  if(Predict_direc!=NULL)
		  {delete Predict_direc;
		  Predict_direc=NULL;}
		  if(Block_energy!=NULL)
		  {delete Block_energy;
		   Block_energy=NULL;}

		  if(ori_QuartPixel_interp1!=NULL)
		  {delete ori_QuartPixel_interp1;
		   ori_QuartPixel_interp1=NULL;}
		  if(Predict_direc1!=NULL)
		  {delete Predict_direc1;
		   Predict_direc1=NULL;}
		  if(Block_energy1!=NULL)
		  {delete Block_energy1;
		  Block_energy1=NULL;} 
	}
	
	MyHeight=MyHeight<<levels;
	MyWidth=MyWidth<<levels;
	
	// 更新视图
	pDoc->UpdateAllViews(NULL);
	
    // 解除锁定
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
	//下面是将得到的系数写入文件,保存起来,文件保存在工程所在的目录下
	CFile CoeMatrix;
	CFileException fe;
	CoeMatrix.Open("coefficients.txt",CFile::modeCreate | CFile::modeReadWrite | CFile::shareExclusive,&fe);

	CString str;
/*	int max=-10000;
	int min=100000;
	for(i=0;i<lHeight/4;i++)
      for(DWORD j=0;j<lWidth/4;j++)
	  {
		  if(max<origin[i][j])
			  max=origin[i][j];
		  if(min>origin[i][j])
			  min=origin[i][j];

		  str.Format("%d",origin[i][j]);
		  CoeMatrix.Write(str,str.GetLength());
		  CoeMatrix.Write(",",1);
	  }
	CoeMatrix.Close();
	str.Format("Max:%d,Min:%d",max,min);
	AfxMessageBox(str);
*/
	int E=0;
	int max=-10000;
	int min=100000;
	for(i=MyHeight/2;i<MyHeight;i++)
      for(j=0;j<MyWidth;j++)
	  {
		  if(max<origin[i][j])
		  {max=origin[i][j];}
		  if(min>origin[i][j])
		  {min=origin[i][j];}
		  E+=abs(origin[i][j]);
	  }

	str.Format("Max:%d,Min:%d,Energy:%d",max,min,E);
//	AfxMessageBox(str);


	for(i=0;i<lHeight;i++)
      for(j=0;j<lWidth;j++)
	  {
		  BYTE* lptemp=(BYTE*)lpDIBBits+(lHeight-i-1)*dwLineBytes+j;
		  (*lptemp)=(BYTE)origin[i][j];
	  }
/*
	for(i=0;i<8;i++)
	{
		for(j=0;j<8;j++)
		{//Block_energy   Predict_direc
		  str.Format("%d",ori_QuartPixel_interp1[i][j]);
		  //str.Format("%d",origin[0][j]);
		  CoeMatrix.Write(str,str.GetLength());
		  //CoeMatrix.Write(str,4);
		  CoeMatrix.Write(",",1);
		}
		  CoeMatrix.Write("\r\n",2);
	}
	*/
	CoeMatrix.Close(); 	
}

void CTestView::Horizontal_Sinc_interpolation()
{

 	int  i,j,x;
	int l;
	double sum=0;

	//1/2像素插值	
/* 	//申请空间,初始化半像素插值数组
 	ori_HalPixel_interp=new int* [MyHeight];
 	for(i=0;i<MyHeight;i++)
 	   ori_HalPixel_interp[i]=new int [MyWidth*2];	

	for(i=0;i<MyHeight;i++)
		for(j=0;j<MyWidth;j++)
		{
			for(l=-M+1;l<=M;l++)
			{
				x=j+l;			   
			    if( x<0 )
				{ x=-x;}
			    if(x>MyWidth)
				{ x=(MyWidth*2-x);}
				sum+= origin[i][x]*sin(PI*(0.5-l))/(PI*(0.5-l));
			}
			ori_HalPixel_interp[i][2*j+1]=sum;
			sum=0;
 		}
*/
 
	//1/4像素插值
	double sum1,sum2,sum3;
	sum1=sum2=sum3=0;
	
	//申请空间,初始化四分之一像素插值数组
	ori_QuartPixel_interp=new int* [MyHeight];
 	for(i=0;i<MyHeight;i++)
 	   ori_QuartPixel_interp[i]=new int [MyWidth*4];
 	
 	for(i=0;i<MyHeight;i++)
       for(j=0;j<MyWidth;j++)
 	  {  ori_QuartPixel_interp[i][j*4] = origin[i][j];}
	for(i=0;i<MyHeight;i++)
		for(j=0;j<MyWidth;j++)
 		{
			for(l=-M_sample+1;l<=M_sample;l++)
			{
				x=j+l;			   
				if( x<0 )
				{ x=-x;}
				if(x>MyWidth-1)
				{x=((MyWidth-1)*2-x);}
				//sum1+= origin[i][x]*sin(PI*(0.25-l))/(PI*(0.25-l));
				//sum2+= origin[i][x]*sin(PI*(0.5-l))/(PI*(0.5-l));
				//sum3+= origin[i][x]*sin(PI*(0.75-l))/(PI*(0.75-l));
				sum1+= origin[i][x]*Sinc_interpolation[0][l+M_sample-1];
				sum2+= origin[i][x]*Sinc_interpolation[1][l+M_sample-1];
				sum3+= origin[i][x]*Sinc_interpolation[2][l+M_sample-1];
			}
			ori_QuartPixel_interp[i][4*j+1]=int(sum1);
		    ori_QuartPixel_interp[i][4*j+2]=int(sum2);
		    ori_QuartPixel_interp[i][4*j+3]=int(sum3);
		    sum1=sum2=sum3=0;
		}

}

void CTestView::Vertical_Sinc_interpolation()
{
	int  i,j,x;
	int l;
	double sum=0;
 
	//1/4像素插值
	double sum1,sum2,sum3;
	sum1=sum2=sum3=0;
	
	//申请空间,初始化四分之一像素插值数组
	ori_QuartPixel_interp1=new int* [MyHeight*4];
 	for(i=0;i<MyHeight*4;i++)
 	   ori_QuartPixel_interp1[i]=new int [MyWidth];
	for(i=0;i<MyHeight;i++)
       for(j=0;j<MyWidth;j++)
 	  {  ori_QuartPixel_interp1[i*4][j] = origin[i][j];}
	
	  for(i=0;i<MyWidth;i++)
		for(j=0;j<MyHeight;j++)
 		{
			for(l=-M_sample+1;l<=M_sample;l++)
			{
				x=j+l;			   
				if( x<0 )
				{ x=-x;}
				if(x>MyHeight-1)
				{x=((MyHeight-1)*2-x);}
				//sum1+= origin[x][i]*sin(PI*(0.25-l))/(PI*(0.25-l));

⌨️ 快捷键说明

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