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

📄 小波变换view.cpp

📁 实现图像压缩功能。这个程序是从网上下载来的
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					Ld[3]=0.005386388754/(double)sqrt((double)(2));	Ld[4]=0.069490465911/(double)sqrt((double)(2));	Ld[5]=-0.038493521263/(double)sqrt((double)(2));
					Ld[6]=-0.073462508761/(double)sqrt((double)(2));	Ld[7]=0.515398670374/(double)sqrt((double)(2));	Ld[8]=1.099106630537/(double)sqrt((double)(2));
					Ld[9]=0.680745347190/(double)sqrt((double)(2));	Ld[10]=-0.086653615406/(double)sqrt((double)(2));	Ld[11]=-0.202648655286/(double)sqrt((double)(2));
					Ld[12]=0.010758611751/(double)sqrt((double)(2));	Ld[13]=0.044823623042/(double)sqrt((double)(2));	Ld[14]=-0.000766690896/(double)sqrt((double)(2));
					Ld[15]=-0.004783458512/(double)sqrt((double)(2));
					m_wavetransform.m_preoffset=8;
					m_wavetransform.m_aftoffset=7;
					break;
				case 18:
					Ld[0]=0.001512487309/(double)sqrt((double)(2));	Ld[1]=-0.000669141509/(double)sqrt((double)(2));	Ld[2]=-0.014515578553/(double)sqrt((double)(2));
					Ld[3]=0.012528896242/(double)sqrt((double)(2));	Ld[4]=0.087791251554/(double)sqrt((double)(2));	Ld[5]=-0.025786445930/(double)sqrt((double)(2));
					Ld[6]=-0.270893783503/(double)sqrt((double)(2));	Ld[7]=0.049882830959/(double)sqrt((double)(2));	Ld[8]=0.873048407349/(double)sqrt((double)(2));
					Ld[9]=1.015259790832/(double)sqrt((double)(2));	Ld[10]=0.337658923602/(double)sqrt((double)(2));	Ld[11]=-0.077172161097/(double)sqrt((double)(2));
					Ld[12]=0.000825140929/(double)sqrt((double)(2));	Ld[13]=0.042744433602/(double)sqrt((double)(2));	Ld[14]=-0.016303351226/(double)sqrt((double)(2));
					Ld[15]=-0.018769396836/(double)sqrt((double)(2));	Ld[16]=0.000876502539/(double)sqrt((double)(2));	Ld[17]=0.001981193736/(double)sqrt((double)(2));
					m_wavetransform.m_preoffset=8;
					m_wavetransform.m_aftoffset=9;
					break;
				case 20:
					Ld[0]=0.001089170447/(double)sqrt((double)(2));	Ld[1]=0.000135245020/(double)sqrt((double)(2));	Ld[2]=-0.012220642630/(double)sqrt((double)(2));
					Ld[3]=-0.002072363923/(double)sqrt((double)(2));	Ld[4]=0.064950924579/(double)sqrt((double)(2));	Ld[5]=0.016418869426/(double)sqrt((double)(2));
					Ld[6]=-0.225558972234/(double)sqrt((double)(2));	Ld[7]=-0.100240215031/(double)sqrt((double)(2));	Ld[8]=0.667071338154/(double)sqrt((double)(2));
					Ld[9]=1.088251530500/(double)sqrt((double)(2));	Ld[10]=0.542813011213/(double)sqrt((double)(2));	Ld[11]=-0.050256540092/(double)sqrt((double)(2));
					Ld[12]=-0.045240772218/(double)sqrt((double)(2));	Ld[13]=0.070703567550/(double)sqrt((double)(2));	Ld[14]=0.008152816799/(double)sqrt((double)(2));
					Ld[15]=-0.028786231926/(double)sqrt((double)(2));	Ld[16]=-0.001137535314/(double)sqrt((double)(2));	Ld[17]=0.006495728375/(double)sqrt((double)(2));
					Ld[18]=0.000080661204/(double)sqrt((double)(2));	Ld[19]=-0.000649589896/(double)sqrt((double)(2));
					m_wavetransform.m_preoffset=9;
					m_wavetransform.m_aftoffset=10;
					break;
				}
			}
			break;
		case 7://IDC_COIFLETS
			Ld[0]=-0.0802861503271*(double)sqrt((double)(2));	Ld[1]=-0.0243085969067*(double)sqrt((double)(2));	Ld[2]=0.362806341593*(double)sqrt((double)(2));
			Ld[3]=0.550576616156*(double)sqrt((double)(2));	Ld[4]=0.229036357075*(double)sqrt((double)(2));	Ld[5]=-0.0644368523121*(double)sqrt((double)(2));
			Ld[6]=-0.0115565483406*(double)sqrt((double)(2));	Ld[7]=0.0381688330633*(double)sqrt((double)(2));
			m_wavetransform.m_preoffset=3;
			m_wavetransform.m_aftoffset=4;
			break;
		}
		for(int i=0;i<FWidth;i++)
		{
			Hd[i]=(double)pow((double)-1,(double)(i+1))*Ld[-i-1+FWidth];
		}
		for(int i=0;i<FWidth;i++)
		{
			Lr[i]=Ld[-i-1+FWidth];
			Hr[i]=Hd[-i-1+FWidth];
		}			
	}	
	pDoc->UpdateAllViews(NULL);
	EndWaitCursor();
}

