一、像素加权融合
原理
在上一篇文章中提过,在MATLAB中,图像会以矩阵的形式读入、存入程序,对像素级的操作就是对矩阵中每个元素的操作。因此,如果想实现带权的操作,那么对像素点赋予权值,然后再对像素点进行计算就可以了。
MATLAB实现
clear;clc;
x1=imread('coffe1.tif');
x2=imread('coffe2.tif');
x1=rgb2gray(x1); %rgb2gray函数可以将RGB图像转化成灰度图像。
x2=rgb2gray(x2);
[m,n]=size(x1);
for i=1:m %两次for循环遍历整个矩阵
for j=1:n
y(i,j)=0.4*x1(i,j)+0.6*x2(i,j); %每个像素带权相加
end
end
subplot 221;imshow(x1);title('原图像1');
subplot 222;imshow(x2);title('原图像2');
subplot 223;imshow(y);title('加权融合图像');
运行结果:
二、图像融合的主观性
图像融合具有的主观性,它体现在:
1、观察者侧重点不同,观察者认为的融合效果就不同。
2、同一方法在不同图像无论对观察者还是数学公式来说,体现的结果都不同。
3、反过来应用1、2两点,通过提前观察图像的特性,可以对特定一类的图像融合做出方法调整,达到更好的主观感受。
以上面最简单的加权融合来说,通过观察,我们发现:对于原图像1,2。在图像的上半区域是图2清晰,而在图像的下半区域,是图1清晰。那么简单调整代码,融合效果就会发生变化。
MATLAB实现
clear;clc;
x1=imread('coffe1.tif');
x2=imread('coffe2.tif');
x1=rgb2gray(x1); %rgb2gray函数可以将RGB图像转化成灰度图像。
x2=rgb2gray(x2);
[m,n]=size(x1);
m2=floor(m*9/20); %floor函数实现小数的向左取整。
for i=1:m2 %两次for循环遍历整个矩阵。
for j=1:n
y(i,j)=0.2*x1(i,j)+0.8*x2(i,j); %上半区域给图2更多的权重。
end
end
for i=m2+1:m %两次for循环遍历整个矩阵。
for j=1:n
y(i,j)=0.8*x1(i,j)+0.2*x2(i,j); %下半区域给图1更多的权重。
end
end
subplot 221;imshow(x1);title('原图像1');
subplot 222;imshow(x2);title('原图像2');
subplot 223;imshow(y);title('加权融合图像');
运行结果:
三、彩色图像的处理
在一、二的代码中,我读入的都是RGB图像,然后进行灰度化的处理之后再对灰度图进行图像融合的操作。那么如果想对彩色图像直接进行处理该怎么做呢?这里有一种简单的方法可以参考。
MATLAB实现
clear;clc;
x1=imread('coffe1.tif');
x2=imread('coffe2.tif');
[m,n,d]=size(x1); %新加入的d代表维度。这里的d=3。
y=[]; %预分配内存,提高运行效率。
for i=1:m
for j=1:n
for dim=1:d %对r,g,b三个通道处理。
y(i,j,dim)=0.5*x1(i,j,dim)+0.5*x2(i,j,dim);
end
end
end
subplot 221;imshow(x1);title('原图像1');
subplot 222;imshow(x2);title('原图像2');
subplot 223;imshow(uint8(y));title('加权融合图像');
运行结果:
虽然最终实现了彩色图像的处理。但是在实际学习过程中,为了减少不必要的麻烦、减少运行时间、减少潜在错误的风险,今后的图像融合方法还是会以灰度图像的融合为主,在阐明原理之后,向彩色图像拓展,都是可行的。