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

📄 liftingschemeview.cpp

📁 正交变换.rar文件压缩的基础知识无毒good
💻 CPP
📖 第 1 页 / 共 3 页
字号:
					var=var+g[k]*tmp[(abs(i+k-(g0-1))-(ln_g-1)%2)*ww+j];
				else
					var=var+g[k]*tmp[(i+k-(g0-1))*ww+j];
			}
			tmp[i*ww+j+ww/2]=var;
		}
		for(i=g0-1;i<hh-(ln_g-g0);i++)
		{
			var=0;
			for(k=0;k<ln_g;k++)
				var=var+g[k]*tmp[(i+k-(g0-1))*ww+j];
			tmp[i*ww+j+ww/2]=var;
		}
		for(i=hh-(ln_g-g0);i<hh;i++)
		{
			var=0;
			for(k=0;k<ln_g;k++)
			//	var=var+g[k]*tmp[(2*hh-(i+k-(g0-1))-2+(ln_g-1)%2)*ww+j];
			{
				if((i+k-g0+1)<hh)
				var=var+g[k]*tmp[(i+k-g0+1)*ww+j];
				else
					var=var+g[k]*tmp[(2*hh-(i+k-g0+1)-2+(ln_g-1)%2)*ww+j];}
			tmp[i*ww+j+ww/2]=var;
		}
	}//return tmp;

	for(i=0;i<hh/2;i++)
		for(j=0;j<ww/2;j++)
		{
			if(Low)
				resultImage[i*(ww/2)+j]=tmp[2*i*ww+j+ww/2];
			else
				resultImage[(i+hh/2)*(ww/2)+j]=tmp[2*i*ww+j+ww/2];
		}
//计算LL HH
	for(j=0;j<ww/2;j++)
	{
		for(i=0;i<h0-1;i++)
		{
			var=0;
			for(k=0;k<ln_h;k++)
			//	var=var+h[k]*tmp[(abs(i+k-(h0-1))-(ln_h-1)%2)*ww+j];
			{
					if((i+k-(h0-1)<0))
					var=var+h[k]*tmp[(abs(i+k-(h0-1))-(ln_h-1)%2)*ww+j];
				else
					var=var+h[k]*tmp[(i+k-(h0-1))*ww+j];
			}
			tmp[i*ww+j+ww/2]=var;
		}
		for(i=h0-1;i<hh-(ln_h-h0);i++)
		{
			var=0;
			for(k=0;k<ln_h;k++)
				var=var+h[k]*tmp[(i+k-(h0-1))*ww+j];
			tmp[i*ww+j+ww/2]=var;
		}
		for(i=hh-(ln_h-h0);i<hh;i++)
		{
			var=0;
			for(k=0;k<ln_h;k++)
			{
				if((i+k-h0+1)<hh)
				var=var+h[k]*tmp[(i+k-h0+1)*ww+j];//(2*hh-(i+k-(h0-1))-2+(ln_h-1)%2)
				else
				var=var+h[k]*tmp[(2*hh-(i+k-h0+1)-2+(ln_h-1)%2)*ww+j];
			}
			tmp[i*ww+j+ww/2]=var;
		}
	}//return tmp;
   
	for(i=hh/2;i<hh;i++)
		for(j=0;j<ww/2;j++)
		{
			if(Low)
				resultImage[i*(ww/2)+j]=tmp[2*(i-hh/2)*ww+j+ww/2];
			else
				resultImage[(i-hh/2)*(ww/2)+j]=tmp[2*(i-hh/2)*ww+j+ww/2];
		}
//	DisplayImage(m_orgWidth/2,m_orgHeight,0,resultImage);
	return resultImage;
}