void CMyView::OnCompression() 
{
	// TODO: Add your command handler code here
	BeginWaitCursor();
	CMyDoc* pDoc = GetDocument();
	LPSTR	lpDIB;	
	// 指向DIB象素指针
	LPSTR    lpDIBBits;	
	// 锁定DIB
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());	
	// 找到DIB图像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIB);
	CWaveletLevel leveldlg;
	if(leveldlg.DoModal()==IDOK)
	{
		m_nLevel=leveldlg.m_nlevel;
		//分解
		m_wavetransform.DIBWavelet(lpDIB,lpDIBBits,Ld,Hd,FWidth,m_nLevel);
		pDoc->SetModifiedFlag(TRUE);
		pDoc->UpdateAllViews(NULL);
	}
	// 解除锁定
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());	
	EndWaitCursor();
}

void CMyView::OnQuantization() 
{
	// TODO: Add your command handler code here
	CMyDoc* pDoc = GetDocument();
	LPSTR	lpDIB;	
	// 指向DIB象素指针
	LPSTR    lpDIBBits;	
	// 锁定DIB
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());	
	// 找到DIB图像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIB);				
	//量化
	int* m_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);// 计算图像每行的字节数	
		CQuantizationDlg dlg;
		dlg.m_level=new double[256];	
		for(i=0;i<256;i++)
			dlg.m_level[i]=0;
		dlg.m_levelmax=0;
		// 从源图像中读取数据。
		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);
				dlg.m_level[int(dTemp)]++;
			}
		}
		CString str;		
		str.Format("%d",int(m_wavetransform.m_GrayMax));
		dlg.m_coifmax=str;
		str.Format("%d",int(m_wavetransform.m_GrayMin));
		dlg.m_coifmin=str;
		dlg.m_graymin=m_wavetransform.m_GrayMin;
		dlg.m_graymax=m_wavetransform.m_GrayMax;	
		for(i=0;i<256;i++)
		{
			dlg.m_level[i]/=(FLOAT(lWidth*lHeight));
			dlg.m_levelmax=dlg.m_levelmax>dlg.m_level[i]?dlg.m_levelmax:dlg.m_level[i];			
		}//以上为绘制灰度直方图	
		if(dlg.DoModal()==IDOK)
		{	
			m_thredhold=new int;
			*m_thredhold=abs(dlg.m_quantization);
			m_wavetransform.DIBQuantize(lpDIB,lpDIBBits,m_thredhold);
			pDoc->SetModifiedFlag(TRUE);
			pDoc->UpdateAllViews(NULL);
			delete m_thredhold;
		}
	}
	else
	{
		CQuantizeColorDlg dlg;
		dlg.m_level=new double[256*3];
		for(i=0;i<256*3;i++)
			dlg.m_level[i]=0;
		dlg.m_levelmax[0]=0;
		dlg.m_levelmax[1]=0;
		dlg.m_levelmax[2]=0;
		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);	
					dlg.m_level[256*ncolor+int(dTemp)]++;
				}
			}
		}
		CString str;			
		str.Format("%d",int(m_wavetransform.m_ColorMax[0]));
		dlg.m_bluemax=str;
		str.Format("%d",int(m_wavetransform.m_ColorMin[0]));
		dlg.m_bluemin=str;
		str.Format("%d",int(m_wavetransform.m_ColorMax[1]));
		dlg.m_greenmax=str;
		str.Format("%d",int(m_wavetransform.m_ColorMin[1]));
		dlg.m_greenmin=str;
		str.Format("%d",int(m_wavetransform.m_ColorMax[2]));
		dlg.m_redmax=str;
		str.Format("%d",int(m_wavetransform.m_ColorMin[2]));
		dlg.m_redmin=str;
		for(i=0;i<3;i++)
		{
			dlg.m_colormin[i]=m_wavetransform.m_ColorMin[i];
			dlg.m_colormax[i]=m_wavetransform.m_ColorMax[i];
		}			
		for(ncolor=0;ncolor<3;ncolor++)
		{
			for(i=0;i<256;i++)
			{				
				dlg.m_level[256*ncolor+i]/=(FLOAT(lWidth*lHeight));
				dlg.m_levelmax[ncolor]=dlg.m_levelmax[ncolor]>dlg.m_level[256*ncolor+i]?dlg.m_levelmax[ncolor]:dlg.m_level[256*ncolor+i];
			}
		}//以上为绘制真彩色直方图	
		if(dlg.DoModal()==IDOK)
		{	
			m_thredhold=new int[3];
			m_thredhold[0]=abs(dlg.m_blue);
			m_thredhold[1]=abs(dlg.m_green);
			m_thredhold[2]=abs(dlg.m_red);
			m_wavetransform.DIBQuantize(lpDIB,lpDIBBits,m_thredhold);
			pDoc->SetModifiedFlag(TRUE);
			pDoc->UpdateAllViews(NULL);
			delete m_thredhold;
		}
	}
	// 解除锁定
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());	
}

