⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fusion_2k.c

📁 该包是在CCS下的用于可见光和红外光的图像融合程序。 融合规则为加权法
💻 C
📖 第 1 页 / 共 2 页
字号:
/***********************************************************************
** 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 + -