void CLiftingschemeView::DisplayInfoBox(char tp[], int level, char method[], long timespan,BOOL ReCon)
{
		CInfo InfoDlg;
		char *buffer=new char[10];
		InfoDlg.m_Info_wavelet=tp;
		_itoa(level,buffer,10);
		InfoDlg.m_Info_level=buffer;
		InfoDlg.m_Info_method="Mallat";
		_itoa(timespan,buffer,10);
		InfoDlg.m_Info_time=buffer;
		InfoDlg.m_Info_Image=m_szFileName;
		_itoa(m_orgWidth,buffer,10);
		InfoDlg.m_Info_width=buffer;
		_itoa(m_orgHeight,buffer,10);
		InfoDlg.m_Info_height=buffer;
		if(ReCon)
		{
			double Pnsr1;
			Pnsr1=PNSR(m_pImageData,ReconImage,m_orgWidth,m_orgHeight);
			char TempString[10];
			sprintf(TempString,"%6.2f",Pnsr1);
				
			InfoDlg.m_Info_pnsr=TempString;
			
		}
		
		InfoDlg.DoModal();
}

void CLiftingschemeView::Reconstruct2(double Hi_R[], int Hi_R0, int Hi_R_l, double Lo_R[], int Lo_R0, int Lo_R_l, double *Image, long www, long hhh, int level, char tp[], BOOL disp)
{
	long ww,hh;int i,j,loop;
	int shrink=0;
	ReconImage=new double[(www-2*shrink)*(hhh-2*shrink)];
	double *tmp;//=new double[www*hhh];
	double *tmp2=new double[www*hhh];
	long timespan=0;
	loop=level;
	for(loop;loop>0;loop--)
	{
		ww=www>>(loop-1);
		hh=hhh>>(loop-1);
		long t1=GetTickCount();
		tmp=new double[ww*hh];
		tmp=RealReconstruct2(Hi_R,Hi_R0,Hi_R_l,Lo_R,Lo_R0,Lo_R_l,Image,www,hhh,loop);
		t1=GetTickCount()-t1;
		timespan=timespan+t1;
		for(i=hhh-hh;i<hhh;i++)
			for(j=0;j<ww;j++)
				Image[i*www+j]=tmp[(i+hh-hhh)*ww+j];//[i*www+j]=tmp[i*ww+j];ReconImagetmp2
		delete[] tmp;
		}
//	delete[]tmp;

//////动态范围调整//////////
	double mx=-3000;double mn=3000;
	for(i=0+shrink;i<www-shrink;i++)
		for(j=0+shrink;j<hhh-shrink;j++)
		{
			if(Image[i*www+j]>mx)
				mx=Image[i*www+j];
			if(Image[i*www+j]<mn)
				mn=Image[i*www+j];
		}
	for(i=0+shrink;i<www-shrink;i++)
		for(j=0+shrink;j<hhh-shrink;j++)
		ReconImage[(i-shrink)*(www-2*shrink)+j-shrink]=(Image[i*www+j]-mn)*255/(mx-mn);
		//delete[]tmp2;
///////////////动态范围调整结束////////////////

	DisplayImage(www-2*shrink,hhh-2*shrink,0,FALSE,ReconImage);//ReconImage
	if(disp)
		DisplayInfoBox(tp,level,"Mallat",timespan,TRUE);
}