void CMyView::OnEncoding() 
{
	// TODO: Add your command handler code here
	CMyDoc* pDoc = GetDocument();
	LPSTR	lpDIB;	
	// 指向DIB象素指针
	LPSTR    lpDIBBits;	
	// 锁定DIB
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());	
	// 找到DIB图像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIB);				
	//编码
	double *m_level;//保存各个灰度级的频率
	double dTemp;
	unsigned char*	lpSrc;// 指向源图像的指针		
	LONG	lLineBytes;	// 图像每行的字节数	
	LONG lWidth,lHeight;
	lWidth=::DIBWidth(lpDIB);
	lHeight=::DIBHeight(lpDIB);
	LONG i,j;//循环变量	
	BeginWaitCursor();
	if(::DIBNumColors(lpDIB)==256)
	{
		lLineBytes = WIDTHBYTES(lWidth * 8);// 计算图像每行的字节数	
		m_level=new double[256];	
		for(i=0;i<256;i++)
			m_level[i]=0;
		// 从源图像中读取数据。
		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);
				m_level[int(dTemp)]++;
			}
		}
		for(i=0;i<256;i++)
		{
			m_level[i]/=(FLOAT(lWidth*lHeight));			
		}
		// 创建对话框
		CHaffmanDlg dlgPara;		
		// 初始化变量值
		dlgPara.m_fFreq = m_level;
		dlgPara.m_iColorNum = 256;		
		// 显示对话框
		dlgPara.DoModal();
		delete m_level;
	}
	else
	{
		m_level=new double[256*3];
		for(i=0;i<256*3;i++)
			m_level[i]=0;
		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);	
					m_level[256*ncolor+int(dTemp)]++;
				}
			}
		}
		for(ncolor=0;ncolor<3;ncolor++)
		{
			for(i=0;i<256;i++)
			{				
				m_level[256*ncolor+i]/=(FLOAT(lWidth*lHeight*3));
			}
		}
		//将具有相同灰度级的红、绿、蓝通道的频率加起来作为这一灰度级的频率进行编码。
		for(i=0;i<256;i++)
		{				
			m_level[i]+=m_level[256+i];
			m_level[i]+=m_level[256*2+i];
		}
		// 创建对话框
		CHaffmanDlg dlgPara;		
		// 初始化变量值
		dlgPara.m_fFreq = m_level;
		dlgPara.m_iColorNum = 256;
		// 显示对话框
		dlgPara.DoModal();
		delete m_level;
	}
	EndWaitCursor();
	// 解除锁定
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
}

void CMyView::OnDecoding() 
{
	// TODO: Add your command handler code here
	CMyDoc* pDoc = GetDocument();
	LPSTR	lpDIB;	
	// 指向DIB象素指针
	LPSTR    lpDIBBits;	
	// 锁定DIB
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());	
	// 找到DIB图像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIB);				
	//解码
	//实现过程

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

void CMyView::OnDiscompression() 
{
	// TODO: Add your command handler code here
	CMyDoc* pDoc = GetDocument();
	LPSTR	lpDIB;	
	// 指向DIB象素指针
	LPSTR    lpDIBBits;	
	// 锁定DIB
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());	
	// 找到DIB图像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIB);
	//重建
	m_wavetransform.DIBDisWavelet(lpDIB,lpDIBBits,Lr,Hr,FWidth,m_nLevel);
	pDoc->SetModifiedFlag(TRUE);
	pDoc->UpdateAllViews(NULL);
	// 解除锁定
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());	
}

⌨️ 快捷键说明

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