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

📄 liftingschemeview.cpp

📁 正交变换.rar文件压缩的基础知识无毒good
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 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 + -