使用固定小波变换 (SWT) 的图像融合 (MATLAB)
Image Fusion using stationary wavelet transform (SWT) (MATLAB)
我正在尝试使用 SWT 融合两个图像。但是我收到了这个错误:
分解等级1
和图像的大小 (1,5)
不兼容。
建议尺寸:(2,6)
如何更改图像的大小以使其兼容转换?
我使用的代码是:
clc
i=1;
fol=1;
n=0;
for fol=1:5
f='folder';
folder = strcat(f, num2str(fol));
cd(folder)
d= numel(D);
i=(n+1);
Fname1 = strcat(int2str(i),'.bmp');
Fname2 = strcat(int2str(i+1),'.bmp');
im1 = imread(Fname1);
im2 = imread(Fname2);
im1=double(im1);
im2=double(im2);
% image decomposition using discrete stationary wavelet transform
[A1L1,H1L1,V1L1,D1L1] = swt2(im1,1,'sym2');
[A2L1,H2L1,V2L1,D2L1] = swt2(im2,1,'sym2');
% fusion start
AfL1 = 0.5*(A1L1+A2L1);
D = (abs(H1L1)-abs(H2L1))>=0;
HfL1 = D.*H1L1 + (~D).*H2L1;
D = (abs(V1L1)-abs(V2L1))>=0;
VfL1 = D.*V1L1 + (~D).*V2L1;
D = (abs(D1L1)-abs(D2L1))>=0;
DfL1 = D.*D1L1 + (~D).*D2L1;
% fused image
imf = iswt2(AfL1,HfL1,VfL1,DfL1,'sym2');
figure;
imshow(imf,[]);
Iname= strcat(int2str(fol),'.bmp');
imwrite(imf,Iname);
end
为了解决你的第一个问题,那个图像真的很小。我假设这是一张尺寸为 1 x 5 的图像。我建议您更改图像以使其更大,或者对图像执行 imresize
。但是,正如 Ander 在对您的评论中所说的那样...我不会将 1 x 5 矩阵称为图像。
为了解决您的第二个问题,一旦您最终加载图像,小波变换很可能会为您提供超出任何合理浮点精度图像动态范围的浮点数。因此,最好先 规范化 图像,然后将其保存到文件中。
因此,请在保存图像之前执行此操作:
%// ...
%// Your code...
imshow(imf,[]);
%// Normalize the image - Change
imf = (imf - min(imf(:))) / (max(imf(:)) - min(imf(:)));
%// Your code again
%// Now save
Iname= strcat(int2str(fol),'.bmp');
imwrite(imf,Iname);
上述转换对图像进行了归一化处理,使最小值为 0,最大值为 1。完成后,它应该可以正确显示。 FWIW,执行 imshow(imf,[]);
会为您执行此规范化并显示该结果,但不会修改图像。
我正在尝试使用 SWT 融合两个图像。但是我收到了这个错误:
分解等级1
和图像的大小 (1,5)
不兼容。
建议尺寸:(2,6)
如何更改图像的大小以使其兼容转换?
我使用的代码是:
clc
i=1;
fol=1;
n=0;
for fol=1:5
f='folder';
folder = strcat(f, num2str(fol));
cd(folder)
d= numel(D);
i=(n+1);
Fname1 = strcat(int2str(i),'.bmp');
Fname2 = strcat(int2str(i+1),'.bmp');
im1 = imread(Fname1);
im2 = imread(Fname2);
im1=double(im1);
im2=double(im2);
% image decomposition using discrete stationary wavelet transform
[A1L1,H1L1,V1L1,D1L1] = swt2(im1,1,'sym2');
[A2L1,H2L1,V2L1,D2L1] = swt2(im2,1,'sym2');
% fusion start
AfL1 = 0.5*(A1L1+A2L1);
D = (abs(H1L1)-abs(H2L1))>=0;
HfL1 = D.*H1L1 + (~D).*H2L1;
D = (abs(V1L1)-abs(V2L1))>=0;
VfL1 = D.*V1L1 + (~D).*V2L1;
D = (abs(D1L1)-abs(D2L1))>=0;
DfL1 = D.*D1L1 + (~D).*D2L1;
% fused image
imf = iswt2(AfL1,HfL1,VfL1,DfL1,'sym2');
figure;
imshow(imf,[]);
Iname= strcat(int2str(fol),'.bmp');
imwrite(imf,Iname);
end
为了解决你的第一个问题,那个图像真的很小。我假设这是一张尺寸为 1 x 5 的图像。我建议您更改图像以使其更大,或者对图像执行 imresize
。但是,正如 Ander 在对您的评论中所说的那样...我不会将 1 x 5 矩阵称为图像。
为了解决您的第二个问题,一旦您最终加载图像,小波变换很可能会为您提供超出任何合理浮点精度图像动态范围的浮点数。因此,最好先 规范化 图像,然后将其保存到文件中。
因此,请在保存图像之前执行此操作:
%// ...
%// Your code...
imshow(imf,[]);
%// Normalize the image - Change
imf = (imf - min(imf(:))) / (max(imf(:)) - min(imf(:)));
%// Your code again
%// Now save
Iname= strcat(int2str(fol),'.bmp');
imwrite(imf,Iname);
上述转换对图像进行了归一化处理,使最小值为 0,最大值为 1。完成后,它应该可以正确显示。 FWIW,执行 imshow(imf,[]);
会为您执行此规范化并显示该结果,但不会修改图像。