【超分辨率】超分辨率中的imresize函数(python, Matlab)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shwan_ma/article/details/84620686

背景:

超分辨率挑战赛Super Resolution Challenges (e.g. NTIRE) 降采样(downscaling)- bicubic interpolation- 是利用Matlab的imresize()函数实现的。

Track info:
Track 1: bicubic uses the bicubic downscaling (Matlab imresize), one of the most common settings from the recent single-image super-resolution literature.

More info:
For obtaining the low res images we use the Matlab function “imresize” with default settings (bicubic interpolation) and the desired downscaling factors: 2, 3, and 4.

导致

由于目前主流的论文采用的都是Matlab的imresize函数,这也就导致了两个问题:

  1. 我们对训练集的构造需要利用Matlab的imresize去实现
  2. 参考的一些算法的预插值也是用的Matlab的imresize函数

Matlab中的实现方式:

一般来说,先对图像进行归一化至[0,1]之间,然后再进行resize,然后再进行计算PSNR。

im  = imread(['./Set5/' num2str(imglist(i).name)]);
im = modcrop(im, up_scale);
if size(im,3)>1
    im = rgb2ycbcr(im);
    im = im(:, :, 1);
end
im_gnd = im;
im_gnd = single(im_gnd)/255;

im_l = imresize(im_gnd, 1/up_scale, 'bicubic');
im_b = imresize(im_l, up_scale, 'bicubic');

im_gnd = shave(uint8(im_gnd * 255), [up_scale, up_scale]);
im_b = shave(uint8(im_b * 255), [up_scale, up_scale]);

psnr_bic = compute_psnr(im_gnd,im_b)

matlab 实验结果

实验结果如主流论文中一致,当上采样因子为x2时,Set5的平均PSNR为33.66

Python中的实现方式:

一、scipy的实现方式:

scipy的API文档:
在这里插入图片描述

注意:如果模式是None, L, P, 1其中之一的话,scipy会把输入的图像(无论输入是[0,1]还是[0.255])进行拉伸到[0,255]的数值范围。所以当把图像归一化后数值被imresize会重新拉伸,导致损失精度较大

这里模式: mode = 1: 二值图像; mode = L : 灰度图像; mode = P: 8位彩图(FCN网络);mode = None:default

scale = 2
imgDir = './data/Set5/'
imglist = os.listdir(imgDir)
imgs = utils.load_images_alignment(imgDir,imglist)
for i in range(len(imgs)):
    imgs[i] = rgb2ycbcr(imgs[i])

import scipy.misc as smi
inter_imgs = []
for i in range(len(imgs)):
    img = imgs[i]
    h,w = img.shape[0], img.shape[1]
    h_, w_ =  int(h/scale), int(w/scale)
    im_l = smi.imresize(img, (h_,w_),interp='bicubic')
    im_b = smi.imresize(im_l, (h,w), interp='bicubic')
    inter_imgs.append(im_b)

total_sum = 0
for i in range(len(inter_imgs)):
    x = shave(np.uint8(inter_imgs[i]))
    y = shave(np.uint8(imgs[i]))
    ps = calcPSNR(x,y)
    print(ps)
    total_sum += ps
print("ave PSNR:", total_sum/len(inter_imgs))

scipy实验结果:

注意:此处不能进行输入归一化后的图像进行imresize,否则精度损失太大。在放大x2的情况下,Set5的PSNR为33.63


二、PIL的实现方式:

PIL的resize仅仅支持Image格式的数据,所以需要执行Image.open()或者Image.fromarray()函数。不过注意,PIL的resize由于仅仅支持Image的数据格式,因此也不支持[0,1]的数据输入形式。

scale = 2
imgDir = './data/Set5/'
imglist = os.listdir(imgDir)
imgs = utils.load_images_alignment(imgDir,imglist)
for i in range(len(imgs)):
    imgs[i] = rgb2ycbcr(imgs[i])
    imgs[i] = Image.fromarray(imgs[i])

inter_imgs = []
for i in range(len(imgs)):
    img = imgs[i]
    h,w = img.size
    h_, w_ =  int(h/scale), int(w/scale)
    im_l = img.resize((h_,w_),Image.BICUBIC)
    im_b = im_l.resize((h,w), Image.BICUBIC)
    inter_imgs.append(im_b)

total_sum = 0
for i in range(len(inter_imgs)):
    x = shave(np.uint8(np.float32(inter_imgs[i])), scale);
    y = shave(np.uint8(imgs[i]), scale);
    ps = calcPSNR(x,y)
    print(ps)
    total_sum += ps
print("ave PSNR:", total_sum/len(inter_imgs))

PIL实验结果:

注意:PIL此处也不能接受输入归一化后的图像进行imresize。在放大x2的情况下,Set5的PSNR为33.63

结论:

  1. matlab 的bicubic实现方法之所以与python库中不同的原因是因为,matlab加了anti-antialiasing。
  2. 一般来说,python里面的scipy或者PIL的imresize也足够给我们研究使用了,不过在训练模型的时候,与matlab版本的会有一些不同。这个部分可以尝试自己去实现。
  3. 如果大家有实现matlab版本的pthon代码欢迎分享~

猜你喜欢

转载自blog.csdn.net/shwan_ma/article/details/84620686