📄 diproc.cpp
字号:
for(int a = -1; a <= 1; a++)
{
for(int b= -1; b <= 1; b++)
{
if( (y+a) < Scan_y || (x+b) < Scan_x || (y+a) >= End_y || (x+b) >= End_x)
{
SUM0 += 0;
SUM1 += 0;
}
else
{
SUM0 += (spWvltData0[y + a][x + b]-WndSum0)*(spWvltData0[y + a][x + b]-WndSum0);
SUM1 += (spWvltData1[y + a][x + b]-WndSum1)*(spWvltData1[y + a][x + b]-WndSum1);
}
}
}
if(SUM0<SUM1)
spWvltData0[y][x]=spWvltData1[y][x];
// if(WndSum0<WndSum1)
//spWvltData0[y][x]=spWvltData1[y][x];
}
}
}
void CDiproc::Window_WvltFusionQY(short **spWvltData0, short **spWvltData1, int Scan_y, int Scan_x, int End_y, int End_x)
{
int y,x; float M;
int W;
short WndSum0, WndSum1,WndSum2;
for(y = Scan_y; y < End_y; y ++)
{
for(x = Scan_x; x < End_x; x ++)
{
//初始化窗口中小波系数的和
WndSum0 = 0; WndSum1 = 0; WndSum2=0;
M=0.0; W=0;
//计算窗口中小波系数的和
for(int i = -1; i <= 1; i++)
{
for(int j = -1; j <= 1; j++)
{
if( (y+i) < Scan_y || (x+j) < Scan_x || (y+i) >= End_y || (x+j) >= End_x)
{
WndSum0 += 0;
WndSum1 += 0;
}
else
{
WndSum0 += ((int)spWvltData0[y + i][x + j])*((int)spWvltData0[y + i][x + j]);
WndSum1 += ((int)spWvltData1[y + i][x + j])*((int)spWvltData1[y + i][x + j]);
WndSum2 += ((int)spWvltData0[y + i][x + j])*((int)spWvltData1[y + i][x + j]);
}
}
}
/* M=(2*WndSum2)/(float)(WndSum1+WndSum0);
if(abs(M)>=0.3)
if(WndSum0>=WndSum1)
W=0.5+0.5*((1-M)/(1-0.3));
else
W=0.5-0.5*((1-M)/(1-0.3));
else
if(WndSum0>=WndSum1)
W=1;
else
W=0;*/
spWvltData0[y][x]=0.5*spWvltData0[y][x]+0.5*spWvltData1[y][x];
}
}
}
void CDiproc::DIP_ImageFusion2(short **spImgData0, short **spImgData1, int nHeight, int nWidth)
{
int iHeight = nHeight, iWidth = nWidth;
//图像融合所用到的数据空间及数据指针
short **spOriginData, **spTransData, **spWvltData0, **spWvltData1;
//分配数据空间
spTransData = new short *[iHeight];
spWvltData0 = new short *[iHeight];
spWvltData1 = new short *[iHeight];
for(int i = 0; i < iWidth; i ++)
{
spTransData[i] = new short [iWidth];
spWvltData0[i] = new short [iWidth];
spWvltData1[i] = new short [iWidth];
}
//创建小波变换类,完成图像的小波变换
CWvltTrans *pTrans;
//获得图像数据空间的指针,完成小波变换
spOriginData = spImgData0;
//三层小波变换
pTrans->DWT_TriLayers(spOriginData, spTransData, spWvltData0, iHeight, iHeight / 2, iWidth, iWidth / 2, 3, 1.414);
//获得图像数据空间的指针,完成另一幅图像的小波变换
spOriginData = spImgData1;
//三层小波变换
pTrans->DWT_TriLayers(spOriginData, spTransData, spWvltData1, iHeight,iHeight / 2, iWidth, iWidth / 2, 3, 1.414);
//小波系数的融合处理:频带有LL3,LH3,HL3,HH3,LH2,HL2,HH2,LH1,HL1,HH1
//融合处理将分频带进行,处理方法采用的是3*3的窗口
//LL3频带小波系数的融合
Window_WvltFusionH(spWvltData0, spWvltData1, 0, 0, iHeight / 8, iWidth / 8);
//HL3频带小波系数的融合
Window_WvltFusionQ(spWvltData0, spWvltData1, 0, iWidth / 8, iHeight / 8, iWidth / 4);
//LH3频带小波系数的融合
Window_WvltFusionQ(spWvltData0, spWvltData1, iHeight / 8, 0, iHeight / 4, iWidth / 8);
//HH3频带小波系数的融合
Window_WvltFusionQ(spWvltData0, spWvltData1, iHeight / 8, iWidth / 8, iHeight / 4, iWidth / 4);
//HL2频带小波系数的融合
Window_WvltFusionQ(spWvltData0, spWvltData1, 0, iWidth / 4, iHeight / 4, iWidth / 2);
//LH2频带小波系数的融合
Window_WvltFusionQ(spWvltData0, spWvltData1, iHeight / 4, 0, iHeight / 2, iWidth / 4);
//HH2频带小波系数Q的融合
Window_WvltFusionQ(spWvltData0, spWvltData1, iHeight / 4, iWidth / 4, iHeight / 2, iWidth / 2);
//HL1频带小波系数的融合
Window_WvltFusionQ(spWvltData0, spWvltData1, 0, iWidth / 2, iHeight / 2, iWidth);
//LH1频带小波系数的融合
Window_WvltFusionQ(spWvltData0, spWvltData1, iHeight / 2, 0, iHeight, iWidth / 2);
//HH1频带小波系数的融合
Window_WvltFusionQ(spWvltData0, spWvltData1, iHeight / 2, iWidth / 2, iHeight, iWidth);
//将融合后的小波系数复原,完成图像的融合
DIP_WvltRevers(spOriginData, spTransData, spWvltData0, iHeight, iHeight / 2, iWidth, iWidth / 2, 3, 1.414);
//释放临时的数据空间
//delete spTransData;
//delete spWvltData0;
//delete spWvltData1;
}
void CDiproc::DIP_ImageFusion3(short **spImgData0, short **spImgData1, int nHeight, int nWidth)
{
int iHeight = nHeight, iWidth = nWidth;
//图像融合所用到的数据空间及数据指针
short **spOriginData, **spTransData, **spWvltData0, **spWvltData1;
//分配数据空间
spTransData = new short *[iHeight];
spWvltData0 = new short *[iHeight];
spWvltData1 = new short *[iHeight];
for(int i = 0; i < iWidth; i ++)
{
spTransData[i] = new short [iWidth];
spWvltData0[i] = new short [iWidth];
spWvltData1[i] = new short [iWidth];
}
//创建小波变换类,完成图像的小波变换
CWvltTrans *pTrans;
//获得图像数据空间的指针,完成小波变换
spOriginData = spImgData0;
//三层小波变换
pTrans->DWT_TriLayers(spOriginData, spTransData, spWvltData0, iHeight, iHeight / 2, iWidth, iWidth / 2, 3, 1.414);
//获得图像数据空间的指针,完成另一幅图像的小波变换
spOriginData = spImgData1;
//三层小波变换
pTrans->DWT_TriLayers(spOriginData, spTransData, spWvltData1, iHeight,iHeight / 2, iWidth, iWidth / 2, 3, 1.414);
//小波系数的融合处理:频带有LL3,LH3,HL3,HH3,LH2,HL2,HH2,LH1,HL1,HH1
//融合处理将分频带进行,处理方法采用的是3*3的窗口
//LL3频带小波系数的融合
Window_WvltFusionH(spWvltData0, spWvltData1, 0, 0, iHeight / 8, iWidth / 8);
//HL3频带小波系数的融合
Window_WvltFusionQY(spWvltData0, spWvltData1, 0, iWidth / 8, iHeight / 8, iWidth / 4);
//LH3频带小波系数的融合
Window_WvltFusionQY(spWvltData0, spWvltData1, iHeight / 8, 0, iHeight / 4, iWidth / 8);
//HH3频带小波系数的融合
Window_WvltFusionQY(spWvltData0, spWvltData1, iHeight / 8, iWidth / 8, iHeight / 4, iWidth / 4);
//HL2频带小波系数的融合
Window_WvltFusionQY(spWvltData0, spWvltData1, 0, iWidth / 4, iHeight / 4, iWidth / 2);
//LH2频带小波系数的融合
Window_WvltFusionQY(spWvltData0, spWvltData1, iHeight / 4, 0, iHeight / 2, iWidth / 4);
//HH2频带小波系数Q的融合
Window_WvltFusionQY(spWvltData0, spWvltData1, iHeight / 4, iWidth / 4, iHeight / 2, iWidth / 2);
//HL1频带小波系数的融合
Window_WvltFusionQY(spWvltData0, spWvltData1, 0, iWidth / 2, iHeight / 2, iWidth);
//LH1频带小波系数的融合
Window_WvltFusionQY(spWvltData0, spWvltData1, iHeight / 2, 0, iHeight, iWidth / 2);
//HH1频带小波系数的融合
Window_WvltFusionQY(spWvltData0, spWvltData1, iHeight / 2, iWidth / 2, iHeight, iWidth);
//将融合后的小波系数复原,完成图像的融合
DIP_WvltRevers(spOriginData, spTransData, spWvltData0, iHeight, iHeight / 2, iWidth, iWidth / 2, 3, 1.414);
//释放临时的数据空间
//delete spTransData;
//delete spWvltData0;
//delete spWvltData1;
}
void CDiproc::DIP_ImageFusion4(short **spImgData0, short **spImgData1, int nHeight, int nWidth)
{
int iHeight = nHeight, iWidth = nWidth;
//图像融合所用到的数据空间及数据指针
short **spOriginData, **spTransData, **spWvltData0, **spWvltData1;
//分配数据空间
spTransData = new short *[iHeight];
spWvltData0 = new short *[iHeight];
spWvltData1 = new short *[iHeight];
for(int i = 0; i < iWidth; i ++)
{
spTransData[i] = new short [iWidth];
spWvltData0[i] = new short [iWidth];
spWvltData1[i] = new short [iWidth];
}
//创建小波变换类,完成图像的小波变换
CWvltTrans *pTrans;
//获得图像数据空间的指针,完成小波变换
spOriginData = spImgData0;
//三层小波变换
pTrans->DWT_TriLayers(spOriginData, spTransData, spWvltData0, iHeight, iHeight / 2, iWidth, iWidth / 2, 3, 1.414);
//获得图像数据空间的指针,完成另一幅图像的小波变换
spOriginData = spImgData1;
//三层小波变换
pTrans->DWT_TriLayers(spOriginData, spTransData, spWvltData1, iHeight,iHeight / 2, iWidth, iWidth / 2, 3, 1.414);
//小波系数的融合处理:频带有LL3,LH3,HL3,HH3,LH2,HL2,HH2,LH1,HL1,HH1
//融合处理将分频带进行,处理方法采用的是3*3的窗口
//LL3频带小波系数的融合
Window_WvltFusion(spWvltData0, spWvltData1, 0, 0, iHeight / 8, iWidth / 8);
//HL3频带小波系数的融合
Window_WvltFusion(spWvltData0, spWvltData1, 0, iWidth / 8, iHeight / 8, iWidth / 4);
//LH3频带小波系数的融合
Window_WvltFusion(spWvltData0, spWvltData1, iHeight / 8, 0, iHeight / 4, iWidth / 8);
//HH3频带小波系数的融合
Window_WvltFusion(spWvltData0, spWvltData1, iHeight / 8, iWidth / 8, iHeight / 4, iWidth / 4);
//HL2频带小波系数的融合
Window_WvltFusion(spWvltData0, spWvltData1, 0, iWidth / 4, iHeight / 4, iWidth / 2);
//LH2频带小波系数的融合
Window_WvltFusion(spWvltData0, spWvltData1, iHeight / 4, 0, iHeight / 2, iWidth / 4);
//HH2频带小波系数Q的融合
Window_WvltFusion(spWvltData0, spWvltData1, iHeight / 4, iWidth / 4, iHeight / 2, iWidth / 2);
//HL1频带小波系数的融合
Window_WvltFusion(spWvltData0, spWvltData1, 0, iWidth / 2, iHeight / 2, iWidth);
//LH1频带小波系数的融合
Window_WvltFusion(spWvltData0, spWvltData1, iHeight / 2, 0, iHeight, iWidth / 2);
//HH1频带小波系数的融合
Window_WvltFusion(spWvltData0, spWvltData1, iHeight / 2, iWidth / 2, iHeight, iWidth);
//将融合后的小波系数复原,完成图像的融合
DIP_WvltRevers(spOriginData, spTransData, spWvltData0, iHeight, iHeight / 2, iWidth, iWidth / 2, 3, 1.414);
//释放临时的数据空间
//delete spTransData;
//delete spWvltData0;
//delete spWvltData1;
}
void CDiproc::DIP_ImageFusion5(short **spImgData0, short **spImgData1, int nHeight, int nWidth)
{
int iHeight = nHeight, iWidth = nWidth;
//图像融合所用到的数据空间及数据指针
short **spOriginData, **spTransData, **spWvltData0, **spWvltData1;
//分配数据空间
spTransData = new short *[iHeight];
spWvltData0 = new short *[iHeight];
spWvltData1 = new short *[iHeight];
for(int i = 0; i < iWidth; i ++)
{
spTransData[i] = new short [iWidth];
spWvltData0[i] = new short [iWidth];
spWvltData1[i] = new short [iWidth];
}
//创建小波变换类,完成图像的小波变换
CWvltTrans *pTrans;
//获得图像数据空间的指针,完成小波变换
spOriginData = spImgData0;
//三层小波变换
pTrans->DWT_TriLayers(spOriginData, spTransData, spWvltData0, iHeight, iHeight / 2, iWidth, iWidth / 2, 3, 1.414);
//获得图像数据空间的指针,完成另一幅图像的小波变换
spOriginData = spImgData1;
//三层小波变换
pTrans->DWT_TriLayers(spOriginData, spTransData, spWvltData1, iHeight,iHeight / 2, iWidth, iWidth / 2, 3, 1.414);
//小波系数的融合处理:频带有LL3,LH3,HL3,HH3,LH2,HL2,HH2,LH1,HL1,HH1
//融合处理将分频带进行,处理方法采用的是3*3的窗口
//LL3频带小波系数的融合
Window_WvltFusion(spWvltData0, spWvltData1, 0, 0, iHeight / 8, iWidth / 8);
//HL3频带小波系数的融合
Window_WvltFusionQ(spWvltData0, spWvltData1, 0, iWidth / 8, iHeight / 8, iWidth / 4);
//LH3频带小波系数的融合
Window_WvltFusionQ(spWvltData0, spWvltData1, iHeight / 8, 0, iHeight / 4, iWidth / 8);
//HH3频带小波系数的融合
Window_WvltFusionQ(spWvltData0, spWvltData1, iHeight / 8, iWidth / 8, iHeight / 4, iWidth / 4);
//HL2频带小波系数的融合
Window_WvltFusionQ(spWvltData0, spWvltData1, 0, iWidth / 4, iHeight / 4, iWidth / 2);
//LH2频带小波系数的融合
Window_WvltFusionQ(spWvltData0, spWvltData1, iHeight / 4, 0, iHeight / 2, iWidth / 4);
//HH2频带小波系数Q的融合
Window_WvltFusionQ(spWvltData0, spWvltData1, iHeight / 4, iWidth / 4, iHeight / 2, iWidth / 2);
//HL1频带小波系数的融合
Window_WvltFusionQ(spWvltData0, spWvltData1, 0, iWidth / 2, iHeight / 2, iWidth);
//LH1频带小波系数的融合
Window_WvltFusionQ(spWvltData0, spWvltData1, iHeight / 2, 0, iHeight, iWidth / 2);
//HH1频带小波系数的融合
Window_WvltFusionQ(spWvltData0, spWvltData1, iHeight / 2, iWidth / 2, iHeight, iWidth);
//将融合后的小波系数复原,完成图像的融合
DIP_WvltRevers(spOriginData, spTransData, spWvltData0, iHeight, iHeight / 2, iWidth, iWidth / 2, 3, 1.414);
//释放临时的数据空间
//delete spTransData;
//delete spWvltData0;
//delete spWvltData1;
}
void CDiproc::DIP_ImageFusion6(short **spImgData0, short **spImgData1, int nHeight, int nWidth)
{
int iHeight = nHeight, iWidth = nWidth;
//图像融合所用到的数据空间及数据指针
short **spOriginData, **spTransData, **spWvltData0, **spWvltData1;
//分配数据空间
spTransData = new short *[iHeight];
spWvltData0 = new short *[iHeight];
spWvltData1 = new short *[iHeight];
for(int i = 0; i < iWidth; i ++)
{
spTransData[i] = new short [iWidth];
spWvltData0[i] = new short [iWidth];
spWvltData1[i] = new short [iWidth];
}
//创建小波变换类,完成图像的小波变换
CWvltTrans *pTrans;
//获得图像数据空间的指针,完成小波变换
spOriginData = spImgData0;
//三层小波变换
pTrans->DWT_TriLayers(spOriginData, spTransData, spWvltData0, iHeight, iHeight / 2, iWidth, iWidth / 2, 3, 1.414);
//获得图像数据空间的指针,完成另一幅图像的小波变换
spOriginData = spImgData1;
//三层小波变换
pTrans->DWT_TriLayers(spOriginData, spTransData, spWvltData1, iHeight,iHeight / 2, iWidth, iWidth / 2, 3, 1.414);
//小波系数的融合处理:频带有LL3,LH3,HL3,HH3,LH2,HL2,HH2,LH1,HL1,HH1
//融合处理将分频带进行,处理方法采用的是3*3的窗口
//LL3频带小波系数的融合
Window_WvltFusion(spWvltData0, spWvltData1, 0, 0, iHeight / 8, iWidth / 8);
//HL3频带小波系数的融合
Window_WvltFusionQY(spWvltData0, spWvltData1, 0, iWidth / 8, iHeight / 8, iWidth / 4);
//LH3频带小波系数的融合
Window_WvltFusionQY(spWvltData0, spWvltData1, iHeight / 8, 0, iHeight / 4, iWidth / 8);
//HH3频带小波系数的融合
Window_WvltFusionQY(spWvltData0, spWvltData1, iHeight / 8, iWidth / 8, iHeight / 4, iWidth / 4);
//HL2频带小波系数的融合
Window_WvltFusionQY(spWvltData0, spWvltData1, 0, iWidth / 4, iHeight / 4, iWidth / 2);
//LH2频带小波系数的融合
Window_WvltFusionQY(spWvltData0, spWvltData1, iHeight / 4, 0, iHeight / 2, iWidth / 4);
//HH2频带小波系数Q的融合
Window_WvltFusionQY(spWvltData0, spWvltData1, iHeight / 4, iWidth / 4, iHeight / 2, iWidth / 2);
//HL1频带小波系数的融合
Window_WvltFusionQY(spWvltData0, spWvltData1, 0, iWidth / 2, iHeight / 2, iWidth);
//LH1频带小波系数的融合
Window_WvltFusionQY(spWvltData0, spWvltData1, iHeight / 2, 0, iHeight, iWidth / 2);
//HH1频带小波系数的融合
Window_WvltFusionQY(spWvltData0, spWvltData1, iHeight / 2, iWidth / 2, iHeight, iWidth);
//将融合后的小波系数复原,完成图像的融合
DIP_WvltRevers(spOriginData, spTransData, spWvltData0, iHeight, iHeight / 2, iWidth, iWidth / 2, 3, 1.414);
//释放临时的数据空间
//delete spTransData;
//delete spWvltData0;
//delete spWvltData1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -