?? wavelet2ddlg.cpp
字號:
else
flag=1;
return HH(-1*i+1,m)*flag;
}
//H算子周期化過程
BOOL CWavelet2DDlg::HHH(int level,int size)
{
int len,m,i;
double temp;
int sign;
len=size>>level;
m=m_nFilterLen/2;
if((ph=new double[sizeof(double)*len])==NULL)
{
AfxMessageBox("H算子內存分配失敗!",MB_OK|MB_ICONINFORMATION);
return FALSE;
}
for(sign=0;sign<len;sign++)
{
temp=0;
for(i=(-1*m+1);i<=m;i++)
{
if(((sign-i)%len)==0)
temp+=HH(i-1,m);
}
ph[sign]=temp;
}
return TRUE;
}
// G算子周期化過程
BOOL CWavelet2DDlg::GGG(int level,int size)
{
int len,m,i;
double temp;
int sign;
len=size>>level;
m=m_nFilterLen/2;
if((pg=new double[sizeof(double)*len])==NULL)
{
AfxMessageBox("G算子內存分配失敗!",MB_OK|MB_ICONINFORMATION);
return FALSE;
}
for(sign=0;sign<len;sign++)
{
temp=0;
for(i=(-1*m+3);i<=m+2;i++)
{
if(((sign-i)%len)==0)
temp+=GG(i-1,m);
}
pg[sign]=temp;
}
return TRUE;
}
// H算子作用于行數據
void CWavelet2DDlg::HOperatorOnRow(int filterlen, int start, int len,int row)
{
int i,i2,m,k,len1;
double temp1;
m=m_nFilterLen/2;
len1=len>>1;
for(i=0;i<len1;i++)
{
i2=2*i;
tempRow[i+start]=0;
if(len>filterlen)
{
for(k=i2-len;k<=i2-len+m;k++)
{
if((k>=0)&&(k<len))
if((temp1=ph[(k-i2+len)%len])!=0)
tempRow[i+start]+=temp1*image[row][k+start];
}
for(k=i2-m+1;k<=i2+m;k++)
{
if((k>=0)&&(k<len))
if((temp1=ph[(k-i2+len)%len])!=0)
tempRow[i+start]+=temp1*image[row][k+start];
}
for(k=i2+len-m+1;k<=i2+len;k++)
{
if((k>=0)&&(k<len))
if((temp1=ph[(k-i2+len)%len])!=0)
tempRow[i+start]+=temp1*image[row][k+start];
}
}
else
{
for(k=0;k<len;k++)
{
if((temp1=ph[(k-i2+len)%len])!=0)
tempRow[i+start]+=temp1*image[row][k+start];
}
}
}
}
// H算子作用于列數據
void CWavelet2DDlg::HOperatorOnCol(int filterlen, int start, int len,int col)
{
int i,i2,m,k,len1;
double temp1;
m=m_nFilterLen/2;
len1=len>>1;
for(i=0;i<len1;i++)
{
i2=2*i;
tempCol[i+start]=0;
if(len>filterlen)
{
for(k=i2-len;k<=i2-len+m;k++)
{
if((k>=0)&&(k<len))
if((temp1=ph[(k-i2+len)%len])!=0)
tempCol[i+start]+=temp1*image[k+start][col];
}
for(k=i2-m+1;k<=i2+m;k++)
{
if((k>=0)&&(k<len))
if((temp1=ph[(k-i2+len)%len])!=0)
tempCol[i+start]+=temp1*image[k+start][col];
}
for(k=i2+len-m+1;k<=i2+len;k++)
{
if((k>=0)&&(k<len))
if((temp1=ph[(k-i2+len)%len])!=0)
tempCol[i+start]+=temp1*image[k+start][col];
}
}
else
{
for(k=0;k<len;k++)
{
if((temp1=ph[(k-i2+len)%len])!=0)
tempCol[i+start]+=temp1*image[k+start][col];
}
}
}
}
// G算子作用于行數據
void CWavelet2DDlg::GOperatorOnRow(int filterlen, int start, int len,int row)
{
int i,i2,m,k,len1;
double temp1;
m=m_nFilterLen/2;
len1=len>>1;
for(i=0;i<len1;i++)
{
i2=2*i;
tempRow[i+start+len1]=0;
if(len>filterlen)
{
for(k=i2-len;k<=i2-len+m+2;k++)
{
if((k>=0)&&(k<len))
if((temp1=pg[(k-i2+len)%len])!=0)
tempRow[i+start+len1]+=temp1*image[row][k+start];
}
for(k=i2-m+3;k<=i2+m+2;k++)
{
if((k>=0)&&(k<len))
if((temp1=pg[(k-i2+len)%len])!=0)
tempRow[i+start+len1]+=temp1*image[row][k+start];
}
for(k=i2+len-m+3;k<=i2+len;k++)
{
if((k>=0)&&(k<len))
if((temp1=pg[(k-i2+len)%len])!=0)
tempRow[i+start+len1]+=temp1*image[row][k+start];
}
}
else
{
for(k=0;k<len;k++)
{
if((temp1=pg[(k-i2+len)%len])!=0)
tempRow[i+start]+=temp1*image[row][k+start];
}
}
}
}
// G算子作用于列數據
void CWavelet2DDlg::GOperatorOnCol(int filterlen, int start, int len,int col)
{
int i,i2,m,k,len1;
double temp1;
m=m_nFilterLen/2;
len1=len>>1;
for(i=0;i<len1;i++)
{
i2=2*i;
tempCol[i+start+len1]=0;
if(len>filterlen)
{
for(k=i2-len;k<=i2-len+m+2;k++)
{
if((k>=0)&&(k<len))
if((temp1=pg[(k-i2+len)%len])!=0)
tempCol[i+start+len1]+=temp1*image[k+start][col];
}
for(k=i2-m+3;k<=i2+m+2;k++)
{
if((k>=0)&&(k<len))
if((temp1=pg[(k-i2+len)%len])!=0)
tempCol[i+start+len1]+=temp1*image[k+start][col];
}
for(k=i2+len-m+3;k<=i2+len;k++)
{
if((k>=0)&&(k<len))
if((temp1=pg[(k-i2+len)%len])!=0)
tempCol[i+start+len1]+=temp1*image[k+start][col];
}
}
else
{
for(k=0;k<len;k++)
{
if((temp1=pg[(k-i2+len)%len])!=0)
tempCol[i+start+len1]+=temp1*image[k+start][col];
}
}
}
}
// 進行第stage層行變換
void CWavelet2DDlg::DecompStageRow(int row, int stage, int numx)
{
int i,start,end;
int filterlen,len;
filterlen=m_nFilterLen;
len=m_nImageWidth>>stage;
start=len*numx;
end=start+len;
HOperatorOnRow(filterlen,start,len,row); // H算子作用于行
GOperatorOnRow(filterlen,start,len,row); // G算子作用于行
for(i=start;i<end;i++)
image[row][i]=tempRow[i];
}
// 進行第stage層列變換
void CWavelet2DDlg::DecompStageCol(int col, int stage, int numx)
{
int i,start,end;
int filterlen,len;
filterlen=m_nFilterLen;
len=m_nImageHeight>>stage;
start=len*numx;
end=start+len;
HOperatorOnCol(filterlen,start,len,col); // H算子作用于列
GOperatorOnCol(filterlen,start,len,col); // G算子作用于列
for(i=start;i<end;i++)
image[i][col]=tempCol[i];
}
// 二維小波變換
void CWavelet2DDlg::Wavelet2D()
{
int row,col,stage;
// 進行第stage層小波變換
for(stage=0;stage<m_nDecomposeStage;stage++)
{
// 初始化H算子和G算子
if((!HHH(stage,m_nImageWidth))||(!GGG(stage,m_nImageWidth)))
break;
else
// 逐行變換
for(row=0;row<(m_nImageHeight>>stage);row++)
{
DecompStageRow(row,stage,0);
}
if(ph&&pg) // 釋放資源
{
delete ph;
delete pg;
ph=NULL;
pg=NULL;
}
// 初始化H算子和G算子
if((!HHH(stage,m_nImageHeight))||(!GGG(stage,m_nImageHeight)))
break;
else
// 逐列變換
for(col=0;col<(m_nImageWidth>>stage);col++)
{
DecompStageCol(col,stage,0);
}
if(ph&&pg) // 釋放資源
{
delete ph;
delete pg;
ph=NULL;
pg=NULL;
}
}
}
// 繪制原始圖像
void CWavelet2DDlg::DrawOriginalBmp()
{
// 得到客戶區
CDC* pDC=GetDC();
CRect RectClient,Workarea;
GetClientRect(RectClient);
// 鎖定DIB
lpDIB = (LPSTR)::GlobalLock((HGLOBAL) GetHDIB());
// 在對話框右上部分創建繪制原始圖像區域
Workarea.left=RectClient.left+(RectClient.right-RectClient.left)/5*2;
Workarea.right=RectClient.right-10;
Workarea.top=RectClient.top+10;
Workarea.bottom=RectClient.top+(RectClient.bottom-RectClient.top-10)/2;
// 設置區域背景色為白色
pDC->Rectangle(Workarea);
pDC->SetBkColor(0x00FFFFFF);
// 繪制原始圖像
m_pBmpInfo->bmiHeader.biWidth = m_nImageWidth;
m_pBmpInfo->bmiHeader.biHeight = m_nImageHeight;
::StretchDIBits(pDC->GetSafeHdc(), Workarea.left+1, Workarea.top+1, Workarea.Width(),Workarea.Height(),//m_nImageWidth, m_nImageHeight,
0, 0, m_nImageWidth, m_nImageHeight, (unsigned char *)lpDIBBits,
(LPBITMAPINFO) m_pBmpInfo, DIB_RGB_COLORS, SRCCOPY);
// 解除鎖定
::GlobalUnlock((HGLOBAL)GetHDIB());
}
// 繪制二維小波變換后圖像
void CWavelet2DDlg::DrawWavelet2D()
{
// 找到圖像變換后數據中的最大最小值
double min=image[0][0],max=0;
for(int a=0;a<m_nImageHeight;a++)
for(int b=0;b<m_nImageWidth;b++)
{
if(image[a][b]>10000)
image[a][b]=max;
if(image[a][b]<-10000)
image[a][b]=min;
if(max<image[a][b])
max=image[a][b];
if(min>image[a][b])
min=image[a][b];
}
// 將圖像變換后數據歸一化到256級灰度
for(int m=0;m<m_nImageHeight;m++)
for(int n=0;n<m_nImageWidth;n++)
{
image[m][n]=(image[m][n]-min)/(max-min)*256.0;
*((unsigned char *)lpDIBBits+m_nImageWidth*m+n)=(unsigned char )image[m][n];
}
// 得到客戶區
CDC* pDC=GetDC();
CRect RectClient,Workarea;
GetClientRect(RectClient);
// 鎖定DIB
lpDIB = (LPSTR)::GlobalLock((HGLOBAL) GetHDIB());
// 在對話框右下部分創建繪制原始圖像區域
Workarea.left=RectClient.left+(RectClient.right-RectClient.left)/5*2;
Workarea.right=RectClient.right-10;
Workarea.top=RectClient.top+10+(RectClient.bottom-RectClient.top-10)/2;
Workarea.bottom=RectClient.bottom-10;
// 設置區域背景色為白色
pDC->Rectangle(Workarea);
pDC->SetBkColor(0x00FFFFFF);
// 繪制原始圖像
m_pBmpInfo->bmiHeader.biWidth = m_nImageWidth;
m_pBmpInfo->bmiHeader.biHeight = m_nImageHeight;
::StretchDIBits(pDC->GetSafeHdc(), Workarea.left+1, Workarea.top+1, Workarea.Width(),Workarea.Height(),//m_nImageWidth, m_nImageHeight,
0, 0, m_nImageWidth, m_nImageHeight, (unsigned char *)lpDIBBits,
(LPBITMAPINFO) m_pBmpInfo, DIB_RGB_COLORS, SRCCOPY);
// 解除鎖定
::GlobalUnlock((HGLOBAL)GetHDIB());
}
// 得到小波變換所需的層次、濾波器長度等參數
void CWavelet2DDlg::GetParam()
{
// 得到待分解層次信息
if(m_combDecomposeStage.GetCurSel()==CB_ERR)
m_nDecomposeStage=1;
else
m_nDecomposeStage=m_combDecomposeStage.GetItemData(m_combDecomposeStage.GetCurSel());
// 得到濾波器長度
if(m_combFilterLen.GetCurSel()==CB_ERR)
m_nFilterLen=6;
else
m_nFilterLen=m_combFilterLen.GetItemData(m_combFilterLen.GetCurSel());
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -