机器视觉实验之图像融合
机器视觉实验之图像融合
实验内容:
对同一场景的红外图像和可见光图像进行融合,采用图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)实验结果