📄 liftingschemeview.cpp
字号:
// liftingschemeView.cpp : implementation of the CLiftingschemeView class
//
#include "stdafx.h"
#include "liftingscheme.h"
#include "math.h"
#include <complex>
#include "liftingschemeDoc.h"
#include "liftingschemeView.h"
#include "opnfile.h"
#include "ChooseWavelet.h"
#include "Choose.h"
#include "Info.h"
#define LL 2
#define LH 0
#define HL 3
#define HH 1
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)
#define PI 3.14159265358979323846
#define mnint(a) ((a) < 0 ? (int)(a - 0.5) : (int)(a + 0.5))
/////////////////////////////////////////////////////////////////////////////
// CLiftingschemeView
IMPLEMENT_DYNCREATE(CLiftingschemeView, CView)
BEGIN_MESSAGE_MAP(CLiftingschemeView, CView)
//{{AFX_MSG_MAP(CLiftingschemeView)
ON_COMMAND(ID_OPEN, OnOpenButton)
ON_COMMAND(ID_Trans, OnTrans2)
ON_COMMAND(ID_Trans_FFT, OnTransFFT)
ON_COMMAND(ID_Trans_DCT, OnTransDCT)
ON_COMMAND(ID_Trans_DCT2, OnTransDCT2)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLiftingschemeView construction/destruction
CLiftingschemeView::CLiftingschemeView()
{
// TODO: add construction code here
}
CLiftingschemeView::~CLiftingschemeView()
{
}
BOOL CLiftingschemeView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CLiftingschemeView drawing
void CLiftingschemeView::OnDraw(CDC* pDC)
{
CLiftingschemeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
/*
DisplayImage(m_orgWidth,m_orgHeight,0,TRUE,m_pImageData);
DisplayImage(m_orgWidth/2,m_orgHeight,0,FALSE,LLLH);
DisplayImage(m_orgWidth/2,m_orgHeight,m_orgWidth/2,FALSE,HHHL);
*/
}
/////////////////////////////////////////////////////////////////////////////
// CLiftingschemeView printing
BOOL CLiftingschemeView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CLiftingschemeView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CLiftingschemeView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CLiftingschemeView diagnostics
#ifdef _DEBUG
void CLiftingschemeView::AssertValid() const
{
CView::AssertValid();
}
void CLiftingschemeView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CLiftingschemeDoc* CLiftingschemeView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CLiftingschemeDoc)));
return (CLiftingschemeDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CLiftingschemeView message handlers
void CLiftingschemeView::OnOpenButton()
{
// TODO: Add your command handler code here
//if(m_pImageData)
CFileDialog dlg(true,NULL,NULL,OFN_OVERWRITEPROMPT,
"bmp(*.bmp)|*.bmp|all(*.*)|*.*|raw(*.raw)|*.raw|gray(*.gray)|*.gray|jpg(*.jpg)|*.jpg||",NULL);
CString szFileExt = "sifjpgbmprawgray";
CString temp;
if(dlg.DoModal()==IDOK)
{
temp = dlg.GetFileExt();
m_szFileName = dlg.GetFileName();
m_szFilePathName = dlg.GetPathName();
m_pImageData=NULL;
}
else
return;
temp.MakeLower();
m_Type = szFileExt.Find(temp);
m_pImageData = OpenImageFile(m_szFilePathName, &m_orgWidth, &m_orgHeight, m_Type);
// nFrameNum = 0 ;
// ChangeFrameNum();
/* if((m_orgWidth%16)!=0)
m_Width = int (m_orgWidth/16+1)*16 ;
else
m_Width = m_orgWidth;
if((m_orgHeight%16)!=0)
m_Height = int (m_orgHeight/16+1)*16 ;
else
m_Height = m_orgHeight; */
m_Width = m_orgWidth;m_Height = m_orgHeight;
pGrayData = (unsigned char *)new BYTE[m_Width*m_Height];
pNewGrayData = (unsigned char *)new BYTE[m_Width*m_Height];
// ImageGraylize(m_pImageData,pGrayData,m_orgWidth,m_orgHeight); //灰度化过程
// CopyPartImage(m_pImageData, pGrayData,m_orgWidth, m_orgHeight,m_Width,m_Height);
CDC *dc=GetDC();
for(long f=0;f<m_orgHeight;f++)
for(long d=0; d<m_orgWidth;d++)
{
dc->SetPixel(d,f,
RGB(m_pImageData[(m_orgHeight-1-f)*m_orgWidth+d],
m_pImageData[(m_orgHeight-1-f)*m_orgWidth+d],
m_pImageData[(m_orgHeight-1-f)*m_orgWidth+d]));
}
ReleaseDC(dc);
}
BYTE* CLiftingschemeView::OpenImageFile(CString szFilePathName, long *width, long *height, int nType)
{
BYTE * pImageData = NULL;
switch(nType/3)
{
case 0:
pImageData = OpenSIF(szFilePathName,width,height);
break;
case 1:
pImageData = OpenJPG(szFilePathName,width,height);
break;
case 2:
pImageData = OpenBMP(szFilePathName,width,height);
break;
case 3:
pImageData = OpenRAW(szFilePathName,width,height);
break;
case 4:
pImageData = OpenGRAY(szFilePathName,width,height);
break;
default:
AfxMessageBox("无法打开的文件!");
break;
}
if(pImageData)
return pImageData;
else
return NULL;
}
void CLiftingschemeView::DisplayImage(long w, long h,int offset, bool orgImg,double *Image)
{
CDC *dc=GetDC();
static int temp;
int ii=512;
if(orgImg)
ii=0;
temp=w>512?0:(ii+offset);
for(long f=0;f<h;f++)
for(long d=0; d<w;d++)
{
dc->SetPixel(d+temp,orgImg?f:h-f,
RGB(
Image[f*w+d],
Image[f*w+d],
Image[f*w+d]));
}
ReleaseDC(dc);
}
void CLiftingschemeView::GeneralMallat4(double h[], int h0, int ln_h, double g[], int g0, int ln_g, BYTE *Image, long ww, long hh,int level,char tp[],BOOL disp,BOOL reconstruct)
{
int loop,i,j;
double *HHHL;
double *LLLH;
double *tmpImage;
finalImage=new double[ww*hh];
ImageToRe=new double[ww*hh];
long www=ww;long hhh=hh;
/////////////////////////////////
double Hi_R[20],Lo_R[20];
int Hi_R0,Lo_R0,Hi_R_l,Lo_R_l;
Hi_R0=h0;
Lo_R0=g0;
Hi_R_l=ln_h;
Lo_R_l=ln_g;
for(i=0;i<20;i++)
{
Hi_R[i]=(1-2*(i%2))*h[i];//
Lo_R[i]=-(1-2*(i%2))*g[i];//重构与分解滤波器的关系
}
////////////////////////////////////////////////
long timespan=GetTickCount();
for(loop=0;loop<level;loop++)
{
if(loop==0)
{
tmpImage=new double[ww*hh];
//memcpy(tmpImage,Image,ww*hh);
for(i=0;i<hh;i++)
for(j=0;j<ww;j++)
tmpImage[i*ww+j]=Image[i*ww+j];
}
HHHL=new double[ww*hh/2];
LLLH=new double[ww*hh/2];
LLLH=RealMallat( h, h0, ln_h, g, g0, ln_g, tmpImage, ww, hh,TRUE);
HHHL=RealMallat( g, g0, ln_g, h, h0, ln_h, tmpImage, ww, hh,FALSE);
//if(loop==0)
for(i=(hhh-hh);i<hhh;i++)
for(j=0;j<ww/2;j++)
{
// if(j<ww/2)
{//finalImage[i*www+j]=LLLH[(i-(hhh-hh))*(ww/2)+j];
ImageToRe[i*www+j]=LLLH[(i-(hhh-hh))*(ww/2)+j];}
// else
{//finalImage[i*www+j]=HHHL[(i-(hhh-hh))*(ww/2)+j];
ImageToRe[i*www+j+ww/2]=HHHL[(i-(hhh-hh))*(ww/2)+j];}
}
delete[]tmpImage;
tmpImage=new double[ww*hh/4];
for(i=0;i<ww/2;i++)
for(j=0;j<hh/2;j++)
tmpImage[i*(ww/2)+j]=LLLH[(i+ww/2)*(ww/2)+j];
/* for(i=(hhh-hh);i<hhh;i++)
finalImage[i*www+ww/2]=255;
for(j=0;j<ww;j++)
finalImage[(hhh-hh/2-1)*www+j]=255;*/
ww=ww/2;hh=hh/2;
// DisplayImage(ww,hh,0,FALSE,tmpImage);
}
timespan=GetTickCount()-timespan;
double mx,mn;
mx=-2000;mn=2000;
for(i=0;i<m_orgHeight;i++)
for(j=0;j<m_orgWidth;j++)
{
if(ImageToRe[i*m_orgWidth+j]<mn)
mn=ImageToRe[i*m_orgWidth+j];
if(ImageToRe[i*m_orgWidth+j]>mx)
mx=ImageToRe[i*m_orgWidth+j];
mx=mx+0;
}
for(i=0;i<m_orgHeight;i++)
for(j=0;j<m_orgWidth;j++)
{
finalImage[i*m_orgWidth+j]=(ImageToRe[i*m_orgWidth+j]-mn)*255/(mx-mn);
}
DisplayImage(www,hhh,0,FALSE,finalImage);//ImageToRe
if(disp)
DisplayInfoBox(tp,level,"Mallat",timespan,FALSE);
if(reconstruct)
Reconstruct2(Hi_R,Hi_R0,Hi_R_l,Lo_R,Lo_R0,Lo_R_l,ImageToRe,www, hhh,level,tp, disp);
}
void CLiftingschemeView::OnTrans2()
{
// TODO: Add your command handler code here
CChooseWavelet dlg;int n;int level;
BOOL disp,reconstruct;
if(dlg.DoModal()==IDOK)
//UpdateData(TRUE);
{n=dlg.nWaveletType;
level=dlg.m_nLevel;
disp=dlg.m_bDispInfo;
reconstruct=dlg.m_bReconstr;
}
// LLLH=new BYTE[m_orgWidth*m_orgHeight/2];
// HHHL=new BYTE[m_orgWidth*m_orgHeight/2];
//W53
double Lo_D0[20]={-0.125,0.25,0.75,0.25,-0.125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
double Hi_D0[20]={0.25,-0.5,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//CDF97
double Lo_D1[20]={0.0267487,-0.016864,-0.0782234,0.266864,0.602949,0.266864,-0.0782234,-0.016864,0.0267487,0,0,0,0,0,0,0,0,0,0,0};
//double Hi_D1[20]={-0.0456358,-0.02287716,0.295636,0.557543,0.295636,-0.02287716,-0.0456358,0,0,0,0,0,0,0,0,0,0,0,0,0};
double Hi_D1[20]={-0.091272,-0.057543,0.591272,1.115087,0.591272,-0.057543,-0.091272,0,0,0,0,0,0,0,0,0,0,0,0,0};
//W97-1
double Lo_D2[20]={1.0/64,0,-1.0/8,1.0/4,23.0/32,1.0/4,-1.0/8,0,1.0/64,0,0,0,0,0,0,0,0,0,0,0};
double Hi_D2[20]={-1.0/32,0,9.0/32,1.0/2,9.0/32,0,-1.0/32,0,0,0,0,0,0,0,0,0,0,0,0,0};
//W97-2
double Lo_D3[20]={9.0/320,-3.0/160,-12.0/160,43.0/160,190.0/320,43.0/160,-12.0/160,-3.0/160,9.0/320,0,0,0,0,0,0,0,0,0,0,0};
double Hi_D3[20]={-3.0/64,-1.0/32,19.0/64,9.0/16,19.0/64,-1.0/32,-3.0/64,0,0,0,0,0,0,0,0,0,0,0,0,0};
//db6
double Lo_D4[20]={-0.0011,0.0048,0.0006,-0.0316,0.0275,0.0975,-0.1298,-0.2263,0.3153,0.7511,0.4946,0.1115,0,0,0,0,0,0,0,0};
double Hi_D4[20]={-0.1115,0.4946,-0.7511,0.3153,0.2263,-0.1298,-0.0975,0.0275,0.0316,0.0006,-0.0048,-0.0011,0,0,0,0,0,0,0,0};
//Haar
double Lo_D5[20]={0.7071,0.7071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
double Hi_D5[20]={-0.7071,0.7071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
switch(n)
{
case 0:
/*W53*/
GeneralMallat4(Lo_D0,3,5,Hi_D0,3,3,m_pImageData,m_orgWidth,m_orgHeight,level,"W53",disp,reconstruct);
break;
case 1:
//CDF97
GeneralMallat4(Hi_D1,4,7,Lo_D1,5,9,m_pImageData,m_orgWidth,m_orgHeight,level,"CDF97",disp,reconstruct);
break;
case 2:
//W97-1
//LLLH=GeneralMallat2(Lo_D2,5,9,Hi_D2,4,7,m_pImageData,m_orgWidth,m_orgHeight,level);
GeneralMallat4(Hi_D2,4,7,Lo_D2,5,9,m_pImageData,m_orgWidth,m_orgHeight,level,"W97-1",disp,reconstruct);
break;
case 3:
//W97-2
GeneralMallat4(Lo_D3,5,9,Hi_D3,4,7,m_pImageData,m_orgWidth,m_orgHeight,level,"W97-2",disp,reconstruct);
//HHHL=GeneralMallat2(Hi_D3,4,7,Lo_D3,5,9,m_pImageData,m_orgWidth,m_orgHeight,level);
break;
case 4:
/*db6*/
GeneralMallat4(Lo_D4,7,12,Hi_D4,7,12,m_pImageData,m_orgWidth,m_orgHeight,level,"DB6",disp,reconstruct);
//HHHL=GeneralMallat2(Hi_D4,7,12,Lo_D4,7,12,m_pImageData,m_orgWidth,m_orgHeight,level);
break;
case 5:
GeneralMallat4(Lo_D5,2,2,Hi_D5,2,2,m_pImageData,m_orgWidth,m_orgHeight,level,"Haar",disp,reconstruct);
}
// if(dlg.m_bDispInfo)
// InfoDlg.DoModal();
// DisplayImage(m_orgWidth/2,m_orgHeight,0,FALSE,LLLH);
// DisplayImage(m_orgWidth/2,m_orgHeight,m_orgWidth/2,FALSE,HHHL);
}
double* CLiftingschemeView::RealMallat(double h[], int h0, int ln_h, double g[], int g0, int ln_g, double *Image, long ww, long hh, bool Low)
{
double *tmp=new double[ww*hh];
double *resultImage=new double[ww*hh/2];//transformed image
int i,j,k;
double var;
for(i=0;i<hh;i++)
{
for(j=0;j<h0-1;j++)
{
var=0;
for(k=0;k<ln_h;k++)
//var=var+h[k]*Image[i*ww+abs(j+k-(h0-1))-(ln_h-1)%2];
{ if((j+k-(h0-1)<0))
var=var+h[k]*Image[i*ww+(abs(j+k-(h0-1))-(ln_h-1)%2)];
else
var=var+h[k]*Image[i*ww+(j+k-(h0-1))];
}
tmp[i*ww+j]=var;
}
for(j=h0-1;j<ww-(ln_h-h0);j++)
{
var=0;
for(k=0;k<ln_h;k++)
var=var+h[k]*Image[i*ww+j+k-(h0-1)];
tmp[i*ww+j]=var;
var=tmp[i*ww+j];
}
for(j=ww-(ln_h-h0);j<ww;j++)//i=128,j=254
{
var=0;
for(k=0;k<ln_h;k++)
// var=var+h[k]*Image[i*ww+2*ww-(j+k-(h0-1))-2+(ln_h-1)%2];
{if((j+k-h0+1)<ww)
var=var+h[k]*Image[(j+k-h0+1)*ww+j];//(2*hh-(i+k-(h0-1))-2+(ln_h-1)%2)
else
var=var+h[k]*Image[(2*ww-(j+k-h0+1)-2+(ln_h-1)%2)*ww+j];}
tmp[i*ww+j]=var;
}
}
// return tmp;
for(i=0;i<hh;i++)
{
for(j=0;j<ww/2;j++)
tmp[i*ww+j]=tmp[i*ww+2*j];//抽样 i=128,j=127?
}
//行低通计算完成
//列高通。LH HL
for(j=0;j<ww/2;j++)
{
for(i=0;i<g0-1;i++)
{
var=0;
for(k=0;k<ln_g;k++)
{
if((i+k-(g0-1)<0))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -