图像融合是图像处理和计算机视觉领域中的一项重要技术,它涉及将两个或多个图像结合起来,以产生一个包含所有输入图像信息的新图像。
图像融合要求两张图像尺寸一样,因此在两张不同尺寸的图像融合时首先调整图像尺寸
调整图像尺寸:通过比较两幅图像的尺寸,使用imresize
函数将较大的图像缩放到较小图像的尺寸。
[rows1, cols1] = size(gray1);
[rows2, cols2] = size(gray2);
if rows1 > rows2
gray1 = imresize(gray1, [rows2 cols2]);
elseif rows2 > rows1
gray2 = imresize(gray2, [rows1 cols1]);
end
在进行多级小波分解时,图像的尺寸在每一级分解后通常会减半。如果原始尺寸不是2的整数次幂,那么在多次分解后,图像的尺寸可能会变得非常不规整,这将影响后续处理和重构的质量。因此一般会将图像尺寸设定为2的整数次幂
使用nextpow2
函数找到大于或等于图像尺寸的最小2的幂次,然后使用padarray
函数将图像填充到这个尺寸。
% 确保图像尺寸是2的整数次幂
[rows, cols] = size(gray1);
pad_rows = 2^nextpow2(rows) - rows;
pad_cols = 2^nextpow2(cols) - cols;
gray1 = padarray(gray1, [pad_rows pad_cols], 'post');
gray2 = padarray(gray2, [pad_rows pad_cols], 'post');
本文采用五种小波基进行图像融合,效果差别通过肉眼很难观测出来,笔者在前面的图像边缘检测文章中提到过对比方法,即找到一种图像融合效果较好的方法进行处理,得到的结果作为参照,与五种小波基图像融合的效果对比,通过SSIM,RMSE等指标进行对比,这里笔者省略这些步骤,感兴趣可以参考小波变换图像边缘检测(基于haar小波、Daubechies小波、Symlets小波、Coiflets小波、Biorthogonal小波)
下面给出五种小波基图像融合的代码:
% 读取两幅图像
img1 = imread('lena.png');
img2 = imread('Lady.jpg');
% 转换为灰度图像
gray1 = rgb2gray(img1);
gray2 = rgb2gray(img2);
% 调整图像尺寸,使得两张图像具有相同的尺寸
% 这里选择将两张图像都缩放到较小图像的尺寸
[rows1, cols1] = size(gray1);
[rows2, cols2] = size(gray2);
if rows1 > rows2
gray1 = imresize(gray1, [rows2 cols2]);
elseif rows2 > rows1
gray2 = imresize(gray2, [rows1 cols1]);
end
% 确保图像尺寸是2的整数次幂
[rows, cols] = size(gray1);
pad_rows = 2^nextpow2(rows) - rows;
pad_cols = 2^nextpow2(cols) - cols;
gray1 = padarray(gray1, [pad_rows pad_cols], 'post');
gray2 = padarray(gray2, [pad_rows pad_cols], 'post');
% 小波分解
wname = {'haar', 'db2', 'sym4', 'bior1.5', 'coif2'};
figure;
for i = 1:length(wname)
% 使用不同的小波基进行分解
[cA1, cH1, cV1, cD1] = dwt2(gray1, wname{i});
[cA2, cH2, cV2, cD2] = dwt2(gray2, wname{i});
% 融合规则:低频系数使用平均值融合,高频系数使用最大值融合
cA = (cA1 + cA2) / 2;
cH = max(cH1, cH2);
cV = max(cV1, cV2);
cD = max(cD1, cD2);
% 小波重构
fusedImg = idwt2(cA, cH, cV, cD, wname{i});
% 裁剪填充的部分
fusedImg = fusedImg(1:rows, 1:cols);
% 显示结果
subplot(3, 2, i);
imshow(fusedImg, []);
title(['Fused with ', wname{i}]);
end