案例背景
图像融合最早是以数据融合理论为基础的,通过计算像素算术平均的方式得到合成图像。该方法忽略了像素间的相互关系,往往会产生融合图像的对比度差、可视化效果不理想等问题。因此,为了提高目标检测的分辨率,抑制不同传感器的检测噪声,本案例选择了--种基于小波变换的图像数据融合方法,首先通过小波变换将图像分解到高频、低频,然后分别进行融合处理,最后再逆变换到图像矩阵"。
在融合过程中,为了尽可能保持多源图像的特征,在小波分解的高频域内,选择图像邻域平均绝对值较大的系数作为融合小波重要系数;在小波分解的低频域内,选择对多源图像的低频系数进行加权平均作为融合小波近似系数。在反变换过程中,利用重要小波系数和近似小波系数作为输入进行小波反变换。在融合图像输出后,对其做进一步的处理。实验结果表明,基于小波变换的图像数据融合方法运行效率高,具有良好的融合效果,并可用于广泛的研究领域,具有- -定的使用价值。
根据融合的作用对象,图像融合一般可以分为3个层次:像素级图像融合、特征级图像融合和决策级图像融合。其中,像素级融合是作用于图像像素点最底层的融合,本章所研究的图像融合是像素级图像融合口。
基础原理
对图像进行小波变换的原理就是通过低通滤波器和高通滤波器对图像进行卷积滤波,再进行二取- -的下抽样。因此,图像通过一层小波变换可以被分解为1个低频子带和3个高频子带。其中,低频子带LL1通过对图像水平方向和垂直方向均进行低通滤波得到;高频子带HL1通过对图像水平方向高通滤波和垂直方向低通滤波得到;高频子带LH通过对图像水平方向低通滤波和垂直方向高通滤波得到;高频子带HH通过对图像水平方向高通滤波和垂直方向高通滤波得到。各子带的分辨率为原始图像的1/2。
同理,对图像进行二层 小波变换时只对低频子带LL进行,可以将LL1子带分解为LL2、LH2、HL2和HH2,各子带的分辨率为原始图像的1/4。以此类推可得到三层及更高层的小波变换结果。所以,进行一层小波变换得到4个子带,进行二层小波变换得到7个子带,进行x层分解就得到3●x+1个子带。如下图所示为三层小波变换后的系数分布。
程序实现
本案例采用二维小波分解、融合、重建的操作流程进行程序实现,为增加实验效果的对比性,采用MATLAB的GUI框架建立软件主界面,关联相关功能函数实现小波图像融合处理。本节将介绍程序实现过程中的核心代码。
按钮1:载入图像1
function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) clc; axes(handles.axes1); cla reset; box on; set(gca, 'XTickLabel', '', 'YTickLabel', ''); axes(handles.axes2); cla reset; box on; set(gca, 'XTickLabel', '', 'YTickLabel', ''); axes(handles.axes3); cla reset; box on; set(gca, 'XTickLabel', '', 'YTickLabel', ''); handles.file1 = []; handles.file2 = []; handles.result = []; [filename, pathname] = uigetfile({'*.jpg;*.tif;*.png;*.gif', 'All Image Files';... '*.*', 'All Files' }, '选择图像1', ... fullfile(pwd, 'images\\实验图像1\\a.tif')); if isequal(filename, 0) return; end handles.file1 = fullfile(pathname, filename); guidata(hObject, handles); Img1 = imread(fullfile(pathname, filename)); axes(handles.axes1); imshow(Img1, []);
按钮2:载入图像2
function pushbutton2_Callback(hObject, eventdata, handles) % hObject handle to pushbutton2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) [filename, pathname] = uigetfile({'*.jpg;*.tif;*.png;*.gif', 'All Image Files';... '*.*', 'All Files' }, '选择图像2', ... fullfile(pwd, 'images\\实验图像1\\b.tif')); if isequal(filename, 0) return; end handles.file2 = fullfile(pathname, filename); guidata(hObject, handles); Img2 = imread(fullfile(pathname, filename)); axes(handles.axes2); imshow(Img2, []);
按钮3:图像小波融合
function pushbutton3_Callback(hObject, eventdata, handles) % hObject handle to pushbutton3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) if isempty(handles.file1) msgbox('请载入图像1!', '提示信息', 'modal'); return; end if isempty(handles.file2) msgbox('请载入图像2!', '提示信息', 'modal'); return; end [imA, map1] = imread(handles.file1); [imB, map2] = imread(handles.file2); M1 = double(imA) / 256; M2 = double(imB) / 256; zt = 2; wtype = 'haar'; [c0, s0] = Wave_Decompose(M1, zt, wtype); [c1, s1] = Wave_Decompose(M2, zt, wtype); Coef_Fusion = Fuse_Process(c0, c1, s0, s1); Y = Wave_Reconstruct(Coef_Fusion, s0, wtype); handles.result = im2uint8(mat2gray(Y)); guidata(hObject, handles); msgbox('小波融合处理完毕!', '提示信息', 'modal');
按钮4:图像显示
if isempty(handles.result) msgbox('请进行填充处理!', '提示信息', 'modal'); return; end axes(handles.axes3); imshow(handles.result, []);
子函数:Wave_Reconstruct
function Y = Wave_Reconstruct(Coef_Fusion, s, wtype) if nargin < 3 wtype = 'haar'; end Y = waverec2(Coef_Fusion, s, wtype);
子函数:Wave_Decompose
function [c, s] = Wave_Decompose(M, zt, wtype) if nargin < 3 wtype = 'haar'; end if nargin < 2 zt = 2; end [c, s] = wavedec2(M, zt, wtype);
操作界面展示:
通过融合结果可以看出基于小波变换的图像融合比直接进行图像融合的效果要好很多。基于小波变换的融合图像弥补了两幅原图不同的缺陷,得到了完整的清晰图像。采用小波分解融合的方法不会产生明显的信息丢失现象,而直接进行融合所得的图像灰度值改变与原图不同。
本案例通过小波变换将原图分解成-系列具有不同空间分辨率和频域特性的子图像,反映了原始图像的局部特征变化,在多个分解层、多个频带上进行融合从而得到较好的融合效果。通过图像融合,我们可以看到比较清晰的图像,以及互补原图的缺点。