double* CLiftingschemeView::RealReconstruct2(double Hi_R[], int Hi_R0, int Hi_R_l, double Lo_R[], int Lo_R0, int Lo_R_l, double *Image, long www, long hhh, int loop)
{
		long ww,hh;
	ww=www>>loop;
	hh=hhh>>loop;
	//BYTE *tmp=new BYTE[ww*hh*4];
	double *tmp1=new double[ww*hh*4];//=;NULL
	double *tmp2=new double[ww*hh*4];
	double *tmp3=new double[ww*hh*4];
	double *tmp4=new double[ww*hh*4];
	double *subImage=new double[ww*hh*4];
	int i,j;
	tmp1=SubReconstruct2(Lo_R,Lo_R0,Lo_R_l,Lo_R,Lo_R0,Lo_R_l,Image,ww,hh,LL);

	tmp2=SubReconstruct2(Lo_R,Lo_R0,Lo_R_l,Hi_R,Hi_R0,Hi_R_l,Image,ww,hh,LH);//
	tmp3=SubReconstruct2(Hi_R,Hi_R0,Hi_R_l,Lo_R,Lo_R0,Lo_R_l,Image,ww,hh,HL);//
	tmp4=SubReconstruct2(Hi_R,Hi_R0,Hi_R_l,Hi_R,Hi_R0,Hi_R_l,Image,ww,hh,HH);
/*double maxx2=-2000,minn2=2000;
	for(i=0;i<2*hh;i++)
		for(j=0;j<2*ww;j++)
		{
			if(tmp2[i*(2*ww)+j]<minn2)
				minn2=tmp2[i*(2*ww)+j];
			if(tmp2[i*(2*ww)+j]>maxx2)
				maxx2=tmp2[i*(2*ww)+j];
		}
		double maxx1=-2000, minn1=2000;
	for(i=0;i<2*hh;i++)
		for(j=0;j<2*ww;j++)
		{
			if(tmp1[i*(2*ww)+j]<minn1)
				minn1=tmp1[i*(2*ww)+j];
			if(tmp1[i*(2*ww)+j]>maxx1)
				maxx1=tmp1[i*(2*ww)+j];
		}*/

	for(i=0;i<2*hh;i++)
		for(j=0;j<2*ww;j++)
            subImage[i*(2*ww)+j]=tmp1[i*(2*ww)+j]+tmp4[i*(2*ww)+j]+tmp2[i*(2*ww)+j]+tmp3[i*(2*ww)+j];//tmp1[i*(2*ww)+j]+;//+tmp2[i*(2*ww)+j];//+tmp3[i*(2*ww)+j]+tmp4[i*(2*ww)+j];
	/*double maxx,minn;
		maxx=-2000;minn=2000;
	for(i=0;i<2*hh;i++)
		for(j=0;j<2*ww;j++)
		{
			if(subImage[i*(2*ww)+j]>maxx)
				maxx=subImage[i*(2*ww)+j];
			if(subImage[i*(2*ww)+j]<minn)
				minn=subImage[i*(2*ww)+j];
		}
	for(i=0;i<2*hh;i++)
		for(j=0;j<2*ww;j++)
            tmp1[i*(2*ww)+j]=(subImage[i*(2*ww)+j]-minn)*255.0/(maxx-minn);
		delete[]tmp2;
		delete[]tmp3;
		delete[]tmp4;
*/
//	DisplayImage(ww*2,hh*2,256,FALSE,subImage);//tmp1
	//MessageBox("subRec");

	return subImage;//tmp1

}

