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

📄 intdwtdoc.cpp

📁 该程序实现各种小波提升分解
💻 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 "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_OPENIMAGE, OnOpenimage)
	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_IMPROVED, OnImprovedFunction)
	ON_COMMAND(ID_SAVEIMAGE, OnSaveimage)
	ON_COMMAND(ID_OPENORIGINAL, OnOpenoriginalimage)
	ON_COMMAND(ID_INTDWT53, OnIntdwt53)
	ON_COMMAND(ID_INTIDWT53, OnIntidwt53)
	ON_COMMAND(ID_VIDEODENOISING, OnVideodenoising)
	//}}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::OnOpenimage() 
{
	// TODO: Add your command handler code here
	CFileDialog fileopenbox(TRUE,NULL,"*.bmp",OFN_HIDEREADONLY,"files(*.bmp)|*.bmp|",NULL);	
    fileopenbox.m_ofn.lpstrTitle="小波变换";
	if(fileopenbox.DoModal()!=IDOK) return;
	CString strPathname=fileopenbox.GetPathName();
	
	if(IsBmp(strPathname))
	{
		
		lpSrc.Read(strPathname);
		
	}
    else
	{
		AfxMessageBox("不是bmp文件!");
	}
	
	int i,j;//循环变量
    CSize m_size;
	m_size.cx = lpSrc.Width();
	m_size.cy = lpSrc.Height();
	iwidth=m_size.cx ;
	iheight=m_size.cy;
	
	
	data1=new int[iwidth * iheight];
	data2=new double[iwidth * iheight];
	
	
	for( i = 0; i <iheight; i++ )
		for( j = 0; j < iwidth; j++ )
		{
		   data1[i*iwidth+j]=(unsigned char)lpSrc.GetXY8(j,i)-128;
		   data2[i*iwidth+j]=(unsigned char)lpSrc.GetXY8(j,i)-128;
		}
			
	UpdateAllViews(FALSE);
	return ;
	
}

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::OnImprovedFunction() 
{
	// TODO: Add your command handler code here
	    int i,j;
	    float MSE,PSNR,e;
    	CString str;
		
		//小波分解层数为4;
		level=4; MSE=0; lpDst1=lpSrc;
	    
		//产生对话框
	    CParameter Dialog;
        Dialog.m_parameter=0;
	    if (Dialog.DoModal()!=IDOK)
        return;
	    e=Dialog.m_parameter;
	
    	//删除对话框
    	delete Dialog;	
	       	
		//小波正变换(9\7提升小波)
		NSDWT.Dwt2D(data2, iheight,iwidth,level);

		//改进的阈值函数去噪
        Imagedenoising(iwidth,iheight,level,e,data2);

		//小波反变换(9\7提升小波)
        NSDWT.IDwt2D(data2, iheight,iwidth,level);
	
	    //像素值幅度控制
		for(i=0;i<iheight;i++)
	       for(j=0;j<iwidth;j++)
		   {   
		    	*(data2+i*iwidth+j)=*(data2+i*iwidth+j)+128;
		    	if(*(data2+i*iwidth+j)>255)
			    *(data2+i*iwidth+j)=255;
                if(*(data2+i*iwidth+j)<0)
			    *(data2+i*iwidth+j)=0;
		   }
	
      for(i=0;i<iheight;i++)
        for(j=0;j<iwidth;j++)
        {
 	       lpDst1.SetXY8(j,i,data2[i*iwidth+j]);
		}

⌨️ 快捷键说明

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