📄 fusion_2k.c
字号:
/***********************************************************************
** Main Function Program
***********************************************************************/
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define HEIGTH 40
#define WIDTH 40
#define k1 6 //定义融合系数,注意最后要除以10
#define k2 4
main()
{
FILE *fimage_vi ;
FILE *fimage_ir ;
unsigned int image_vi[HEIGTH][WIDTH]; // 可见光图像
unsigned int DS_vi1[HEIGTH/2][WIDTH/2]; // 一次降采样(DS=DownSample)
unsigned int DS_vi2[HEIGTH/4][WIDTH/4]; // 二次降采样(DS=DownSample)
unsigned int InterDiff_vi1[HEIGTH][WIDTH]; // 插值放大和图像差
unsigned int InterDiff_vi2[HEIGTH/2][WIDTH/2]; // 插值放大和图像差
unsigned int image_ir[HEIGTH][WIDTH]; // 红外光图像
unsigned int DS_ir1[HEIGTH/2][WIDTH/2]; // 一次降采样(DS=DownSample)
unsigned int DS_ir2[HEIGTH/4][WIDTH/4]; // 二次降采样(DS=DownSample)
unsigned int InterDiff_ir1[HEIGTH][WIDTH]; // 插值放大和图像差
unsigned int InterDiff_ir2[HEIGTH/2][WIDTH/2]; // 插值放大和图像差
unsigned int id_vi[WIDTH];
unsigned int id_ir[WIDTH]; // 缓存图像的行
unsigned int window[3][3]={ {1,2,1}, {2,4,2}, {1,2,1} } ; // 定义滤波窗口,注意最后得除以16
int i,j,x,y,u,v,temp,value_dd=0;
fimage_vi=fopen("..\\40x40_vi.bmp","rb");
fimage_ir=fopen("..\\40x40_ir.bmp","rb");
fseek(fimage_vi,0x436, SEEK_SET);
fseek(fimage_ir,0x436, SEEK_SET);
// 将位置指针移到离文件头1078个字节。1078=14+40+256x4
// 0x436=1078,即指向图象的实际数据
//1.1 读入可见光图象并对其进行一系列的处理
//读入可见光图象
for (i=0; i<HEIGTH; i++)
{
//每次把整行的数据读到数组id中
fread((char *)id_vi,sizeof(int),WIDTH,fimage_vi);
for (j=0; j<WIDTH; j++)
{
image_vi[i][j]=id_vi[j];
}
}
fclose(fimage_vi);
i=0;
//----------------------------------------------------------------
for (i=0; i<HEIGTH; i++)
{
//每次把整行的数据读到数组id中
fread((char *)id_ir,sizeof(int),WIDTH,fimage_ir);
for (j=0; j<WIDTH; j++)
{
image_ir[i][j]=id_ir[j];
}
}
fclose(fimage_ir);
i=0;
//对原图像进行处理,并得到降采样图DS_vi1[40][30]和图像差InterDiff_vi1[80][60]即为e1
//降采样之前,对图像进行滤波
for( i=1;i<=(HEIGTH-2);i++)
{
for(j=1; j<=(WIDTH-2);j++)
{
for( x=-1;x<=1;x++)
{ for (y=-1;y<=1 ;y++)
{
value_dd+= window[x+1][y+1]*image_vi[i+x][j+y] ;
}
}
image_vi[i][j]=value_dd/16 ;
value_dd=0;
}
}
//滤波后对可见光图像进行第一次降采样
for (i=0; i<HEIGTH/2; i++)
{
for (j=0; j<WIDTH/2; j++)
{
DS_vi1[i][j]=image_vi[2*i][2*j] ;
}
}
//对降采样图像进行插值放大----------------------------------------------
for(i=0;i<(HEIGTH-2);i+=2 )
{
for (j=0;j<(WIDTH-2); j+=2)
{
for(u=0;u<=2;u++)
{
for(v=0;v<=2;v++)
{
InterDiff_vi1[i+u][j+v]=(2-u)*(2-v)*DS_vi1[i/2][j/2]+
u*(2-v)*DS_vi1[i/2+1][j/2] +
v*(2-u)*DS_vi1[i/2][j/2+1] +
u*v*DS_vi1[i/2+1][j/2+1] ;
}
}
}
} // end for i
//补最后的一行和一列
for(i=0;i<=(WIDTH-2);i++)
InterDiff_vi1[HEIGTH-1][i]=InterDiff_vi1[HEIGTH-2][i] ; // 补行
for(i=0;i<=(HEIGTH-1) ; i++)
InterDiff_vi1[i][WIDTH-1]=InterDiff_vi1[i][WIDTH-2] ; // 补列
for (i=0; i<HEIGTH; i++)
{
for (j=0; j<WIDTH; j++)
{
InterDiff_vi1[i][j]=InterDiff_vi1[i][j]>>2 ;
}
}
//---------------------------------------------------------------------------
//求图像差InterDiff_vi1[80][60]即为 e1
for (i=0; i<HEIGTH; i++)
{
for (j=0; j<WIDTH; j++)
{
if ( image_vi[i][j]>=InterDiff_vi1[i][j] )
InterDiff_vi1[i][j]=image_vi[i][j]-InterDiff_vi1[i][j] ;
else
InterDiff_vi1[i][j]=0 ;
}
}
//对降采样图像DS_vi1[40][30]进行处理
//并得到二次降采样图DS_vi2[20][15]和图像差InterDiff_vi2[40][30]即为e2
value_dd=0;
for( i=1;i<=(HEIGTH/2-2);i++)
{
for(j=1; j<=(WIDTH/2-2);j++)
{
for( x=-1;x<=1;x++)
{ for (y=-1;y<=1 ;y++)
{
value_dd+= window[x+1][y+1]*DS_vi1[i+x][j+y] ;
}
}
DS_vi1[i][j]=value_dd/16 ;
value_dd=0;
}
}
//滤波后对可见光的第一次降采样图像进行第二次降采样,即f1(x,y)
for (i=0; i<HEIGTH/4; i++)
{
for (j=0; j<WIDTH/4; j++)
{
DS_vi2[i][j]=DS_vi1[2*i][2*j] ;
}
}
DS_vi2[0][0]=DS_vi2[0][0] ; //防止编译出错
//对第二次降采样图像进行插值放大----------------------------------------------
for(i=0;i<(HEIGTH/2-2);i+=2 )
{
for (j=0;j<(WIDTH/2-2); j+=2)
{
for(u=0;u<=2;u++)
{
for(v=0;v<=2;v++)
{
InterDiff_vi2[i+u][j+v]=(2-u)*(2-v)*DS_vi2[i/2][j/2]+
u*(2-v)*DS_vi2[i/2+1][j/2] +
v*(2-u)*DS_vi2[i/2][j/2+1] +
u*v*DS_vi2[i/2+1][j/2+1] ;
}
}
}
} // end for i
//补最后的一行和一列
for(i=0;i<=(WIDTH/2-2);i++)
InterDiff_vi2[HEIGTH/2-1][i]=InterDiff_vi2[HEIGTH/2-2][i] ; // 补行
for(i=0;i<=(HEIGTH/2-1) ; i++)
InterDiff_vi2[i][WIDTH/2-1]=InterDiff_vi2[i][WIDTH/2-2] ; // 补列
// 对公式法求插值放大后的图像的每个像素值缩小4倍
for (i=0; i<HEIGTH/2; i++)
{
for (j=0; j<WIDTH/2; j++)
{
InterDiff_vi2[i][j]=InterDiff_vi2[i][j]>>2 ;
}
}
//---------------------------------------------------------------------------
//求图像差InterDiff_vi2[40][30]即为 e2
for (i=0; i<HEIGTH/2; i++)
{
for (j=0; j<WIDTH/2; j++)
{
if ( DS_vi1[i][j]>=InterDiff_vi2[i][j] )
InterDiff_vi2[i][j]=DS_vi1[i][j]-InterDiff_vi2[i][j] ;
else
InterDiff_vi2[i][j]=0 ;
}
}
i=0;
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// 至此,得到了可见光的分解子图系列e1,e2,f1(x,y)
// 也即InterDiff_vi1[80][60],InterDiff_vi2[40][30]和DS_vi2[20][15] .
// 同时,处理一幅图像时开辟了5个存储空间,而处理后只需要了3个,
// 因此,可释放2个空间为其他用,这对只有64k数据存储空间的5416来说尤为重要。
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//1.2以下读入红外光图象并对其进行一系列的处理
// 读入可见光图象
// 将位置指针移到离文件头1078个字节。1078=14+40+256x4
// 0x436=1078,即指向图象的实际数据
//降采样之前,对图像进行滤波
value_dd=0;
for( i=1;i<=(HEIGTH-2);i++)
{
for(j=1; j<=(WIDTH-2);j++)
{
for( x=-1;x<=1;x++)
{ for (y=-1;y<=1 ;y++)
{
value_dd+= window[x+1][y+1]*image_ir[i+x][j+y] ;
}
}
image_ir[i][j]=value_dd/16 ;
value_dd=0;
}
}
//滤波后对红外光图像进行第一次降采样
for (i=0; i<HEIGTH/2; i++)
{
for (j=0; j<WIDTH/2; j++)
{
DS_ir1[i][j]=image_ir[2*i][2*j] ;
}
}
//对降采样的红外光图像进行插值放大----------------------------------------------
for(i=0;i<(HEIGTH-2);i+=2 )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -