📄 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 "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 + -