?? 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);
}
///////////////////////////////////////////////////////////////////////////////
///////以下是小波變換的菜單響應(yīng)函數(shù)
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色位圖灰度直方圖!", "系統(tǒng)提示" , 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;
//申請空間,初始化原始圖像數(shù)組
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());
//下面是將得到的系數(shù)寫入文件,保存起來,文件保存在工程所在的目錄下
/*
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色位圖灰度直方圖!", "系統(tǒng)提示" , 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);
/*
//將逆變換后的圖像與原圖像相比較,求出峰值信噪比
//打開與解碼文件對應(yīng)的源位圖文件
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色位圖灰度直方圖!", "系統(tǒng)提示" , 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;//取樣點數(shù)
Sinc_coefficitns();
//申請空間,初始化原始圖像數(shù)組
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();//判斷預(yù)測的方向并預(yù)測
Horizontal_Sinc_interpolation();//插值
Horizontal_Update();//更新
//ADLwavelet_transform_overlap(origin,dwLineBytes,lHeight,3);
//行變換
Vertical_Sinc_interpolation();//插值
Vertical_Direction_Prediction();//判斷預(yù)測的方向并預(yù)測
Vertical_Sinc_interpolation();//插值
Vertical_Update();//更新
//保存預(yù)測的方向信息
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());
//下面是將得到的系數(shù)寫入文件,保存起來,文件保存在工程所在的目錄下
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像素插值
/* //申請空間,初始化半像素插值數(shù)組
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;
//申請空間,初始化四分之一像素插值數(shù)組
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;
//申請空間,初始化四分之一像素插值數(shù)組
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));
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -