我正在尝试实现一个简单的图像超分辨率算法(基于DWT的分辨率增强 )在下面的论文中
http://www.ripublication.com/aeee/52_pp%20%20%20405-412.pdf
我尝试使用Matlab实现本文图3中的算法。下面给出了代码。
img1 = imread('lena1.jpg'); %original High resolution image
[height, width, dim] = size(img1);
%%Downsampling the image by averaging
avgfilter = fspecial('average', [2 2]);
avgimg = filter2(avgfilter, img1);
img = avgimg(1:2:end,1:2:end); %Input low resolution image
[LL,LH,HL,HH] = dwt2(img,'haar'); %Decomposing
%Bicubic interpolation by factor 2 on each subbands
LL1 = imresize(LL,2,'bicubic');
LH1 = imresize(LH,2,'bicubic');
HL1 = imresize(HL,2,'bicubic');
HH1 = imresize(HH,2,'bicubic');
%% Calculating Difference image
for i=1:256
for j=1:256
img3(i,j,:) = img(i,j,:) - LL1(i,j,:);
end
end
for i=1:256
for j=1:256
LH13(i,j,:) = img3(i,j,:) + LH1(i,j,:);
HL13(i,j,:) = img3(i,j,:) + HL1(i,j,:);
HH13(i,j,:) = img3(i,j,:) + HH1(i,j,:);
end
end
%bicubic interpolation(Here alpha = 2;Hence alpha/2 = 1)
img31 = imresize(img3,1,'bicubic');
LH131 = imresize(LH13,1,'bicubic');
HL131 = imresize(HL13,1,'bicubic');
HH131 = imresize(HH13,1,'bicubic');
img4 = idwt2(img31,LH131,HL131,HH131,'haar'); %IDWT
t = uint8(img4)
imshow(t);
imsave;
但是我得到了一个完全出乎意料的输出图像。为什么会发生这种情况。请帮忙。谢谢。
输入图片:
输出图片:
答案 0 :(得分:4)
我看了一下文件中的方框图。您正在使用错误的图像进行重建。在最后一步,您应该使用原始的下采样图像作为IDWT的一部分 - 不差异图像。这是自我遏制的图表:
查看算法的最后一步。您将使用低分辨率图像,以及上一步骤中的LH,HL和HH组件。从上一步开始,您可以通过添加上一步(没有LL组件)的DWT组件和差异图像来获得每个子带,因此您可以正确使用。
我建议的其他几条评论是更改图片,使其动态范围从[0,1]
开始。您可以使用im2double
执行此操作。您还使用for
循环来低效地计算向量化操作时的差异。最后,您将在代码末尾以1
因子执行插值。这是一个无用的操作,因为您只需返回相同的图像。我从你的代码中删除了这个以获得加速。因此,这是我的代码。请记住,您没有包含Lena图像,所以我从互联网上提取了一个。
不用多说,这是您修改后的代码:
clear all;
close all;
img1 = imread('http://www.ece.rice.edu/~wakin/images/lenaTest3.jpg'); %original High resolution image
[height, width, dim] = size(img1);
%// Change - convert to [0,1]
img1 = im2double(img1);
%%Downsampling the image by averaging
avgfilter = fspecial('average', [2 2]);
avgimg = filter2(avgfilter, img1);
img = avgimg(1:2:end,1:2:end); %Input low resolution image
[LL,LH,HL,HH] = dwt2(img,'haar'); %Decomposing
%Bicubic interpolation by factor 2 on each subbands
LL1 = imresize(LL,2,'bicubic');
LH1 = imresize(LH,2,'bicubic');
HL1 = imresize(HL,2,'bicubic');
HH1 = imresize(HH,2,'bicubic');
% // Change - Vectorized operations
img3 = img - LL1;
LH13 = img3 + LH1;
HL13 = img3 + HL1;
HH13 = img3 + HH1;
%bicubic interpolation(Here alpha = 2;Hence alpha/2 = 1)
%// Change - commented out
%// Also, used ORIGINAL downsampled image, not the difference image
%img31 = imresize(img,1,'bicubic');
%LH131 = imresize(LH13,1,'bicubic');
%HL131 = imresize(HL13,1,'bicubic');
%HH131 = imresize(HH13,1,'bicubic');
%// Change - used original downsampled image
img4 = idwt2(img,LH13,HL13,HH13,'haar'); %IDWT
t = im2uint8(img4); %// Change - Convert back to uint8 when finished
imshow(t,[]);
这是我得到的图像:
我没有接近原始的Lena图像。因此,我怀疑要么必须调整一些参数,要么算法存在缺陷。鉴于该方法是在无名期刊上发表的,我怀疑是后者。
这应该让你开始。祝你好运!