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

📄 intdwtdoc.cpp

📁 图像小波变换(包括提升小波变换)及SPIHT压缩解压缩程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// INTDWTDoc.cpp : implementation of the CINTDWTDoc class
//

#include "stdafx.h"
#include "INTDWT.h"
#include "Dib.h"
#include "INTDWTDoc.h"
#include "IntDwt97.h"
#include "Dwt.h"
#include "BinDwt97.h"
#include "IntDwt53.h"
#include "math.h"
#include "SPIHTCoder.h"
#include "LEVEL.h"
#include "Parameter.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CINTDWTDoc

IMPLEMENT_DYNCREATE(CINTDWTDoc, CDocument)

BEGIN_MESSAGE_MAP(CINTDWTDoc, CDocument)
	//{{AFX_MSG_MAP(CINTDWTDoc)
	ON_COMMAND(ID_EXIT, OnExit)
	ON_COMMAND(ID_INTDWT, OnIntdwt)
	ON_COMMAND(ID_INTIDWT, OnIntidwt)
	ON_COMMAND(ID_DWT, OnDwt)
	ON_COMMAND(ID_IDWT, OnIdwt)
	ON_COMMAND(ID_NSDWT, OnNsdwt)
	ON_COMMAND(ID_NSIDWT, OnNsidwt)
	ON_COMMAND(ID_BINNSDWT, OnBinnsdwt)
	ON_COMMAND(ID_BINNSIDWT, OnBinnsidwt)
	ON_COMMAND(ID_SAVEIMAGE, OnSaveimage)
	ON_COMMAND(ID_OPENORIGINAL, OnOpenoriginalimage)
	ON_COMMAND(ID_INTDWT53, OnIntdwt53)
	ON_COMMAND(ID_INTIDWT53, OnIntidwt53)
	ON_COMMAND(ID_SPIHTCODING, OnSpihtcoding)
	ON_COMMAND(ID_SPIHTDECODING, OnSpihtdecoding)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CINTDWTDoc construction/destruction

CINTDWTDoc::CINTDWTDoc()
{
	// TODO: add one-time construction code here
    
}

CINTDWTDoc::~CINTDWTDoc()
{ 
}

BOOL CINTDWTDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CINTDWTDoc serialization

void CINTDWTDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
}

/////////////////////////////////////////////////////////////////////////////
// CINTDWTDoc diagnostics

#ifdef _DEBUG
void CINTDWTDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CINTDWTDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CINTDWTDoc commands



void CINTDWTDoc::OnExit() 
{
	// TODO: Add your command handler code here
	
}

void CINTDWTDoc::OnIntdwt() 
{
	// TODO: Add your command handler code here
   	int i,j;
	
	//建立对话框
	CLEVEL Dialog;
    Dialog.m_level = 0;
	if (Dialog.DoModal()!=IDOK)
    return;
	level=Dialog.m_level;

	//删除对话框
	delete Dialog;	
	    
	lpDst1=lpSrc;
   	image1=new int[iheight*iwidth];

	//整数小波正变换(9\7小波)
	INTDWT97.Dwt2D(data1, iheight,iwidth,level);

	
	for(i=0;i<iheight;i++)
	  for(j=0;j<iwidth;j++)
	    image1[i*iwidth+j]=data1[i*iwidth+j];
	
	//规一化小波分解后的图像
    uint8(image1, iheight, iwidth);
	
	for(i=0;i<iheight;i++)
        for(j=0;j<iwidth;j++)
        {
 	       lpDst1.SetXY8(j,i,image1[i*iwidth+j]);
		}
	
	//释放内存
    delete []image1;

	UpdateAllViews(NULL);
	SetModifiedFlag();
	
}

void CINTDWTDoc::OnIntidwt() 
{
	// TODO: Add your command handler code here
	int i,j;
	
	lpDst2=lpSrc;
    
	//整数小波反变换(9\7小波)
	INTDWT97.IDwt2D(data1, iheight,iwidth,level);
    
	//规一化重建图像
	uint8(data1, iheight, iwidth);

    for(i=0;i<iheight;i++)
        for(j=0;j<iwidth;j++)
        {
 	       lpDst2.SetXY8(j,i,data1[i*iwidth+j]);
		}
		
   	//释放内存	
	delete []data1;

	UpdateAllViews(NULL);
	SetModifiedFlag();
	
}

