我一直在阅读一个回合超分辨率图像重建主题,该领域的目的是从多个移位(子像素)低分辨率(LR)图像创建高分辨率(HR)图像。以下代码从一个HR图像创建4个LR图像。然后使用非unifrom插值在高分辨率网格上插入4个LR图像,以获得两侧大于LR的HR图像。
的main.m
im=double(imread('lena.bmp'));
figure,imshow(uint8(im)),title('original HR image');
shifts=[ 0, 0;
4.1, 2.68;
-3.7, 7.8;
-1.1, -6.5];
factor=4;
im1=create_low(im,shifts(1,1),shifts(1,2),factor);
im2=create_low(im,shifts(2,1),shifts(2,2),factor);
im3=create_low(im,shifts(3,1),shifts(3,2),factor);
im4=create_low(im,shifts(4,1),shifts(4,2),factor);
LR_images={im1,im2,im3,im4};
estimated_image = interpolate(LR_images,shifts,factor);
figure,imshow(uint8(estimated_image)),title('reconstructed image');
create_low.m 此功能可创建4张LR图像。
function [ low ] = create_low(im,x_shift,y_shift,factor)
low = shift(im,x_shift,y_shift);
low=downsample(low,factor);
low=low';
low = downsample(low,factor);
low=low';
end
shift.m此函数通过线性插值使子像素移位。
interpolate.m 将4个LR图像插值到HR网格上。
function rec = interpolate(s,shifts,factor)
n=length(s);
ss = size(s{1});
if (length(ss)==2) ss=[ss 1]; end
% compute the coordinates of the pixels from the N images.
for k=1:ss(3) % for each color channel
for i=1:n % for each image
s_c{i}=s{i}(:,:,k);
s_c{i} = s_c{i}(:);
r{i} = [1:factor:factor*ss(1)]'*ones(1,ss(2)); % create matrix with row indices
c{i} = ones(ss(1),1)*[1:factor:factor*ss(2)]; % create matrix with column indices
r{i} = r{i}+factor*shifts(i,2); %% the problem is here.
c{i} = c{i}+factor*shifts(i,1); %% the problem is here.
rn{i} = r{i}((r{i}>0)&(r{i}<=factor*ss(1))&(c{i}>0)&(c{i}<=factor*ss(2)));
cn{i} = c{i}((r{i}>0)&(r{i}<=factor*ss(1))&(c{i}>0)&(c{i}<=factor*ss(2)));
sn{i} = s_c{i}((r{i}>0)&(r{i}<=factor*ss(1))&(c{i}>0)&(c{i}<=factor*ss(2)));
end
s_ = []; r_ = []; c_ = []; sr_ = []; rr_ = []; cr_ = [];
for i=1:n % for each image
s_ = [s_; sn{i}];
r_ = [r_; rn{i}];
c_ = [c_; cn{i}];
end
clear s_c r c coord rn cn sn
% interpolate the high resolution pixels using cubic interpolation
rec_col = griddata(c_,r_,s_,[1:ss(2)*factor],[1:ss(1)*factor]','cubic');
rec(:,:,k) = reshape(rec_col,ss(1)*factor,ss(2)*factor);
end
rec(isnan(rec))=0;
我使用griddata
函数进行插值(立方体),重建的图像太糟糕了,因为我认为'griddata`参数的值是错误的。如何纠正它们?
注意:当我更改此代码时
r{i} = r{i}+factor*shifts(i,2); %% the problem is here.
c{i} = c{i}+factor*shifts(i,1); %% the problem is here.
到
r{i} = r{i}-shifts(i,2); %% the problem is here.
c{i} = c{i}-shifts(i,1); %% the problem is here.
我得到了一个好的形象,但我不知道为什么!
修改
lena.bmp
答案 0 :(得分:0)
在create_low中,您应用高分辨率坐标的移位。所以在插值中你也应该应用高分辨率坐标的移位。因此,完全有道理的是,你不应该将它们乘以因子 - 正如你已经发现的那样。