机器视觉实验之图像融合
实验内容:
对同一场景的红外图像和可见光图像进行融合,采用图1中的参考图形,并对结果进行简要分析,融合方法可采用以下方法中的一种或多种:直接加权融合方法,傅里叶变换融合方法,小波变换融合方法;或者自己通过查找资料采用替他方法。
A. 直接加权融合法。
(1)实验代码:
实验环境:window7 opencv2.4.8 vs2010
// Image blending
// Author : imoptimistic
// Date : 2014-10-28
// HomePage : http://blog.youkuaiyun.com/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)实验结果