BOOL CINTDWTDoc::IsBmp(LPCTSTR lpszPathName)
{
    CFile file;
	if( !file.Open( lpszPathName, CFile::modeRead ) )
		return 0;

	UINT nCount;
	BITMAPFILEHEADER bmfh;

	nCount = file.Read((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER));
	if(nCount != sizeof(BITMAPFILEHEADER))
	return FALSE;
	if(bmfh.bfType != 0x4d42)
	return FALSE;
	file.Close( );
	return TRUE;
}

void CINTDWTDoc::OnDwt() 
{
	// TODO: Add your command handler code here

	int i,j;
	
	//产生对话框
	CLEVEL Dialog;
    Dialog.m_level = 0;
	if (Dialog.DoModal()!=IDOK)
    return;
	level=Dialog.m_level;
	
	//删除对话框
	delete Dialog;	
	    
	lpDst1=lpSrc;
    image2=new double[iheight*iwidth];
			
	//浮点型小波变换
	FLOATDWT.Dwt2D(data2, iheight,iwidth,level);


	for(i=0;i<iheight;i++)
	  for(j=0;j<iwidth;j++)
	      image2[i*iwidth+j]=data2[i*iwidth+j];
	
	//规一化小波分解后的图像
	uint8(image2,iheight,iwidth);
   	
    for(i=0;i<iheight;i++)
        for(j=0;j<iwidth;j++)
        {
 	       lpDst1.SetXY8(j,i,image2[i*iwidth+j]);
		}
	
	//清除内存
	delete []image2;

	UpdateAllViews(NULL);
	SetModifiedFlag();
	
}

void CINTDWTDoc::OnIdwt() 
{
	// TODO: Add your command handler code here
	int i,j;
	lpDst2=lpSrc;
    
	//浮点型小波反变换
	FLOATDWT.IDwt2D(data2, iheight,iwidth,level);
   
	//规一化重建图像
	uint8(data2,iheight,iwidth);
	
    for(i=0;i<iheight;i++)
        for(j=0;j<iwidth;j++)
        {
 	       lpDst2.SetXY8(j,i,data2[i*iwidth+j]);
		}
	
	//清除内存
    delete []data2;	
   
	UpdateAllViews(NULL);
	SetModifiedFlag();
	
}

void CINTDWTDoc::OnNsdwt() 
{
	// TODO: Add your command handler code here
	int i,j;

	//产生对话框
	CLEVEL Dialog;
    Dialog.m_level = 0;
	if (Dialog.DoModal()!=IDOK)
    return;
	level=Dialog.m_level;	
	
	//删除对话框
	delete Dialog;	
	    
	lpDst1=lpSrc;
   	image2=new double[iheight*iwidth];
	
	//小波正变换(9\7提升小波)	
    NSDWT.Dwt2D(data2, iheight,iwidth,level);

	for(i=0;i<iheight;i++)
	  for(j=0;j<iwidth;j++)
	     image2[i*iwidth+j]=data2[i*iwidth+j];
	
	//规一化小波分解后图像	
	uint8(image2,iheight,iwidth);
	
     for(i=0;i<iheight;i++)
        for(j=0;j<iwidth;j++)
        {
 	       lpDst1.SetXY8(j,i,image2[i*iwidth+j]);
		}
	
	//释放内存		
	delete []image2;

	UpdateAllViews(NULL);
	SetModifiedFlag();
	
}

void CINTDWTDoc::OnNsidwt() 
{
	// TODO: Add your command handler code here
	int i,j;
	lpDst2=lpSrc;
    
	//小波反变换(9\7提升小波)
	NSDWT.IDwt2D(data2, iheight,iwidth,level);
    
	//规一化重建图像
	uint8(data2,iheight,iwidth);

    for(i=0;i<iheight;i++)
        for(j=0;j<iwidth;j++)
        {
 	       lpDst2.SetXY8(j,i,data2[i*iwidth+j]);
		}
	
	//释放内存	
	delete []data2;

   	UpdateAllViews(NULL);
	SetModifiedFlag();
}





void CINTDWTDoc::OnBinnsdwt() 
{
	// TODO: Add your command handler code here
	int i,j;
	
	//产生对话框
	CLEVEL Dialog;
    Dialog.m_level = 0;
	if (Dialog.DoModal()!=IDOK)
    return;
	level=Dialog.m_level;	
	
	//删除对话框
	delete Dialog;	
	    
	lpDst1=lpSrc;
   	image1=new int[iwidth * iheight];	
    
	//小波正变换(二进制9\7提升小波)
	BINDWT.Dwt2D(data1,iheight,iwidth,level);


	for(i=0;i<iheight;i++)
	  for(j=0;j<iwidth;j++)
	     image1[i*iwidth+j]=data1[i*iwidth+j];
	
	//规一化小波分解后的图像
	uint8(image1,iheight,iwidth);	
   	
     for(i=0;i<iheight;i++)
        for(j=0;j<iwidth;j++)
        {
 	       lpDst1.SetXY8(j,i,image1[i*iwidth+j]);
		}
	
	//释放内存		
	delete []image1;

	UpdateAllViews(NULL);
	SetModifiedFlag();
}

void CINTDWTDoc::OnBinnsidwt() 
{
	// TODO: Add your command handler code here
	int i,j;
	
	lpDst2=lpSrc;
    
	//小波反变换(二进制9\7提升小波)
	BINDWT.IDwt2D(data1, iheight,iwidth,level);
    
	//规一化重建图像
	uint8(data1,iheight,iwidth);

    for(i=0;i<iheight;i++)
        for(j=0;j<iwidth;j++)
        {
 	       lpDst2.SetXY8(j,i,data1[i*iwidth+j]);
		}

	//释放内存	
   	delete []data1;

	UpdateAllViews(NULL);
	SetModifiedFlag();
}






void CINTDWTDoc::Imagedenoising(int width, int height, int level, float q, double *image)
{
	  int i,j,L1,L2,L3,L4,var;
	  float *subHH1,sum,mean1,mean2,mean3,sum1,sum2,sum3;
	  sum1=0;sum2=0;sum3=0;mean1=0;mean2=0;mean3=0;
	  sum=0; 

	  //计算分辨率为3的各子带的均值和方差
	  L1=1<<(level-3);
	  float var1,var2,var3;
	  var1=0;var2=0;var3=0;
     
      for(i=0;i<(height/L1);i++)
	    for(j=(width/L1);j<2*(width/L1);j++)
	  {
		  sum1=sum1+image[i*width+j];
		  sum2=sum2+image[(i+height/L1)*width+j-(width/L1)];
		  sum3=sum3+image[(i+height/L1)*width+j];
	  }
	  
	  mean1=sum1/((height/L1)*(width/L1));
	  mean2=sum2/((height/L1)*(width/L1));
	  mean3=sum3/((height/L1)*(width/L1));
    
	  for(i=0;i<(height/L1);i++)
	    for(j=(width/L1);j<2*(width/L1);j++)
	  {
		  var1=var1+(image[i*width+j]-mean1)*(image[i*width+j]-mean1);
		  var2=var2+(image[(i+height/L1)*width+j-width/L1]-mean2)*(image[(i+height/L1)*width+j-width/L1]-mean2);
		  var3=var3+(image[(i+height/L1)*width+j]-mean3)*(image[(i+height/L1)*width+j]-mean3);
	  }
	 
	 var1=var1/((height/L1)*(width/L1));
	 var2=var2/((height/L1)*(width/L1));
	 var3=var3/((height/L1)*(width/L1));
	  
     //计算分辨率为2的各子带的均值和方差
	  
	  L2=1<<(level-2);
	  float var4,var5,var6;
	  var4=0;var5=0;var6=0;
      sum1=0;sum2=0;sum3=0;mean1=0;mean2=0;mean3=0;
	
	  for(i=0;i<(height/L2);i++)
	     for(j=(width/L2);j<2*(width/L2);j++)
	  {
		  sum1=sum1+image[i*width+j];
		  sum2=sum2+image[(i+height/L2)*width+j-width/L2];
		  sum3=sum3+image[(i+iheight/L2)*width+j];
	  }
	  mean1=sum1/((height/L2)*(width/L2));
	  mean2=sum2/((height/L2)*(width/L2));
	  mean3=sum3/((height/L2)*(width/L2));
	  
	  
	  for(i=0;i<(height/L2);i++)
	    for(j=(width/L2);j<2*(width/L2);j++)
	  {
		var4=var4+(image[i*width+j]-mean1)*(image[i*width+j]-mean1);
		var5=var5+(image[(i+height/L2)*width+j-width/L2]-mean2)*(image[(i+height/L2)*width+j-width/L2]-mean2);
		var6=var6+(image[(i+iheight/L2)*width+j]-mean3)*(image[(i+height/L2)*width+j]-mean3);
	  }
     
	  var4=var4/((height/L2)*(width/L2));
      var5=var5/((height/L2)*(width/L2));
      var6=var6/((height/L2)*(width/L2));

    //计算分辨率为1的各子带的均值和方差
  

⌨️ 快捷键说明

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