📄 wvlttrans.cpp
字号:
}
//为指定目录下的所有bmp图像加载二值水印
void CWvltTrans::loadWaterMarkToLib(CString bmpPath)
{
CString Path = bmpPath + "\\加水印后图像\\" ;//保存加载水印后的图像路径
CString CoeffChoosedSavePath = Path + "选择的系数\\" ;
CString libRoot = bmpPath + "\\*.bmp";
CFileFind findch1;
BOOL bfindresult = findch1.FindFile(libRoot);
while(bfindresult )//目录下有BMP文件
{
bfindresult = findch1.FindNextFile();//下一个文件
CString CurrentFile = findch1.GetFilePath();
int pos = CurrentFile.ReverseFind('\\');
picName = CurrentFile.Mid(pos+1);//取到当前文件名
SavePath = Path + picName;
if (!ReadBitmap(CurrentFile, m_pBitmap))
{
AfxMessageBox("读取原始文件" + CurrentFile + "错误!");
break;
}
//分配缓冲区
pY = new float* [biHeight];
pU = new float* [biHeight];
pV = new float* [biHeight];
for(int i = 0; i < biHeight; i ++)
{
pY[i] = new float [biWidth];
pU[i] = new float [biWidth];
pV[i] = new float [biWidth];
}
RGBToYUV(m_pBitmap,pY,pU, pV);//将原始图像数据分解成Y、U、V,此函数中为PY、PU、PV分配内存
int pos2 = picName.ReverseFind('.');
CString picTitle = picName.Left(pos2);//不含扩展名的文件名
int x,y;
float **spTransData0, **spTransData1;
//分配图像小波变换的数据内存空间
spTransData0 = new float* [biHeight];
spTransData1 = new float* [biHeight];
m_WvltCoeff = new float * [biHeight];//存放小波变换后系数
for(i = 0; i < biHeight; i ++)
{
spTransData0[i] = new float [biWidth];
spTransData1[i] = new float [biWidth];
m_WvltCoeff[i] = new float [biWidth];
}
//完成图像的三次小波变换
DWT_nLayers(pY,spTransData0,spTransData1,biHeight,biHeight/2,biWidth,biWidth/2,3,(float)1.414);
//得到小波系数的极大值和极小值
for( y=0; y<biHeight; y++)
{
for( x=0; x<biWidth; x++)
{
m_WvltCoeff[y][x] = spTransData1[y][x];//得到三次小波变换后的系数
}
}
//为DWT各子带及选择的加载水印的系数、加载水印后的系数及小波逆变换后的系数分配缓冲区
allocBuffers();
ChooseCoeffByWholeThreshold();//选择要加载水印的系数,此函数中将小波变换后系数分成各子带
//将当前图像的选定系数写到文件中,每个文件名对应一个选定系数
CString strFilePath = CoeffChoosedSavePath + picTitle + ".txt";
WriteFile(strFilePath,CoeffChoosed,biHeight,biWidth);//(大部分值为0)
// p[nfile].CoeffChoosed = pic.CoeffChoosed;
//保存当前图像的图像名-嵌入位置结构体MAP
// MAP_PicName_LoadPlace.insert(pair<CString,picture>(picTitle,pic));
//nfile++;
LoadWaterMark();//加载二值水印
//对加载过水印的系数进行小波逆变换
DWT_Inverse(biHeight,biWidth,3,CoeffAfterLoad,CoeffIDWT);
unsigned char* RGBData = new BYTE [biHeight*biAlign];
if(RGBData == NULL)
{
AfxMessageBox("分配存放合成Y、U、V后的RGB空间失败!");
return;
}
YUVToRGB(CoeffIDWT,pU,pV,RGBData,biHeight,biWidth,biAlign);//恢复加载水印后图像为彩色图像
FileSaveAs(SavePath,BFH,BIH,RGBData,bmSize);//将加载水印后的数据另存为bmp图像
delete []RGBData;
RGBData = NULL;
freeBuffers();
//释放空间
for(i = 0; i < biHeight; i++)
{
delete []m_WvltCoeff[i];
delete []spTransData0[i] ;
delete []spTransData1[i] ;
m_WvltCoeff[i] = NULL;
spTransData0[i] = NULL;
spTransData1[i] = NULL;
}
delete []m_WvltCoeff;
delete []spTransData0;
delete []spTransData1;
spTransData0 = NULL;
spTransData1 = NULL;
m_WvltCoeff = NULL;
if( m_pBitmap != NULL)
{
delete []m_pBitmap;
m_pBitmap = NULL;
}
for(i=0; i<biHeight; i++)
{
delete []pY[i];
delete []pU[i];
delete []pV[i];
pY[i] = NULL;
pU[i] = NULL;
pV[i] = NULL;
}
delete []pY;
delete []pU;
delete []pV;
pY = NULL;
pU = NULL;
pV = NULL;
}//end while
findch1.Close();
AfxMessageBox("所有图像加载水印完毕!");
}
//为DWT各子带及水印所用缓冲区分配内存
void CWvltTrans::allocBuffers()
{
LL1 = new float* [biHeight];//只进行一层变换时用
LL2 = new float* [biHeight];//进行两层小波变换时用
LL3 = new float* [biHeight];
LH1 = new float* [biHeight];
LH2 = new float* [biHeight];
LH3 = new float* [biHeight];
HL1 = new float* [biHeight];
HL2 = new float* [biHeight];
HL3 = new float* [biHeight];
HH1 = new float* [biHeight];
HH2 = new float* [biHeight];
HH3 = new float* [biHeight];
CoeffAfterLoad = new float* [biHeight];//存放加载水印后的系数
CoeffIDWT = new float* [biHeight];//3层小波逆变换后的系数
CoeffChoosed = new float* [biHeight];//存放选出的待加载水印的系数
// pic.CoeffChoosed = new float* [biHeight];//存放选出的待加载水印的系数,此系数在加载水印时被修改了
//WaterMarkOrigin = new int [MarkLength];//一维数组,存放原始水印信息(二值信息)
for(int i = 0; i < biHeight; i ++)
{
LL1[i] = new float [biWidth];
LL2[i] = new float [biWidth];
LL3[i] = new float [biWidth];
LH1[i] = new float [biWidth];
LH2[i] = new float [biWidth];
LH3[i] = new float [biWidth];
HL1[i] = new float [biWidth];
HL2[i] = new float [biWidth];
HL3[i] = new float [biWidth];
HH1[i] = new float [biWidth];
HH2[i] = new float [biWidth];
HH3[i] = new float [biWidth];
CoeffChoosed[i] = new float [biWidth];
CoeffAfterLoad[i] = new float [biWidth];
CoeffIDWT[i] = new float [biWidth];
}
}
void CWvltTrans::freeBuffers()
{
for(int i = 0; i < biHeight; i ++)
{
delete []LL1[i] ;
delete []LL2[i] ;
delete []LL3[i] ;
delete []LH1[i] ;
delete []LH2[i] ;
delete []LH3[i] ;
delete []HL1[i] ;
delete []HL2[i] ;
delete []HL3[i] ;
delete []HH1[i] ;
delete []HH2[i] ;
delete []HH3[i] ;
delete []CoeffAfterLoad[i];
delete []CoeffIDWT[i];
LL1[i] = NULL;
LL2[i] = NULL;
LL3[i] = NULL;
LH1[i] = NULL;
LH2[i] = NULL;
LH3[i] = NULL;
HL1[i] = NULL;
HL2[i] = NULL;
HL3[i] = NULL;
HH1[i] = NULL;
HH2[i] = NULL;
HH3[i] = NULL;
CoeffAfterLoad[i] = NULL;
CoeffIDWT[i] = NULL;
}
delete []CoeffAfterLoad;
delete []CoeffIDWT;
delete []LL1 ;
delete []LL2 ;
delete []LL3 ;
delete []LH1 ;
delete []LH2 ;
delete []LH3 ;
delete []HL1 ;
delete []HL2 ;
delete []HL3 ;
delete []HH1 ;
delete []HH2 ;
delete []HH3 ;
LL1 = NULL;
LL2 = NULL;
LL3 = NULL;
LH1 = NULL;
LH2 = NULL;
LH3 = NULL;
HL1 = NULL;
HL2 = NULL;
HL3 = NULL;
HH1 = NULL;
HH2 = NULL;
HH3 = NULL;
CoeffAfterLoad = NULL;
CoeffIDWT = NULL;
}
//将系数分割为各子带系数
void CWvltTrans::CoeffPartition()
{
//allocBuffers();
//为各子带系数数组赋初值
for(int i=0; i<biHeight; i++)
{
for(int j=0; j<biWidth; j++)
{
LL1[i][j] = 0.0;
LL2[i][j] = 0.0;
LL3[i][j] = 0.0;
LH1[i][j] = 0.0;
LH2[i][j] = 0.0;
LH3[i][j] = 0.0;
HL1[i][j] = 0.0;
HL2[i][j] = 0.0;
HL3[i][j] = 0.0;
HH1[i][j] = 0.0;
HH2[i][j] = 0.0;
HH3[i][j] = 0.0;
}
}
if(layer = 3)
{
for(int i=0; i<biHeight; i++)//控制行
{
for(int j=0; j<biWidth; j++)//控制列
{
if(i< (biHeight>>layer))
{
if(j< (biWidth>>layer))
{
LL3[i][j] = m_WvltCoeff[i][j];//将变换后的系数保存到各个子带,10.10有错?
}
else if( j>(biWidth>>layer)-1 && j< biWidth>>(layer-1) )
{
HL3[i][j] = m_WvltCoeff[i][j];
}
else if(j> (biWidth>>(layer-1))-1 && j< biWidth>>(layer-2))
{
HL2[i][j] = m_WvltCoeff[i][j];
}
else
{
HL1[i][j] = m_WvltCoeff[i][j];
}
}
else if( i> (biHeight>>layer)-1 && i< biHeight>>(layer-1) )
{
if(j< (biWidth>>layer))
{
LH3[i][j] = m_WvltCoeff[i][j];//将变换后的系数保存到各个子带
}
else if( j>(biWidth>>layer)-1 && j< biWidth>>(layer-1) )
{
HH3[i][j] = m_WvltCoeff[i][j];
}
else if(j> (biWidth>>(layer-1))-1 && j< biWidth>>(layer-2))
{
HL2[i][j] = m_WvltCoeff[i][j];
}
else
{
HL1[i][j] = m_WvltCoeff[i][j];
}
}
else if(i> (biHeight>>(layer-1))-1 && i< biHeight>>(layer-2))
{
if(j < biWidth>>(layer-1))
{
LH2[i][j] = m_WvltCoeff[i][j];
}
else if(j > (biWidth>>(layer-1))-1 && j < biWidth>>(layer-2))
{
HH2[i][j] = m_WvltCoeff[i][j];
}
else
{
HL1[i][j] = m_WvltCoeff[i][j];
}
}
else
{
if(j < biWidth>>(layer-2))
{
LH1[i][j] = m_WvltCoeff[i][j];
}
else
{
HH1[i][j] = m_WvltCoeff[i][j];
}
}
}
}
}
else if(layer = 2)
{
for(int i=0; i<biHeight; i++)//控制行
{
for(int j=0; j<biWidth; j++)//控制列
{
if(i< (biHeight>>layer))
{
if(j< (biWidth>>layer))
{
LL2[i][j] = m_WvltCoeff[i][j];//将变换后的系数保存到各个子带
}
else if( j>(biWidth>>layer)-1 && j< biWidth>>(layer-1) )
{
HL2[i][j] = m_WvltCoeff[i][j];
}
else
{
HL1[i][j] = m_WvltCoeff[i][j];
}
}
else if( i> (biHeight>>layer)-1 && i< biHeight>>(layer-1) )
{
if(j< (biWidth>>layer))
{
LH2[i][j] = m_WvltCoeff[i][j];//将变换后的系数保存到各个子带
}
else if( j>(biWidth>>layer)-1 && j< biWidth>>(layer-1) )
{
HH2[i][j] = m_WvltCoeff[i][j];
}
else
{
HL1[i][j] = m_WvltCoeff[i][j];
}
}
else
{
if(j < biWidth>>(layer-1))
{
LH1[i][j] = m_WvltCoeff[i][j];
}
else
{
HH1[i][j] = m_WvltCoeff[i][j];
}
}
}
}
}
else if(layer = 1)
{
for(int i=0; i<biHeight; i++)//控制行
{
for(int j=0; j<biWidth; j++)//控制列
{
if(i< (biHeight>>layer))
{
if(j< (biWidth>>layer))
{
LL1[i][j] = m_WvltCoeff[i][j];//将变换后的系数保存到各个子带
}
else
{
HL1[i][j] = m_WvltCoeff[i][j];
}
}
else
{
if(j < biWidth>>layer)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -