📄 intdwtdoc.cpp
字号:
// 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 + -