📄 testview.cpp
字号:
int h=height>>l;
int i;
//竖直方向逆变换
for(i=0;i<w;i++)
{ int j;
for(j=0;j<h;j++)
tmp_column_in[j]=dst[j][i]; //倒序处理
inverse_wavelet_row(tmp_column_out,tmp_column_in,h);
for(j=0;j<h;j++)
dst[j][i]=tmp_column_out[j];
}
//水平方向逆变换
for(i=0;i<h;i++)
{
inverse_wavelet_row(tmp_lastrow,dst[i],w);
memcpy(dst[i],tmp_lastrow,w*sizeof(int));
}
}
free(tmp_lastrow);
}
///////////////////////////////////////////////////////////////////////////////
///////以下是小波变换的菜单响应函数
void CTestView::OnIntWaveletForward()
{
// 获取文档
CTestDoc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图,其它的可以类推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
MessageBox("目前只支持查看256色位图灰度直方图!", "系统提示" , MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
int lHeight,lWidth;
int i,j;
lHeight=::DIBHeight(lpDIB);
lWidth=::DIBWidth(lpDIB);
DWORD dwLineBytes=WIDTHBYTES(lWidth*8);
Dialog1 tt;
if(tt.DoModal()==IDOK)
{ levels=tt.m_Levels;
}
free(tt);
MyHeight=lHeight;
MyWidth=lWidth;
//申请空间,初始化原始图像数组
origin=new int* [lHeight];
for(i=0;i<lHeight;i++)
origin[i]=new int [lWidth];
for(i=0;i<lHeight;i++)
for(j=0;j<lWidth;j++)
{
//LPSTR lptemp=lpDIBBits+(lHeight-i-1)*dwLineBytes+j; //-128---+127
//origin[i][j]=(int)(*lptemp);
BYTE *lptemp=(BYTE *)lpDIBBits+(lHeight-1-i)*dwLineBytes+j; //0--255
origin[i][j]=(int)(*lptemp);
}
wavelet_transform_overlap(origin,dwLineBytes,lHeight,levels);
for(i=0;i<lHeight;i++)
for(j=0;j<lWidth;j++)
{
BYTE* lptemp=(BYTE*)lpDIBBits+(lHeight-i-1)*dwLineBytes+j;
(*lptemp)=(BYTE)origin[i][j];
}
// 更新视图
pDoc->UpdateAllViews(NULL);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
//下面是将得到的系数写入文件,保存起来,文件保存在工程所在的目录下
/*
CFile CoeMatrix;
CFileException fe;
CoeMatrix.Open("coefficients.txt",CFile::modeCreate | CFile::modeReadWrite | CFile::shareExclusive,&fe);
CString str;
int max=-10000;
int min=100000;
for(i=0;i<lHeight/4;i++)
for(DWORD j=0;j<lWidth/4;j++)
{
if(max<origin[i][j])
max=origin[i][j];
if(min>origin[i][j])
min=origin[i][j];
str.Format("%d",origin[i][j]);
CoeMatrix.Write(str,str.GetLength());
CoeMatrix.Write(",",1);
}
CoeMatrix.Close();
str.Format("Max:%d,Min:%d",max,min);
AfxMessageBox(str);
*/
}
void CTestView::OnIntWaveletBackward()
{
// 获取文档
CTestDoc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图,其它的可以类推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
MessageBox("目前只支持查看256色位图灰度直方图!", "系统提示" , MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
DWORD lHeight,lWidth;
lHeight=::DIBHeight(lpDIB);
lWidth=::DIBWidth(lpDIB);
DWORD dwLineBytes=WIDTHBYTES(lWidth*8);
/* int **origin=new int* [lHeight];
for(DWORD i=0;i<lHeight;i++)
origin[i]=new int [lWidth];
for(i=0;i<lHeight;i++)
for(DWORD j=0;j<lWidth;j++)
{
LPSTR lptemp=lpDIBBits+(lHeight-i-1)*dwLineBytes+j;
origin[i][j]=(int)(*lptemp);
}
*/
inverse_wavelet_transform_overlap(origin,lWidth,lHeight,levels);
for(DWORD i=0;i<lHeight;i++)
for(DWORD j=0;j<lWidth;j++)
{
BYTE* lptemp=(BYTE*)lpDIBBits+(lHeight-i-1)*dwLineBytes+j;
(*lptemp)=(BYTE)origin[i][j];
}
// 更新视图
pDoc->UpdateAllViews(NULL);
/*
//将逆变换后的图像与原图像相比较,求出峰值信噪比
//打开与解码文件对应的源位图文件
char FiltersSource[]="*.bmp";
CString PathName;
CFile bmpSourceFile;
CFileException fe;
HDIB hDIBSource;
LPSTR lpDIBSource;
LPSTR lpSource,lptemp;
CFileDialog dlgFileSource(TRUE,"bmp","*.bmp",OFN_READONLY,FiltersSource,this);
if(dlgFileSource.DoModal ()==IDOK)
PathName=dlgFileSource.GetPathName();
else
return;
bmpSourceFile.Open((LPCTSTR)PathName,CFile::modeRead,&fe);
hDIBSource=::ReadDIBFile(bmpSourceFile);
lpDIBSource=(LPSTR)::GlobalLock((HGLOBAL)hDIBSource);
lpSource=FindDIBBits(lpDIBSource);
double difference=0.0;
lptemp=lpDIBBits;
LPSTR lpSourcetemp=lpSource;
for(i=0;i<::DIBHeight(lpDIB);i++)
for(unsigned int j=0;j<::DIBWidth(lpDIB);j++)
{ lptemp=lpDIBBits+i*(::DIBWidth(lpDIB))+j;
lpSourcetemp=lpSource+i*(::DIBWidth(lpDIB))+j;
difference+=pow((double)((*lptemp)-(*lpSourcetemp)),double(2));
}
double temp=255*255*(double)(::DIBWidth(lpDIB))*(double)(::DIBHeight(lpDIB));
double ratio=10 * log10((double)(temp/difference));
::GlobalUnlock (hDIBSource);
*/
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
}
void CTestView::OnIntAdlWaveletForward()
{
// 获取文档
CTestDoc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图,其它的可以类推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
MessageBox("目前只支持查看256色位图灰度直方图!", "系统提示" , MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
int lHeight,lWidth;
int i,j,m;
lHeight=::DIBHeight(lpDIB);
lWidth=::DIBWidth(lpDIB);
DWORD dwLineBytes=WIDTHBYTES(lWidth*8);
MyHeight=lHeight;
MyWidth=lWidth;
M=8;
N=8;
Dialog1 tt;
if(tt.DoModal()==IDOK)
{ levels=tt.m_Levels;
}
free(tt);
M_sample=tt.m_Samples/2;//取样点数
Sinc_coefficitns();
//申请空间,初始化原始图像数组
origin=new int* [MyHeight];
for(i=0;i<MyHeight;i++)
origin[i]=new int [MyWidth];
for(i=0;i<MyHeight;i++)
for(j=0;j<MyWidth;j++)
{
//LPSTR lptemp=lpDIBBits+(lHeight-i-1)*dwLineBytes+j; //-128---+127
//origin[i][j]=(int)(*lptemp);
BYTE *lptemp=(BYTE *)lpDIBBits+(lHeight-1-i)*dwLineBytes+j; //0--255
origin[i][j]=(int)(*lptemp);
}
total_preDrection=new int* [levels];
total_preDrection1=new int* [levels];
for(m=0;m<levels;m++)
{
//列变换
Horizontal_Sinc_interpolation();//插值
Horizontal_Direction_Prediction();//判断预测的方向并预测
Horizontal_Sinc_interpolation();//插值
Horizontal_Update();//更新
//ADLwavelet_transform_overlap(origin,dwLineBytes,lHeight,3);
//行变换
Vertical_Sinc_interpolation();//插值
Vertical_Direction_Prediction();//判断预测的方向并预测
Vertical_Sinc_interpolation();//插值
Vertical_Update();//更新
//保存预测的方向信息
total_preDrection[m]=new int [(MyHeight/M)*(MyWidth/N)];
for(i=0;i<MyHeight/M;i++)
for(j=0;j<MyWidth/N;j++)
{
total_preDrection[m][i*(MyWidth/N)+j]=Predict_direc[i][j];
}
total_preDrection1[m]=new int [(MyHeight/M)*(MyWidth/N)];
for(i=0;i<MyHeight/M;i++)
for(j=0;j<MyWidth/N;j++)
{
total_preDrection1[m][i*(MyWidth/N)+j]=Predict_direc1[i][j];
}
//下一级分解初始化
MyHeight=MyHeight/2;
MyWidth=MyWidth/2;
if(ori_QuartPixel_interp!=NULL)
{delete ori_QuartPixel_interp;
ori_QuartPixel_interp=NULL;}
if(Predict_direc!=NULL)
{delete Predict_direc;
Predict_direc=NULL;}
if(Block_energy!=NULL)
{delete Block_energy;
Block_energy=NULL;}
if(ori_QuartPixel_interp1!=NULL)
{delete ori_QuartPixel_interp1;
ori_QuartPixel_interp1=NULL;}
if(Predict_direc1!=NULL)
{delete Predict_direc1;
Predict_direc1=NULL;}
if(Block_energy1!=NULL)
{delete Block_energy1;
Block_energy1=NULL;}
}
MyHeight=MyHeight<<levels;
MyWidth=MyWidth<<levels;
// 更新视图
pDoc->UpdateAllViews(NULL);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
//下面是将得到的系数写入文件,保存起来,文件保存在工程所在的目录下
CFile CoeMatrix;
CFileException fe;
CoeMatrix.Open("coefficients.txt",CFile::modeCreate | CFile::modeReadWrite | CFile::shareExclusive,&fe);
CString str;
/* int max=-10000;
int min=100000;
for(i=0;i<lHeight/4;i++)
for(DWORD j=0;j<lWidth/4;j++)
{
if(max<origin[i][j])
max=origin[i][j];
if(min>origin[i][j])
min=origin[i][j];
str.Format("%d",origin[i][j]);
CoeMatrix.Write(str,str.GetLength());
CoeMatrix.Write(",",1);
}
CoeMatrix.Close();
str.Format("Max:%d,Min:%d",max,min);
AfxMessageBox(str);
*/
int E=0;
int max=-10000;
int min=100000;
for(i=MyHeight/2;i<MyHeight;i++)
for(j=0;j<MyWidth;j++)
{
if(max<origin[i][j])
{max=origin[i][j];}
if(min>origin[i][j])
{min=origin[i][j];}
E+=abs(origin[i][j]);
}
str.Format("Max:%d,Min:%d,Energy:%d",max,min,E);
// AfxMessageBox(str);
for(i=0;i<lHeight;i++)
for(j=0;j<lWidth;j++)
{
BYTE* lptemp=(BYTE*)lpDIBBits+(lHeight-i-1)*dwLineBytes+j;
(*lptemp)=(BYTE)origin[i][j];
}
/*
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{//Block_energy Predict_direc
str.Format("%d",ori_QuartPixel_interp1[i][j]);
//str.Format("%d",origin[0][j]);
CoeMatrix.Write(str,str.GetLength());
//CoeMatrix.Write(str,4);
CoeMatrix.Write(",",1);
}
CoeMatrix.Write("\r\n",2);
}
*/
CoeMatrix.Close();
}
void CTestView::Horizontal_Sinc_interpolation()
{
int i,j,x;
int l;
double sum=0;
//1/2像素插值
/* //申请空间,初始化半像素插值数组
ori_HalPixel_interp=new int* [MyHeight];
for(i=0;i<MyHeight;i++)
ori_HalPixel_interp[i]=new int [MyWidth*2];
for(i=0;i<MyHeight;i++)
for(j=0;j<MyWidth;j++)
{
for(l=-M+1;l<=M;l++)
{
x=j+l;
if( x<0 )
{ x=-x;}
if(x>MyWidth)
{ x=(MyWidth*2-x);}
sum+= origin[i][x]*sin(PI*(0.5-l))/(PI*(0.5-l));
}
ori_HalPixel_interp[i][2*j+1]=sum;
sum=0;
}
*/
//1/4像素插值
double sum1,sum2,sum3;
sum1=sum2=sum3=0;
//申请空间,初始化四分之一像素插值数组
ori_QuartPixel_interp=new int* [MyHeight];
for(i=0;i<MyHeight;i++)
ori_QuartPixel_interp[i]=new int [MyWidth*4];
for(i=0;i<MyHeight;i++)
for(j=0;j<MyWidth;j++)
{ ori_QuartPixel_interp[i][j*4] = origin[i][j];}
for(i=0;i<MyHeight;i++)
for(j=0;j<MyWidth;j++)
{
for(l=-M_sample+1;l<=M_sample;l++)
{
x=j+l;
if( x<0 )
{ x=-x;}
if(x>MyWidth-1)
{x=((MyWidth-1)*2-x);}
//sum1+= origin[i][x]*sin(PI*(0.25-l))/(PI*(0.25-l));
//sum2+= origin[i][x]*sin(PI*(0.5-l))/(PI*(0.5-l));
//sum3+= origin[i][x]*sin(PI*(0.75-l))/(PI*(0.75-l));
sum1+= origin[i][x]*Sinc_interpolation[0][l+M_sample-1];
sum2+= origin[i][x]*Sinc_interpolation[1][l+M_sample-1];
sum3+= origin[i][x]*Sinc_interpolation[2][l+M_sample-1];
}
ori_QuartPixel_interp[i][4*j+1]=int(sum1);
ori_QuartPixel_interp[i][4*j+2]=int(sum2);
ori_QuartPixel_interp[i][4*j+3]=int(sum3);
sum1=sum2=sum3=0;
}
}
void CTestView::Vertical_Sinc_interpolation()
{
int i,j,x;
int l;
double sum=0;
//1/4像素插值
double sum1,sum2,sum3;
sum1=sum2=sum3=0;
//申请空间,初始化四分之一像素插值数组
ori_QuartPixel_interp1=new int* [MyHeight*4];
for(i=0;i<MyHeight*4;i++)
ori_QuartPixel_interp1[i]=new int [MyWidth];
for(i=0;i<MyHeight;i++)
for(j=0;j<MyWidth;j++)
{ ori_QuartPixel_interp1[i*4][j] = origin[i][j];}
for(i=0;i<MyWidth;i++)
for(j=0;j<MyHeight;j++)
{
for(l=-M_sample+1;l<=M_sample;l++)
{
x=j+l;
if( x<0 )
{ x=-x;}
if(x>MyHeight-1)
{x=((MyHeight-1)*2-x);}
//sum1+= origin[x][i]*sin(PI*(0.25-l))/(PI*(0.25-l));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -