?? wvlttransdib2.cpp
字號:
//從設備緩存中獲得原始圖像數據
for(j=0; j<(int)height; j++)
{
for( i=0; i<(int)width; i++)
{
b=m_pData[(j+height*3)*lLineBytes+3*i];
g=m_pData[(j+height*3)*lLineBytes+3*i+1];
r=m_pData[(j+height*3)*lLineBytes+3*i+2];
temp1[(height-1-j)*width+i]=(BYTE)(0.3*r+0.59*g+0.11*b);
}
}
for(j = 0; j < height; j ++)
{
for(i = 0; i < nWidth; i ++)
{
int w = i *2;
temp2[j*width+i] = (temp1[j*width+w]); //偶
temp2[j*width+nWidth+i] = (temp1[j*width+w+1]); //奇
}
}
//通過圖像的差分,完成小波變換
for(j=0; j<height; j++)
{
for(i=0; i<nWidth-1; i++)
{
temp2[j*width+nWidth+i] -= temp2[j*width+i]+128;
}
}
for(i=0;i<nWidth;i++)
{
for(j=0;j<nHeight;j++)
{
int h=j*2;
temp3[j*width+i]=temp2[h*width+i];//左上
temp3[(j+nHeight)*width+i]=temp2[(h+1)*width+i];//左下
temp3[j*width+nWidth+i]=temp2[h*width+nWidth+i];//右上
temp3[(j+nWidth)*width+nWidth+i]=temp2[(h+1)*width+nWidth+i];//右下
}
for(j=0;j<nHeight;j++)
{
temp3[(j+nHeight)*width+i]-= temp3[j*width+i]+128;
temp3[(j+nHeight)*width+nWidth+i]-= temp3[j*width+nWidth+i]+128;
}
}
maxVal=temp3[0*width+0];
minVal=temp3[0*width+0];
//得到圖像小波系數的極大值與極小值
for( j=0; j<(int)height; j++)
{
for( i=0; i<(int)width; i++)
{
if(maxVal<temp3[j*width+i])
maxVal=temp3[j*width+i];
if(minVal>temp3[j*width+i])
minVal=temp3[j*width+i];
}
}
//計算獲取圖像小波系數的極值差
difVal=maxVal-minVal;
//小波經過處理后,放入顯示緩存中
for(j=0; j<(int)height; j++)
{
for(i=0; i<(int)width; i++)
{
//因為小波變換后的小波系數有可能超過255甚至更多,那么就將
//小波系數的范圍映射到0~255區間內,以后出現類似的處理,目的都是一樣的
tpBuffer=temp3[(height-1-j)*width+i];
tpBuffer-=minVal;
tpBuffer*=255;
tpBuffer/=difVal;
m_pData[(j+height*3)*lLineBytes+3*i] = (BYTE)tpBuffer;
m_pData[(j+height*3)*lLineBytes+3*i+1]= (BYTE)tpBuffer;
m_pData[(j+height*3)*lLineBytes+3*i+2]= (BYTE)tpBuffer;
}
}
//刪除臨時的數據空間
delete temp1;
delete temp2;
delete temp3;
layer3=TRUE;
}
void CWvltTransDib::IDWT()
{
if ((layer1==TRUE)||(layer2==TRUE)||(layer3==TRUE))
{
if(layer3)
IDWT_Thrice();
if(layer2)
IDWT_Twice();
if(layer1)
IDWT_Once();
}
else
AfxMessageBox("請先做小波變換。",MB_OK,NULL);
}
void CWvltTransDib::IDWT_Once()
{
int i,j;
LONG width,height,nWidth,nHeight;
BYTE r, g, b;
LPBYTE temp1, temp2,temp3;
float tpBuffer;
short maxVal,minVal,difVal;
width=this->GetWidth();
height=this->GetHeight();
nWidth=width/2;
nHeight=height/2;
LONG lLineBytes = (width*3+3)/4 *4;
//分配臨時數據空間
temp1 = new BYTE[height*width];
temp2 = new BYTE[height*width];
temp3 = new BYTE[height*width];
memset(temp1,0,height*width);
memset(temp2,0,height*width);
memset(temp3,0,height*width);
//從設備緩存中獲得原始圖像數據
for(j=0; j<(int)height; j++)
{
for( i=0; i<(int)width; i++)
{
b=m_pData[j*lLineBytes+3*i];
g=m_pData[j*lLineBytes+3*i+1];
r=m_pData[j*lLineBytes+3*i+2];
temp1[(height-1-j)*width+i]=(BYTE)(0.3*r+0.59*g+0.11*b);
}
}
for(j=0; j<nHeight; j++)
{
for( i=0; i<width; i++)
{
int h=j*2;
temp2[h*width+i]=temp1[j*width+i];
temp2[(h+1)*width+i]=temp1[j*width+i]+temp1[(j+nHeight)*width+i]-128;
}
}
for( i=0; i<nWidth-1; i++)
{
for(j=0; j<height; j++)
{
int w=i*2;
temp3[j*width+w]=temp2[j*width+i];
temp3[j*width+w+1]=temp2[j*width+i]+temp2[j*width+nWidth+i]-128;
}
}
maxVal=temp3[0*width+0];
minVal=temp3[0*width+0];
//得到圖像小波系數的極大值與極小值
for( j=0; j<(int)height; j++)
{
for( i=0; i<(int)width; i++)
{
if(maxVal<temp3[j*width+i])
maxVal=temp3[j*width+i];
if(minVal>temp3[j*width+i])
minVal=temp3[j*width+i];
}
}
//計算獲取圖像小波系數的極值差
difVal=maxVal-minVal;
//小波經過處理后,放入顯示緩存中
for(j=0; j<(int)height; j++)
{
for(i=0; i<(int)width; i++)
{
//因為小波變換后的小波系數有可能超過255甚至更多,那么就將
//小波系數的范圍映射到0~255區間內,以后出現類似的處理,目的都是一樣的
tpBuffer=temp3[(height-1-j)*width+i];
tpBuffer-=minVal;
tpBuffer*=255;
tpBuffer/=difVal;
m_pData[j*lLineBytes+3*i] = (BYTE)tpBuffer;
m_pData[j*lLineBytes+3*i+1]= (BYTE)tpBuffer;
m_pData[j*lLineBytes+3*i+2]= (BYTE)tpBuffer;
}
}
//刪除臨時的數據空間
delete temp1;
delete temp2;
delete temp3;
layer1=FALSE;
}
void CWvltTransDib::IDWT_Twice()
{
int i,j;
LONG width,height,nWidth,nHeight;
BYTE r, g, b;
LPBYTE temp1, temp2,temp3;
float tpBuffer;
short maxVal,minVal,difVal;
width=this->GetWidth()/2;
height=this->GetHeight()/2;
nWidth=width/2;
nHeight=height/2;
LONG lLineBytes = (this->GetWidth()*3+3)/4 *4;
//分配臨時數據空間
temp1 = new BYTE[height*width];
temp2 = new BYTE[height*width];
temp3 = new BYTE[height*width];
memset(temp1,0,height*width);
memset(temp2,0,height*width);
memset(temp3,0,height*width);
//從設備緩存中獲得原始圖像數據
for(j=0; j<(int)height; j++)
{
for( i=0; i<(int)width; i++)
{
b=m_pData[(j+height)*lLineBytes+3*i];
g=m_pData[(j+height)*lLineBytes+3*i+1];
r=m_pData[(j+height)*lLineBytes+3*i+2];
temp1[(height-1-j)*width+i]=(BYTE)(0.3*r+0.59*g+0.11*b);
}
}
for(j=0; j<nHeight; j++)
{
for( i=0; i<width; i++)
{
int h=j*2;
temp2[h*width+i]=temp1[j*width+i];
temp2[(h+1)*width+i]=temp1[j*width+i]+temp1[(j+nHeight)*width+i]-128;
}
}
for( i=0; i<nWidth-1; i++)
{
for(j=0; j<height; j++)
{
int w=i*2;
temp3[j*width+w]=temp2[j*width+i];
temp3[j*width+w+1]=temp2[j*width+i]+temp2[j*width+nWidth+i]-128;
}
}
maxVal=temp3[0*width+0];
minVal=temp3[0*width+0];
//得到圖像小波系數的極大值與極小值
for( j=0; j<(int)height; j++)
{
for( i=0; i<(int)width; i++)
{
if(maxVal<temp3[j*width+i])
maxVal=temp3[j*width+i];
if(minVal>temp3[j*width+i])
minVal=temp3[j*width+i];
}
}
//計算獲取圖像小波系數的極值差
difVal=maxVal-minVal;
//小波經過處理后,放入顯示緩存中
for(j=0; j<(int)height; j++)
{
for(i=0; i<(int)width; i++)
{
//因為小波變換后的小波系數有可能超過255甚至更多,那么就將
//小波系數的范圍映射到0~255區間內,以后出現類似的處理,目的都是一樣的
tpBuffer=temp3[(height-1-j)*width+i];
tpBuffer-=minVal;
tpBuffer*=255;
tpBuffer/=difVal;
m_pData[(j+height)*lLineBytes+3*i] = (BYTE)tpBuffer;
m_pData[(j+height)*lLineBytes+3*i+1]= (BYTE)tpBuffer;
m_pData[(j+height)*lLineBytes+3*i+2]= (BYTE)tpBuffer;
}
}
//刪除臨時的數據空間
delete temp1;
delete temp2;
delete temp3;
layer2=FALSE;
}
void CWvltTransDib::IDWT_Thrice()
{
int i,j;
LONG width,height,nWidth,nHeight;
BYTE r, g, b;
LPBYTE temp1, temp2,temp3;
float tpBuffer;
short maxVal,minVal,difVal;
width=this->GetWidth()/4;
height=this->GetHeight()/4;
nWidth=width/2;
nHeight=height/2;
LONG lLineBytes = (this->GetWidth()*3+3)/4 *4;
//分配臨時數據空間
temp1 = new BYTE[height*width];
temp2 = new BYTE[height*width];
temp3 = new BYTE[height*width];
memset(temp1,0,height*width);
memset(temp2,0,height*width);
memset(temp3,0,height*width);
//從設備緩存中獲得原始圖像數據
for(j=0; j<(int)height; j++)
{
for( i=0; i<(int)width; i++)
{
b=m_pData[(j+height*3)*lLineBytes+3*i];
g=m_pData[(j+height*3)*lLineBytes+3*i+1];
r=m_pData[(j+height*3)*lLineBytes+3*i+2];
temp1[(height-1-j)*width+i]=(BYTE)(0.3*r+0.59*g+0.11*b);
}
}
for(j=0; j<nHeight; j++)
{
for( i=0; i<width; i++)
{
int h=j*2;
temp2[h*width+i]=temp1[j*width+i];
temp2[(h+1)*width+i]=temp1[j*width+i]+temp1[(j+nHeight)*width+i]-128;
}
}
for( i=0; i<nWidth-1; i++)
{
for(j=0; j<height; j++)
{
int w=i*2;
temp3[j*width+w]=temp2[j*width+i];
temp3[j*width+w+1]=temp2[j*width+i]+temp2[j*width+nWidth+i]-128;
}
}
maxVal=temp3[0*width+0];
minVal=temp3[0*width+0];
//得到圖像小波系數的極大值與極小值
for( j=0; j<(int)height; j++)
{
for( i=0; i<(int)width; i++)
{
if(maxVal<temp3[j*width+i])
maxVal=temp3[j*width+i];
if(minVal>temp3[j*width+i])
minVal=temp3[j*width+i];
}
}
//計算獲取圖像小波系數的極值差
difVal=maxVal-minVal;
//小波經過處理后,放入顯示緩存中
for(j=0; j<(int)height; j++)
{
for(i=0; i<(int)width; i++)
{
//因為小波變換后的小波系數有可能超過255甚至更多,那么就將
//小波系數的范圍映射到0~255區間內,以后出現類似的處理,目的都是一樣的
tpBuffer=temp3[(height-1-j)*width+i];
tpBuffer-=minVal;
tpBuffer*=255;
tpBuffer/=difVal;
m_pData[(j+height*3)*lLineBytes+3*i] = (BYTE)tpBuffer;
m_pData[(j+height*3)*lLineBytes+3*i+1]= (BYTE)tpBuffer;
m_pData[(j+height*3)*lLineBytes+3*i+2]= (BYTE)tpBuffer;
}
}
//刪除臨時的數據空間
delete temp1;
delete temp2;
delete temp3;
layer3=FALSE;
}
void CWvltTransDib::LowFilter()
{
int i,j;
LONG width,height,nWidth,nHeight;
width=this->GetWidth();
height=this->GetHeight();
nWidth=width/2;
nHeight=height/2;
LONG lLineBytes = (width*3+3)/4 *4;
Once();
for(j=0;j<height;j++)
{
for(i=0;i<width;i++)
{
if(!((i<nWidth)&&(j>nHeight)))
{
m_pData[j*lLineBytes+3*i] = (BYTE)128;
m_pData[j*lLineBytes+3*i+1]= (BYTE)128;
m_pData[j*lLineBytes+3*i+2]= (BYTE)128;
}
}
}
IDWT_Once();
}
void CWvltTransDib::HighFilter()
{
int i,j;
LONG width,height,nWidth,nHeight;
width=this->GetWidth();
height=this->GetHeight();
nWidth=width/2;
nHeight=height/2;
LONG lLineBytes = (width*3+3)/4 *4;
Once();
for(j=0;j<height;j++)
{
for(i=0;i<width;i++)
{
if((i<nWidth)&&(j>nHeight))
{
m_pData[j*lLineBytes+3*i] = (BYTE)128;
m_pData[j*lLineBytes+3*i+1]= (BYTE)128;
m_pData[j*lLineBytes+3*i+2]= (BYTE)128;
}
}
}
IDWT_Once();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -