📄 小波变换view.cpp
字号:
Ld[3]=0.005386388754/(double)sqrt((double)(2)); Ld[4]=0.069490465911/(double)sqrt((double)(2)); Ld[5]=-0.038493521263/(double)sqrt((double)(2));
Ld[6]=-0.073462508761/(double)sqrt((double)(2)); Ld[7]=0.515398670374/(double)sqrt((double)(2)); Ld[8]=1.099106630537/(double)sqrt((double)(2));
Ld[9]=0.680745347190/(double)sqrt((double)(2)); Ld[10]=-0.086653615406/(double)sqrt((double)(2)); Ld[11]=-0.202648655286/(double)sqrt((double)(2));
Ld[12]=0.010758611751/(double)sqrt((double)(2)); Ld[13]=0.044823623042/(double)sqrt((double)(2)); Ld[14]=-0.000766690896/(double)sqrt((double)(2));
Ld[15]=-0.004783458512/(double)sqrt((double)(2));
m_wavetransform.m_preoffset=8;
m_wavetransform.m_aftoffset=7;
break;
case 18:
Ld[0]=0.001512487309/(double)sqrt((double)(2)); Ld[1]=-0.000669141509/(double)sqrt((double)(2)); Ld[2]=-0.014515578553/(double)sqrt((double)(2));
Ld[3]=0.012528896242/(double)sqrt((double)(2)); Ld[4]=0.087791251554/(double)sqrt((double)(2)); Ld[5]=-0.025786445930/(double)sqrt((double)(2));
Ld[6]=-0.270893783503/(double)sqrt((double)(2)); Ld[7]=0.049882830959/(double)sqrt((double)(2)); Ld[8]=0.873048407349/(double)sqrt((double)(2));
Ld[9]=1.015259790832/(double)sqrt((double)(2)); Ld[10]=0.337658923602/(double)sqrt((double)(2)); Ld[11]=-0.077172161097/(double)sqrt((double)(2));
Ld[12]=0.000825140929/(double)sqrt((double)(2)); Ld[13]=0.042744433602/(double)sqrt((double)(2)); Ld[14]=-0.016303351226/(double)sqrt((double)(2));
Ld[15]=-0.018769396836/(double)sqrt((double)(2)); Ld[16]=0.000876502539/(double)sqrt((double)(2)); Ld[17]=0.001981193736/(double)sqrt((double)(2));
m_wavetransform.m_preoffset=8;
m_wavetransform.m_aftoffset=9;
break;
case 20:
Ld[0]=0.001089170447/(double)sqrt((double)(2)); Ld[1]=0.000135245020/(double)sqrt((double)(2)); Ld[2]=-0.012220642630/(double)sqrt((double)(2));
Ld[3]=-0.002072363923/(double)sqrt((double)(2)); Ld[4]=0.064950924579/(double)sqrt((double)(2)); Ld[5]=0.016418869426/(double)sqrt((double)(2));
Ld[6]=-0.225558972234/(double)sqrt((double)(2)); Ld[7]=-0.100240215031/(double)sqrt((double)(2)); Ld[8]=0.667071338154/(double)sqrt((double)(2));
Ld[9]=1.088251530500/(double)sqrt((double)(2)); Ld[10]=0.542813011213/(double)sqrt((double)(2)); Ld[11]=-0.050256540092/(double)sqrt((double)(2));
Ld[12]=-0.045240772218/(double)sqrt((double)(2)); Ld[13]=0.070703567550/(double)sqrt((double)(2)); Ld[14]=0.008152816799/(double)sqrt((double)(2));
Ld[15]=-0.028786231926/(double)sqrt((double)(2)); Ld[16]=-0.001137535314/(double)sqrt((double)(2)); Ld[17]=0.006495728375/(double)sqrt((double)(2));
Ld[18]=0.000080661204/(double)sqrt((double)(2)); Ld[19]=-0.000649589896/(double)sqrt((double)(2));
m_wavetransform.m_preoffset=9;
m_wavetransform.m_aftoffset=10;
break;
}
}
break;
case 7://IDC_COIFLETS
Ld[0]=-0.0802861503271*(double)sqrt((double)(2)); Ld[1]=-0.0243085969067*(double)sqrt((double)(2)); Ld[2]=0.362806341593*(double)sqrt((double)(2));
Ld[3]=0.550576616156*(double)sqrt((double)(2)); Ld[4]=0.229036357075*(double)sqrt((double)(2)); Ld[5]=-0.0644368523121*(double)sqrt((double)(2));
Ld[6]=-0.0115565483406*(double)sqrt((double)(2)); Ld[7]=0.0381688330633*(double)sqrt((double)(2));
m_wavetransform.m_preoffset=3;
m_wavetransform.m_aftoffset=4;
break;
}
for(int i=0;i<FWidth;i++)
{
Hd[i]=(double)pow((double)-1,(double)(i+1))*Ld[-i-1+FWidth];
}
for(int i=0;i<FWidth;i++)
{
Lr[i]=Ld[-i-1+FWidth];
Hr[i]=Hd[-i-1+FWidth];
}
}
pDoc->UpdateAllViews(NULL);
EndWaitCursor();
}
void CMyView::OnCompression()
{
// TODO: Add your command handler code here
BeginWaitCursor();
CMyDoc* pDoc = GetDocument();
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
CWaveletLevel leveldlg;
if(leveldlg.DoModal()==IDOK)
{
m_nLevel=leveldlg.m_nlevel;
//分解
m_wavetransform.DIBWavelet(lpDIB,lpDIBBits,Ld,Hd,FWidth,m_nLevel);
pDoc->SetModifiedFlag(TRUE);
pDoc->UpdateAllViews(NULL);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
EndWaitCursor();
}
void CMyView::OnQuantization()
{
// TODO: Add your command handler code here
CMyDoc* pDoc = GetDocument();
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
//量化
int* m_thredhold;
unsigned char* lpSrc;// 指向源图像的指针
double dTemp;
LONG lLineBytes; // 图像每行的字节数
LONG lWidth,lHeight;
lWidth=::DIBWidth(lpDIB);
lHeight=::DIBHeight(lpDIB);
LONG i,j;//循环变量
if(::DIBNumColors(lpDIB)==256)
{
lLineBytes = WIDTHBYTES(lWidth * 8);// 计算图像每行的字节数
CQuantizationDlg dlg;
dlg.m_level=new double[256];
for(i=0;i<256;i++)
dlg.m_level[i]=0;
dlg.m_levelmax=0;
// 从源图像中读取数据。
for(i = 0; i < lHeight; i++)// 每列
{
for(j = 0; j < lWidth; j++)// 每行
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) +j; // 指向DIB第i行,第j个象素的指针
dTemp =*(lpSrc);
dlg.m_level[int(dTemp)]++;
}
}
CString str;
str.Format("%d",int(m_wavetransform.m_GrayMax));
dlg.m_coifmax=str;
str.Format("%d",int(m_wavetransform.m_GrayMin));
dlg.m_coifmin=str;
dlg.m_graymin=m_wavetransform.m_GrayMin;
dlg.m_graymax=m_wavetransform.m_GrayMax;
for(i=0;i<256;i++)
{
dlg.m_level[i]/=(FLOAT(lWidth*lHeight));
dlg.m_levelmax=dlg.m_levelmax>dlg.m_level[i]?dlg.m_levelmax:dlg.m_level[i];
}//以上为绘制灰度直方图
if(dlg.DoModal()==IDOK)
{
m_thredhold=new int;
*m_thredhold=abs(dlg.m_quantization);
m_wavetransform.DIBQuantize(lpDIB,lpDIBBits,m_thredhold);
pDoc->SetModifiedFlag(TRUE);
pDoc->UpdateAllViews(NULL);
delete m_thredhold;
}
}
else
{
CQuantizeColorDlg dlg;
dlg.m_level=new double[256*3];
for(i=0;i<256*3;i++)
dlg.m_level[i]=0;
dlg.m_levelmax[0]=0;
dlg.m_levelmax[1]=0;
dlg.m_levelmax[2]=0;
int ncolor;
for(ncolor=0;ncolor<3;ncolor++)
{
lLineBytes = WIDTHBYTES(lWidth * 24);// 计算图像每行的字节数
// 从源图像中读取数据。
for(i = 0; i < lHeight; i++)// 每列
{
for(j = 0; j < lWidth; j++)// 每行
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) +3*j+ncolor; // 指向DIB第i行,第j个象素的指针
dTemp = *(lpSrc);
dlg.m_level[256*ncolor+int(dTemp)]++;
}
}
}
CString str;
str.Format("%d",int(m_wavetransform.m_ColorMax[0]));
dlg.m_bluemax=str;
str.Format("%d",int(m_wavetransform.m_ColorMin[0]));
dlg.m_bluemin=str;
str.Format("%d",int(m_wavetransform.m_ColorMax[1]));
dlg.m_greenmax=str;
str.Format("%d",int(m_wavetransform.m_ColorMin[1]));
dlg.m_greenmin=str;
str.Format("%d",int(m_wavetransform.m_ColorMax[2]));
dlg.m_redmax=str;
str.Format("%d",int(m_wavetransform.m_ColorMin[2]));
dlg.m_redmin=str;
for(i=0;i<3;i++)
{
dlg.m_colormin[i]=m_wavetransform.m_ColorMin[i];
dlg.m_colormax[i]=m_wavetransform.m_ColorMax[i];
}
for(ncolor=0;ncolor<3;ncolor++)
{
for(i=0;i<256;i++)
{
dlg.m_level[256*ncolor+i]/=(FLOAT(lWidth*lHeight));
dlg.m_levelmax[ncolor]=dlg.m_levelmax[ncolor]>dlg.m_level[256*ncolor+i]?dlg.m_levelmax[ncolor]:dlg.m_level[256*ncolor+i];
}
}//以上为绘制真彩色直方图
if(dlg.DoModal()==IDOK)
{
m_thredhold=new int[3];
m_thredhold[0]=abs(dlg.m_blue);
m_thredhold[1]=abs(dlg.m_green);
m_thredhold[2]=abs(dlg.m_red);
m_wavetransform.DIBQuantize(lpDIB,lpDIBBits,m_thredhold);
pDoc->SetModifiedFlag(TRUE);
pDoc->UpdateAllViews(NULL);
delete m_thredhold;
}
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
}
void CMyView::OnEncoding()
{
// TODO: Add your command handler code here
CMyDoc* pDoc = GetDocument();
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
//编码
double *m_level;//保存各个灰度级的频率
double dTemp;
unsigned char* lpSrc;// 指向源图像的指针
LONG lLineBytes; // 图像每行的字节数
LONG lWidth,lHeight;
lWidth=::DIBWidth(lpDIB);
lHeight=::DIBHeight(lpDIB);
LONG i,j;//循环变量
BeginWaitCursor();
if(::DIBNumColors(lpDIB)==256)
{
lLineBytes = WIDTHBYTES(lWidth * 8);// 计算图像每行的字节数
m_level=new double[256];
for(i=0;i<256;i++)
m_level[i]=0;
// 从源图像中读取数据。
for(i = 0; i < lHeight; i++)// 每列
{
for(j = 0; j < lWidth; j++)// 每行
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) +j; // 指向DIB第i行,第j个象素的指针
dTemp =*(lpSrc);
m_level[int(dTemp)]++;
}
}
for(i=0;i<256;i++)
{
m_level[i]/=(FLOAT(lWidth*lHeight));
}
// 创建对话框
CHaffmanDlg dlgPara;
// 初始化变量值
dlgPara.m_fFreq = m_level;
dlgPara.m_iColorNum = 256;
// 显示对话框
dlgPara.DoModal();
delete m_level;
}
else
{
m_level=new double[256*3];
for(i=0;i<256*3;i++)
m_level[i]=0;
int ncolor;
for(ncolor=0;ncolor<3;ncolor++)
{
lLineBytes = WIDTHBYTES(lWidth * 24);// 计算图像每行的字节数
// 从源图像中读取数据。
for(i = 0; i < lHeight; i++)// 每列
{
for(j = 0; j < lWidth; j++)// 每行
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) +3*j+ncolor; // 指向DIB第i行,第j个象素的指针
dTemp = *(lpSrc);
m_level[256*ncolor+int(dTemp)]++;
}
}
}
for(ncolor=0;ncolor<3;ncolor++)
{
for(i=0;i<256;i++)
{
m_level[256*ncolor+i]/=(FLOAT(lWidth*lHeight*3));
}
}
//将具有相同灰度级的红、绿、蓝通道的频率加起来作为这一灰度级的频率进行编码。
for(i=0;i<256;i++)
{
m_level[i]+=m_level[256+i];
m_level[i]+=m_level[256*2+i];
}
// 创建对话框
CHaffmanDlg dlgPara;
// 初始化变量值
dlgPara.m_fFreq = m_level;
dlgPara.m_iColorNum = 256;
// 显示对话框
dlgPara.DoModal();
delete m_level;
}
EndWaitCursor();
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
}
void CMyView::OnDecoding()
{
// TODO: Add your command handler code here
CMyDoc* pDoc = GetDocument();
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
//解码
//实现过程
pDoc->SetModifiedFlag(TRUE);
pDoc->UpdateAllViews(NULL);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
}
void CMyView::OnDiscompression()
{
// TODO: Add your command handler code here
CMyDoc* pDoc = GetDocument();
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
//重建
m_wavetransform.DIBDisWavelet(lpDIB,lpDIBBits,Lr,Hr,FWidth,m_nLevel);
pDoc->SetModifiedFlag(TRUE);
pDoc->UpdateAllViews(NULL);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -