第一章 绪论
图像融合技术作为多类型传感器信息融合的一个非常重要的分支-可视信息的融合,近20年来,引起了世界范围为内的广泛关注和研究热潮。图像融合就是通过多幅图像数据互补得到一幅新的图像,在这幅图像中能够反映多重原始图像中的信息。图像融合的目的是充分利用多个待融合源图像中包含的互补信息,融合后的图像应该更适合于人类视觉感知或计算机后续处理,减少不确定性。图像融合技术在遥感、医学、自然资源勘测、生物学等领域占有极其重要的地位。
论文中介绍了像素级图像融合常用方法及图像融合实例。
1.1图像融合的概念
图像融合是二十世纪70年代后期提出的新的概念,是多传感器信息中可视信息部分的融合,是将多源信道所采集的关于统一目标图像经过一定的图像处理,提取各自信道的信息,最后合成统一的图像以供观察和处理。鉴于图像融合具有突出的探测优越性,在技术先进国家受到高度重视并取得相当的进展。
图1 图像融合示意图
图像融合的形式大致可分为多传感器不同时获取的图像的融合、多传感器同时获取的融合、单一传感器不同时间,不同条件获取的图像融合三种。图像融合能够充分利用这些时间或空间上冗余或互补的图像信息,依据一定的融合算法合成一幅满足某种需要的新图像,从而获得对场景的进一步分析、理解以及目标的检测、识别或跟踪。
1.2图像融合的主要研究内容
图像融合的层次可分为 : 像素级、特征级和决策级。
像素级图像融合是在基础层面上进行的信息融合,其主要完成的任务是对多传感器目标和背景要素的测量结果进行融合处理。像素级图像融合是直接在原始数据层上进行的融合,该层次的融合准确性最高,能够提供其它层次上的融合处理所不具有的更丰富、更精确、更可靠的细节信息,有利于图像的进一步分析、处理与理解。像素级融合是图像融合中最为复杂且实施难度最大的融合。
图2 像素级图像融合原理图示意图
特征级图像融合是对源图像进行预处理和特征提取后获得的特征信息 ( 如边缘、形状、轮廓、区域等 ) 进行综合。特征级融合属于中间层次的信息融合,它既保留了足够数量的重要信息,又可对信息进行压缩,有利于实时处理。它使用参数模板、统计分析、模式相关等方法完成几何关联、特征提取和目标识别等功能,以利于系统判决。一般从源图像中提取的典型特征信息有 : 线型、边缘、纹理、光谱、相似亮度区域、相思景深区域等。
图3 特征级图像融合原理示意图
决策级图像融合是一种更高层次的信息融合,其结果将为各种控制或决策提供依据。这种方法是首先对各个源数据进行处理,分别得出判断和识别的结果,融合中心将这些结果按照一定的准则和每个数据源决策的可信度进行协调,以取得最优的决策结果。
图4决策级图像融合原理示意图
第二章 图像融合实例-小波变换( DWT )
在众多的图像融合技术中,基于小波变换的图像融合方法已成为现今研究的一个热点。这类算法主要是利用人眼对局部对比度的变化比较敏感这一事实,根据一定的融合规则,在多幅原图像中选择出最显著的特征,例如边缘、线段等,并将这些特征保留在最终的合成图像中。在一幅图像的小波变换中,绝对值较大的小波系数对应于边缘这些较为显著的特征,所以大部分基于小波变换的图像融合算法主要研究如何选择合成图像中的小波系数,也就是三个方向上的高频系数,从而达到保留图像边缘的目的。虽然小波系数(高频系数)的选择对于保留图像的边缘等特征具有非常主要的作用,但尺度系数(低频系数)决定了图像的轮廓,正确地选择尺度系数对提高合成图像的视觉效果具有举足轻重的作用。
基于 SIDWT(Shift Invariance Discrete Wavelet Transform)小波变换的算法程序:
filename1='C:\文档数据\作业\图像融合\1.jpg';
info=imfinfo(filename1);
width1=info.Width;
height1=info.Height;
if strcmp(info.ColorType,'grayscale')==1
[A,MAP]=gray2ind(imread(filename1));
RGB1=ind2rgb(A,MAP);
end
if strcmp(info.ColorType,'indexed')==1
[A,MAP]=imread(filename1);
RGB1=ind2rgb(A,MAP);
end
if strcmp(info.ColorType,'truecolor')==1
RGB1=imread(filename1);
end
figure,imshow(RGB1);
filename2='C:\文档数据\作业\图像融合\2.jpg';
info=imfinfo(filename2);
width2=info.Width;
height2=info.Height;
if strcmp(info.ColorType,'grayscale')==1
[A,MAP]=gray2ind(imread(filename2));
RGB2=ind2rgb(A,MAP);
end
if strcmp(info.ColorType,'indexed')==1
[A,MAP]=gray2ind(imread(filename2));
RGB2=ind2rgb(A,MAP);
end
if strcmp(info.ColorType,'truecolor')==1
[A,MAP]=gray2ind(imread(filename2));
RGB2=ind2rgb(A,MAP);
end
figure,imshow(RGB2);
BW=~im2bw(RGB1);
figure;imshow(BW);
B=imfill(imfill(BW,[1,1],4),[1,width1],4);
B=~xor(BW,B);
A=im2double(RGB1);
D=zeros(height1,width1);
K=3;
for i=1:1:height1
for j=1:1:width1
if B(i,j)==0
A(i,j,1)=0;
A(i,j,2)=0;
A(i,j,3)=1.0;
else
for K=1:1:K
N(k)=B(i,j+k-round(K/2));
end
if ~all(N)
if~isempty(find(N==1, 1))
k1=1;k2=-1;
while 1
r=A(i,j+k1,1);
g=A(i,j+k1,2);
b=A(i,j+k1,3);
if B(i,j+k1)==1
break;
end
r=A(i,j+k2,1);
g=A(i,j+k2,2);
b=A(i,j+k2,3);
if B(i,j+k2)==1
break;
end
k1=k1+1;k2=k2-1;
end
A(i,j,1)=r;
A(i,j,2)=g;
A(i,j,3)=b;
end
end
end
end
end
x=280;y=100;
RGB=im2double(RGB2);
for i=1:1:height1
for j=1:1:width1
if B(i,j)==1
if D(i,j)==1
RGB(y+i,x+j,1)=0.5*A(i,j,1)+0.5*RGB(y+i,x+j,1);
RGB(y+i,x+j,2)=0.5*A(i,j,2)+0.5*RGB(y+i,x+j,2); else
RGB(y+i,x+j,1)=A(i,j,1);
RGB(y+i,x+j,2)=A(i,j,2);
end
end
end
end
figure;imshow(RGB);
小波变换技术从时间频率采用局部化作用分析,同时小波变换可以有效的对信号数据进行具体分解,从中获得更为具体的信息,具备了短时傅立叶变换局部处理化的基本原理,基于伸缩平移处理运算对信号数据完成多尺度细化处理,并达到高频段时域和低频段频率细分的目的。
为了加深印象用上述的基于小波变换的程序在MATLAB上进行用做图像融合的验证实验,我在网上找了两张分辨率相同图作为图像融合的原始材料,原图如下:
图5 聚焦在左边的图像
图6 聚焦在右边的图像
由上述的程序运行得到下图:
仿真结果分析:从仿真结果可以看出,文章中给出的方法能够很好地保留原来图片中的有用信息,得到目标聚焦很清晰的融合图片。参加融合的图片都需要经过配准,图片是否配准,直接影响到融合的结果。而本实验中的图片都进行了配准。1中用小波函数sym4对X1进行2层小波分解对分解系数进行处理以突出轮廓部分,弱化细节部分,从实验的结果中,我们可以明确的看到,融合后的图象具有了两幅图象的特征;2中将两幅描述同一对象的模糊图象,可见到它们分别在不同的地方有些模糊,然后通过小波变换对其进行图像融合,可以从结果中看到融合后的图象清楚的表现了对象特征。
第三章、源码
filename1='图像融合\1.jpg';
info=imfinfo(filename1);
width1=info.Width;
height1=info.Height;
if strcmp(info.ColorType,'grayscale')==1
[A,MAP]=gray2ind(imread(filename1));
RGB1=ind2rgb(A,MAP);
end
if strcmp(info.ColorType,'indexed')==1
[A,MAP]=imread(filename1);
RGB1=ind2rgb(A,MAP);
end
if strcmp(info.ColorType,'truecolor')==1
RGB1=imread(filename1);
end
figure,imshow(RGB1);
filename2='图像融合\2.jpg';
info=imfinfo(filename2);
width2=info.Width;
height2=info.Height;
if strcmp(info.ColorType,'grayscale')==1
[A,MAP]=gray2ind(imread(filename2));
RGB2=ind2rgb(A,MAP);
end
if strcmp(info.ColorType,'indexed')==1
[A,MAP]=gray2ind(imread(filename2));
RGB2=ind2rgb(A,MAP);
end
if strcmp(info.ColorType,'truecolor')==1
[A,MAP]=gray2ind(imread(filename2));
RGB2=ind2rgb(A,MAP);
end
figure,imshow(RGB2);
BW=~im2bw(RGB1);
figure;imshow(BW);
B=imfill(imfill(BW,[1,1],4),[1,width1],4);
B=~xor(BW,B);
A=im2double(RGB1);
D=zeros(height1,width1);
K=3;
for i=1:1:height1
for j=1:1:width1
if B(i,j)==0
A(i,j,1)=0;
A(i,j,2)=0;
A(i,j,3)=1.0;
else
for K=1:1:K
N(k)=B(i,j+k-round(K/2));
end
if ~all(N)
if~isempty(find(N==1, 1))
k1=1;k2=-1;
while 1
r=A(i,j+k1,1);
g=A(i,j+k1,2);
b=A(i,j+k1,3);
if B(i,j+k1)==1
break;
end
end
k1=k1+1;k2=k2-1;
end
A(i,j,1)=r;
A(i,j,2)=g;
A(i,j,3)=b;
end
end
end
end
end
x=280;y=100;
RGB=im2double(RGB2);
for i=1:1:height1
for j=1:1:width1
if B(i,j)==1
if D(i,j)==1
RGB(y+i,x+j,1)=0.5*A(i,j,1)+0.5*RGB(y+i,x+j,1);
RGB(y+i,x+j,2)=0.5*A(i,j,2)+0.5*RGB(y+i,x+j,2);
RGB(y+i,x+j,3)=0.5*A(i,j,3)+0.5*RGB(y+i,x+j,3);
else
RGB(y+i,x+j,1)=A(i,j,1);
RGB(y+i,x+j,2)=A(i,j,2);
RGB(y+i,x+j,3)=A(i,j,3);
end
end
end
end
figure;imshow(RGB);