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

📄 fractal.cpp

📁 这是用提升小波变换与嵌入零树编码实现的256色灰度BMP图像压缩与解压缩的程序。
💻 CPP
字号:
// Fractal.cpp: implementation of the CFractal class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "decompress.h"
#include "Fractal.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CFractal::CFractal()
{
	
}

//Range矩阵的赋值
CFractal::CFractal(int **R)
{
	Range=R;
	flag=0;  //标志默认为0,即4*4的矩阵块
}

CFractal::~CFractal()
{

}

//Domain矩阵
void CFractal::DomainJuZhen()
{
	if(flag==0)  //4*4的矩阵块
	{
	   xChaZhi=4;
	   yChaZhi=4;//一般xChaZhi与yChaZhi相等
	}
	else    //2*2的矩阵块
	{
		xChaZhi=2;
		yChaZhi=2;
	}

	int i,j;
	Domain=new int*[xChaZhi];
	for(i=0;i<xChaZhi;i++)
		Domain[i]=new int[yChaZhi];
	TempDomain=new int*[xChaZhi];
	for(i=0;i<xChaZhi;i++)
		TempDomain[i]=new int[yChaZhi];
	CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;
	CDecompressDoc *pCurrentDoc=(CDecompressDoc *)pMain->GetActiveDocument();
	for(i=0;i<xChaZhi;i++)
	{
		for(j=0;j<yChaZhi;j++)
		{
			TempDomain[i][j]=Domain[i][j]=pCurrentDoc->Coefficient[lx+i][ly+j];
		}
	}
}

//求匹配误差
float CFractal::JiShuangWuCha(float* aa,float* gg)
{
	float N=xChaZhi*yChaZhi;
	int i,j;
	double sum=0;
	double temp;
	*aa=JiShuangA();
	*gg=JiShuangG();
	for(i=0;i<xChaZhi;i++)
	{
		for(j=0;j<yChaZhi;j++)
		{
			temp=a*Domain[i][j]+g-Range[i][j];
			temp=pow(temp,2);
			sum+=temp;
		}
	}
    float WuCha=sum/N;
	return WuCha;
}

//计算对比度因子a
float CFractal::JiShuangA()
{
	int N=xChaZhi*yChaZhi;
    long int temp=RangeDomainSum();
	temp=N*temp;
	long int R=RangeSum();
	long int D=DomainSum();
	temp=temp-R*D;
	long int DDtemp=N*DomainDomainSum();
	long int Dtemp=pow(DomainSum(),2);
	DDtemp=DDtemp-Dtemp;
    float a=temp/DDtemp;
	return a;
}

//计算亮度偏移因子
float CFractal::JiShuangG()
{
	float N=xChaZhi*yChaZhi;
	long int R=RangeSum();
	long int D=DomainSum()*JiShuangA();
	long int temp=R-D;
	float g=temp/N;
	return g;
}

//求Range和Domain各项乘积的和
long int CFractal::RangeDomainSum()
{
	long int sum=0;
	int i,j;
	for(i=0;i<xChaZhi;i++)
		for(j=0;j<yChaZhi;j++)
			sum+=Range[i][j]*Domain[i][j];
    return sum;
}

//求Range各项之和
long int CFractal::RangeSum()
{
	long int sum=0;
	int i,j;
	for(i=0;i<xChaZhi;i++)
		for(j=0;j<yChaZhi;j++)
			sum+=Range[i][j];
    return sum;
}

//求Domain各项之和
long int CFractal::DomainSum()
{
	long int sum=0;
	int i,j;
	for(i=0;i<xChaZhi;i++)
		for(j=0;j<yChaZhi;j++)
			sum+=Domain[i][j];
    return sum;
}
////求Domain与Domain各项乘积之和
long int CFractal::DomainDomainSum()
{
	long int sum=0;
	int i,j;
	for(i=0;i<xChaZhi;i++)
		for(j=0;j<yChaZhi;j++)
			sum+=pow(Domain[i][j],2);
    return sum;
}

float CFractal::BianHuan0(float* aa,float* gg)  //变换0:旋转0度
{
	return JiShuangWuCha(aa,gg);
}

float CFractal::BianHuan1(float* aa,float* gg)  //变换1:X轴方向旋转180度
{
	int i,j;
	for(i=0;i<xChaZhi;i++)
	{
		for(j=0;j<yChaZhi;j++)
		{
			Domain[i][j]=TempDomain[xChaZhi-i-1][j];
		}
	}
	return JiShuangWuCha(aa,gg);
}

float CFractal::BianHuan2(float* aa,float* gg)  //变换2:Y轴方向旋转180度
{
	int i,j;
	for(i=0;i<xChaZhi;i++)
	{
		for(j=0;j<yChaZhi;j++)
		{
			Domain[i][j]=TempDomain[i][yChaZhi-j-1];
		}
	}
	return JiShuangWuCha(aa,gg);
}

float CFractal::BianHuan3(float* aa,float* gg)  //变换3:旋转180度
{
	int i,j;
	for(i=0;i<xChaZhi;i++)
	{
		for(j=0;j<yChaZhi;j++)
		{
			Domain[i][j]=TempDomain[xChaZhi-i-1][yChaZhi-j-1];
		}
	}
	return JiShuangWuCha(aa,gg);
}

float CFractal::BianHuan4(float* aa,float* gg)  //变换4:旋转到与y=x直线对称
{
	int i,j;
	for(i=0;i<xChaZhi;i++)
	{
		for(j=0;j<yChaZhi;j++)
		{
			Domain[i][j]=TempDomain[j][i];
		}
	}
	return JiShuangWuCha(aa,gg);
}

float CFractal::BianHuan5(float* aa,float* gg)   //变换5:逆时针90度旋转
{
	int i,j;
	for(i=0;i<xChaZhi;i++)
	{
		for(j=0;j<yChaZhi;j++)
		{
			Domain[i][j]=TempDomain[yChaZhi-j-1][i];
		}
	}
	return JiShuangWuCha(aa,gg);
}

float CFractal::BianHuan6(float* aa,float* gg)  //变换6:逆时针270度旋转
{
	int i,j;
	for(i=0;i<xChaZhi;i++)
	{
		for(j=0;j<yChaZhi;j++)
		{
			Domain[i][j]=TempDomain[j][xChaZhi-i-1];
		}
	}
	return JiShuangWuCha(aa,gg);
}

float CFractal::BianHuan7(float* aa,float* gg)  //变换7:旋转至与y=-x直线对称
{
	int i,j;
	for(i=0;i<xChaZhi;i++)
	{
		for(j=0;j<yChaZhi;j++)
		{
			Domain[i][j]=TempDomain[yChaZhi-j-1][xChaZhi-i-1];
		}
	}
	return JiShuangWuCha(aa,gg);
}

float CFractal::FindMinWuCha()
{
	float a0,g0;
	float a1,g1;
	float a2,g2;
	float a3,g3;
	float a4,g4;
	float a5,g5;
	float a6,g6;
	float a7,g7;
	float MinWuCha=BianHuan0(&a0,&g0);
	a=a0;
	g=g0;
	BhJuZhen=0;
	if(MinWuCha>BianHuan1(&a1,&g1))
	{
		MinWuCha=BianHuan1(&a1,&g1);
		a=a1;
		g=g1;
		BhJuZhen=1;
	}
	else if(MinWuCha>BianHuan2(&a2,&g2))
	{
		MinWuCha=BianHuan2(&a2,&g2);
		a=a2;
		g=g2;
		BhJuZhen=2;
	}
	else if(MinWuCha>BianHuan3(&a3,&g3))
	{
		MinWuCha=BianHuan3(&a3,&g3);
		a=a3;
		g=g3;
		BhJuZhen=3;
	}
	else if(MinWuCha>BianHuan4(&a4,&g4))
	{
		MinWuCha=BianHuan4(&a4,&g4);
		a=a4;
		g=g4;
		BhJuZhen=4;
	}
	else if(MinWuCha>BianHuan5(&a5,&g5))
	{
		MinWuCha=BianHuan5(&a5,&g5);
		a=a5;
		g=g5;
		BhJuZhen=5;
	}
	else if(MinWuCha>BianHuan6(&a6,&g6))
	{
		MinWuCha=BianHuan6(&a6,&g6);
		a=a6;
		g=g6;
		BhJuZhen=6;
	}
	else if(MinWuCha>BianHuan7(&a7,&g7))
	{
		MinWuCha=BianHuan7(&a7,&g7);
		a=a7;
		g=g7;
		BhJuZhen=7;
	}
	return MinWuCha;
}

⌨️ 快捷键说明

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