double* CLiftingschemeView::SubReconstruct2(double Lo_R[], int Lo_R0, int Lo_R_l, double Hi_R[], int Hi_R0, int Hi_R_l, double *Image, long ww, long hh, int p)
{

	int x,y,i,j,k;double var;
	if(p==LL){x=1;y=0;}
	if(p==LH){x=0;y=0;}
	if(p==HL){x=1;y=1;}
	if(p==HH){x=0;y=1;}
	double *tmp1=new double[ww*hh*2];
	double *tmp11=new double[ww*hh*2];
	double *tmp2=new double[ww*hh*4];
	double *result=new double[ww*hh*4];
//	BYTE *tp=new BYTE[ww*hh];
/////////////////	
	for(i=0;i<hh;i++)
		for(j=0;j<ww;j++)
		{///要重构的区域
		//	tp[i*ww+j]=Image[(i+m_orgHeight-2*hh+x*hh)*m_orgWidth+j+y*ww];
			tmp1[2*i*ww+j]=Image[(i+m_orgHeight-2*hh+x*hh)*m_orgWidth+j+y*ww];
			tmp1[(2*i+1)*ww+j]=0;
		}
		//DisplayImage(ww,hh,0,FALSE,tp);
	/*	MessageBox("special");
		for(i=0;i<hh;i++)
		for(j=0;j<ww;j++)
		{
			Image[(i+m_orgHeight-2*hh+x*hh)*m_orgWidth+j+y*ww]=255;
		}
		DisplayImage(m_orgWidth,m_orgWidth,0,FALSE,Image);
	MessageBox("upsample");
		DisplayImage(ww,hh*2,0,FALSE,tmp1);*/
		
//////////////第一次上采样结束,列////
//////列卷积

	for(j=0;j<ww;j++)
	{
	
		for(i=0;i<Hi_R0-1;i++)
		{
			var=0;
			for(k=0;k<Hi_R_l;k++)
				//var=var+Hi_R[k]*tmp1[(abs(i+k-(Hi_R0-1))-(Hi_R_l-1)%2)*ww+j];
			{	if( (i+k-(Hi_R0-1))<0 )
					var=var+Hi_R[k]*tmp1[(abs(i+k-(Hi_R0-1))-(Hi_R_l-1)%2)*ww+j];
				else
					var=var+Hi_R[k]*tmp1[(i+k-(Hi_R0-1))*ww+j];
			}
					
			tmp11[i*ww+j]=var;
		}
	
		for(i=Hi_R0-1;i<2*hh-(Hi_R_l-Hi_R0);i++)
		{
			var=0;
			for(k=0;k<Hi_R_l;k++)
				var=var+Hi_R[k]*tmp1[(i+k-(Hi_R0-1))*ww+j];
		
			tmp11[i*ww+j]=var;
		}
		for(i=2*hh-(Hi_R_l-Hi_R0);i<2*hh;i++)
		{
			var=0;
			for(k=0;k<Hi_R_l;k++)
				//var=var+Hi_R[k]*tmp1[(4*hh-(i+k-(Hi_R0-1))-2+(Hi_R_l-1)%2)*ww+j];
			{
				if((i+k-Hi_R0+1)<2*hh)
					var=var+Hi_R[k]*tmp1[(i+k-Hi_R0+1)*ww+j];//(2*hh-(i+k-(h0-1))-2+(ln_h-1)%2)
				else
					var=var+Hi_R[k]*tmp1[(4*hh-(i+k-Hi_R0+1)-2+(Hi_R_l-1)%2)*ww+j];
			}
			
			
			tmp11[i*ww+j]=var;
		}
	}
	////第二次上采样,行////////
		for(j=0;j<ww;j++)
			for(i=0;i<(2*hh);i++)
			{
				tmp2[i*2*ww+2*j]=tmp11[i*ww+j];
				tmp2[i*2*ww+2*j+1]=0;
			}
		//	return tmp2;
///////////////////////////////////////
////////行卷积/////
		for(i=0;i<2*hh;i++)
		{
			for(j=0;j<Lo_R0-1;j++)
			{
				var=0;
				for(k=0;k<Lo_R_l;k++)
				//	var=var+Lo_R[k]*tmp2[i*2*ww+abs(j+k-(Lo_R0-1))-(Lo_R_l-1)%2];
				{
					if( (j+k-(Lo_R0-1))<0 )
					var=var+Lo_R[k]*tmp2[i*2*ww+abs(j+k-(Lo_R0-1))-(Lo_R_l-1)%2];
				else
					var=var+Lo_R[k]*tmp2[i*ww+j+k-(Lo_R0-1)];
			
				}
				result[i*ww*2+j]=var;
			}
		
			for(j=Lo_R0-1;j<2*ww-(Lo_R_l-Lo_R0);j++)
			{
				var=0;
				for(k=0;k<Lo_R_l;k++)
					var=var+Lo_R[k]*tmp2[i*2*ww+j+k-(Lo_R0-1)];
				result[i*ww*2+j]=var;
			}
			for(j=2*ww-(Lo_R_l-Lo_R0);j<2*ww;j++)
			{
				var=0;
				for(k=0;k<Lo_R_l;k++)
				//	var=var+Lo_R[k]*tmp2[i*2*ww+4*ww-(j+k-(Lo_R0-1))-2+(Lo_R_l-1)%2];
				{if((j+k-Lo_R0+1)<2*ww)
				var=var+Lo_R[k]*tmp2[(j+k-Lo_R0+1)*2*ww+j];//(2*hh-(i+k-(h0-1))-2+(ln_h-1)%2)
				else
					var=var+Lo_R[k]*tmp2[(4*ww-(j+k-Lo_R0+1)-2+(Lo_R_l-1)%2)*2*ww+j];}
			
				result[i*ww*2+j]=var;
			}
		}	

	delete[]tmp2;
	delete[]tmp1;
	delete[]tmp11;
	return result;
}



double  CLiftingschemeView::PNSR(BYTE *orgImage, double *reImage, long w, long h)
{
	int i,j;
	double sum=0;
	double pnsr=0;
	double maxx=0;
	for(i=0;i<h;i++)
		for(j=0;j<w;j++)
		{
			if(orgImage[i*w+j]>maxx)
				maxx=orgImage[i*w+j];
			sum=sum+(orgImage[i*w+j]-reImage[i*w+j])*(orgImage[i*w+j]-reImage[i*w+j]);
		}
		if(sum==0)
			return 0;
		else
		{
			pnsr=10*log10(w*h*maxx*maxx/sum);
			return pnsr;
		}

}

void CLiftingschemeView::OnTransFFT() 
{
	CChoose dlg;
	BOOL reconstruct;
	if(dlg.DoModal()==IDOK)
		reconstruct=TRUE;
	else
		reconstruct=FALSE;

    FFTtransform(m_pImageData,m_orgWidth,m_orgHeight,reconstruct);
	
}

void CLiftingschemeView::OnTransDCT() 
{
	CChoose dlg;
	BOOL reconstruct;
	if(dlg.DoModal()==IDOK)
		reconstruct=TRUE;
	else
		reconstruct=FALSE;
    DCTtransform(m_pImageData,m_orgWidth,m_orgHeight,reconstruct,0);

}

void CLiftingschemeView::FFTtransform(BYTE *Image, long ww, long hh, BOOL reconstruct)
{
	finalImage=new double[ww*hh];
	ImageToRe=new double[ww*hh];
	memset(finalImage, 0, sizeof(double) * ww* hh);
	memset(ImageToRe, 0, sizeof(double) * ww* hh);
	unsigned char *lpSrc;
	// 中间变量
	double	dTemp;
	// 循环变量
	LONG	i;
	LONG	j;
	LONG	w=1;
	LONG	h=1;
	int		wp=0;
	int		hp=0;
	LONG	lLineBytes;
	lLineBytes = WIDTHBYTES(ww * 8);
	
	// 计算进行付立叶变换的宽度和高度(2的整数次方)
	while(w * 2 <= ww)
	{
		w *= 2;
		wp++;
	}
	while(h * 2 <= hh)
	{
		h *= 2;
		hp++;
	}
	// 分配内存
	complex<double> *TD = new complex<double>[w * h];
	complex<double> *FD = new complex<double>[w * h];
	// 行
	for(i = 0; i < h; i++)
	{
		// 列
		for(j = 0; j < w; j++)
		{
			lpSrc = (unsigned char*)Image + lLineBytes * (hh - 1 - i) + j;
			TD[j + w * i] = complex<double>(*(lpSrc), 0);
		}
	}
	for(i = 0; i < h; i++)
	{
	    // 对y方向进行快速付立叶变换
		FFT(&TD[w * i], &FD[w * i], wp);
	}
	// 保存变换结果
	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
			TD[i + h * j] = FD[j + w * i];
		}
	}
	for(i = 0; i < w; i++)
	{
		// 对x方向进行快速付立叶变换
		FFT(&TD[i * h], &FD[i * h], hp);
	}
	// 行
	for(i = 0; i < h; i++)
	{
		// 列
		for(j = 0; j < w; j++)
		{
			// 计算频谱
			dTemp = sqrt(FD[j * h + i].real() * FD[j * h + i].real() + 
				         FD[j * h + i].imag() * FD[j * h + i].imag()) / 100;
			
			dTemp=(dTemp > 255)?255:dTemp;
			ImageToRe[lLineBytes * (hh - 1 - (i<h/2 ? i+h/2 : i-h/2))+ (j<w/2 ? j+w/2 : j-w/2)]=dTemp;
		}
	}

    //反变换
	for(i = 0; i < w; i++)
	{
		// 对x方向进行快速付立叶反变换
		IFFT(&FD[i * h], &TD[i * h], hp);
	}
	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
			FD[i + h * j]= TD[j + w * i];
		}
	}

⌨️ 快捷键说明

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