机器视觉实验之图像融合

机器视觉实验之图像融合


实验内容:

        对同一场景的红外图像和可见光图像进行融合,采用图1中的参考图形,并对结果进行简要分析,融合方法可采用以下方法中的一种或多种:直接加权融合方法,傅里叶变换融合方法,小波变换融合方法;或者自己通过查找资料采用替他方法。

 


A. 直接加权融合法。

 

   (1)实验代码:

实验环境:window7 opencv2.4.8 vs2010

 

// Image blending
// Author : imoptimistic 
// Date   : 2014-10-28 
// HomePage : http://blog.csdn.net/u012062327 
// Email  : 1433252800@qq.com  
// Reference: book Computer Vision: Algorithms and Applications  Richard Szeliski  
// HomePage :http://szeliski.org/Book 

#include <opencv2/opencv.hpp>
#include<iostream>

using namespace cv;
using namespace std;


/// Global Variables
const int alpha_slider_max = 100;
int alpha_slider;
double alpha;
double beta;

/// Matrices to store images
Mat img1;
Mat img2;
Mat output;

/**
 * @function on_trackbar
 * @brief Callback for trackbar
 */
void on_trackbar( int, void* )
{
 alpha = (double) alpha_slider/alpha_slider_max ;
 beta = ( 1.0 - alpha );

 addWeighted( img1, alpha, img2, beta, 0.0,output);

 imshow( "Linear Blend",output );
}

int main( int argc, char** argv )
{
 
 img1 = imread("ir.png");
 img2= imread("vi.png");

 if( img1.empty() ) { printf("Error loading img1 \n"); return -1; }
 if( img2.empty() ) { printf("Error loading img2\n"); return -1; }

 /// Initialize values
 alpha_slider = 0;

 /// Create Windows
 namedWindow("Linear Blend", 1);

 /// Create Trackbars
 char TrackbarName[50];
 sprintf( TrackbarName, "Alpha x %d", alpha_slider_max );

 createTrackbar( TrackbarName, "Linear Blend", &alpha_slider, alpha_slider_max, on_trackbar );

 /// Show some stuff
 on_trackbar( alpha_slider, 0 );

 /// Wait until user press some key
 waitKey(0);
 return 0;
}


 

(2)实验结果



     B. Matlab 实现图像融合(直接加权、小波变换、傅里叶变换)


(1)实验代码

clc;clear all;close all;    
[X1,map1]=imread('E:\\大学\\本科三年课程\\大三\\机器视觉\\ir.bmp');
%map是色谱,map每一行分别代表R、G、B,涵盖了图像中出现的所有颜色组合。 %X是像素颜色值,数据矩阵X的值指向map的某一行。 
figure(1);
subplot(1,2,1); 
imshow(X1);  
%colormap(map1); %指当前显示的figure窗口色图按照指定map1进行搭配,用MAP矩阵映射当前图形的色图 
title('原始图像1') 

[X2,map2]=imread('E:\\大学\\本科三年课程\\大三\\机器视觉\\vl.bmp');   
subplot(1,2,2);
imshow(X2); 
title('原始图像2'); 

if ndims(X1)==3     %表示三位矩阵      
X3=rgb2gray(X1);
%满足这个条件时,把X1转换成灰度图赋值给X3 
else      X3=X1;
    %·否则直接赋值
end
if ndims(X2)==3
        X4=rgb2gray(X2);
        %满足这个条件时,把X2转成灰度图赋值给X4
    else      X4=X2;
end
X3=double(X3);
    %转换成双精度数据
 X4=double(X4); 
    %matlab读入图像的数据是uint8,而matlab中数值一般采用double型(64位)存储和运算。所以要先将图像转为double格式的才能运算,如果不转换,计算会产生溢出   
    %%进行小波变换  
    [C1,L1]=wavedec2(X3,2,'sym4');
    %小波变换
    [C2,L2]=wavedec2(X4,2,'sym4');
    %小波变换 
    %wavedec2:二维信号的多层小波分解 
    %2:就是小波包的层数,小波分解可以按照树形结构一层一层的往下分解,分解到多细,主要看你想分析的频段是什么,如果是2层小波包分解的话,就是把频率分成了4等分,显示出每个频段的小波系数 &sym4:是小波的名字,小波分解不同于傅里叶分解,他可以自己选取“基”,这里就是选取sym4小波作为函数空间的基。这个不是重点,对于一般的函数,选不同的基差别不大。只有一些比较极端的函数,需要特殊的基来分析。 
%%融合  
C=(C1+C2)*0.5;
%给C赋值
X=waverec2(C,L1,'sym4');
%调用函数waverec2
% waverec2:二维信号的多层小波重构 
X=uint8(X);
%把矩阵转化成uint8类型,uint8(8位无符号整数),
figure(2);
subplot(221)
imshow(X);
%画2行2列第3个图

title('基于小波变换的图像融合'); 
X5=(X3+X4)/2;
X5=uint8(X5);
subplot(222);
imshow(X5);
% 在空域内图像直接融合
title('两图像直接相加融合')

F1=fft(X3);
F2=fft(X4);
F=(F1+F2)/3;
X6=real(ifft(F));
X6=uint8(X6);

subplot(223);
imshow(X6);
% 在空域内图像直接融合
title('基于傅里叶变换两图像融合')


(2)实验结果









 

posted on 2014-10-29 00:19  rongbohou  阅读(511)  评论(0编辑  收藏  举报