超分辨率挑战赛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);
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代码欢迎分享~

背景:超分辨率挑战赛Super Resolution Challenges (e.g. NTIRE) 降采样(downscaling)- bicubic interpolation- 是利用Matlab的imresize()函数实现的。Track info:Track 1: bicubic uses the bicubic downscaling (Matlab imresize), one... def imread(path): img = scipy.misc.imread(path).astype(np.float) if len(img.shape) == 2: # grayscale
imresize函数用于调整图像的大小,暂时用到的语法有两种:B = imresize(A,scale)和B = imresize(A,[numrows numcols])。 B = imresize(A,scale)返回图像B,图像B的尺寸是图像A的scale倍。输入图像A可以是灰度图像,RGB图像,二值图像。如果scale是0到1之间的数,则图像B比图像A要小;如果scale大于1...
img = cv2.imread(img_path,cv2.IMREAD_COLOR) def resize(self, img, height, width, centerCrop=True, interp='bilinear'): imgh, imgw = img.shape[0:2] if centerCrop and imgh != imgw: # center crop side = np.minimum(imgh.
其用法有多种:* 1、B = imresize(A,m) 将图片A放大m倍 2、B = imresize(A,m,method) 将图片A由参数method指定的插值运算方法来改变图像的大小到m倍, method的几种可选值: 'nearest’最近邻插值(默认) 'bilinear’双线性插值 'bicubic’双三次插值 在数...
细节增强的matlab代码图像超分辨率反馈网络 更新:我们建议的门控多反馈网络(GMFN)将出现在BMVC2019。 “通过两个时间步长,每个时间步长包含7个RDB,与包括RDN的最新图像SR方法(其包含16个RDB)相比,所提出的GMFN具有更好的重建性能。” 该存储库是我们建议的SRFBN的Pytorch代码。 该代码由并基于进行开发,并在具有2080Ti 1080Ti GPU的Ubuntu 16.04 18.04环境(Python 3/7,PyTorch 0.4.0 1.0.0 1.0.1,CUDA 10.0)上进行了测试。 我们提出的SRFBN的体系结构。 蓝色箭头表示反馈连接。 有关我们建议的SRFBN的详细信息,请参见。 如果您发现我们的工作对您的研究或出版物有用,请考虑引用: @inproceedings{li2019srfbn, author Yang, Jinglei Zheng Yang, Xiaomin Jeon, Gwanggil imresize函数Matlab用于图像缩放的函数,其用法如下: imresize(A, scale):将图像A按照比例scale进行缩放,scale为一个标量或一个包含两个元素的向量,分别表示宽度和高度的缩放比例。 imresize(A, [M, N]):将图像A缩放为M行N列的图像。 imresize(A, [M, N], method):指定缩放方法,method为字符串,可选值包括:'nearest'(最近邻插值)、'bilinear'(双线性插值)、'bicubic'(双三次插值)等。 imresize(A, [M, N], method, 'Antialiasing', false):关闭抗锯齿功能,可提高缩放速度,但会影响图像质量。 imresize(A, [M, N], method, 'Colormap', cmap):指定颜色映射表,cmap为一个Mx3的矩阵,表示颜色映射表。 imresize(A, [M, N], method, 'Dither', dither):指定抖动方式,dither为一个逻辑值,表示是否使用抖动。 imresize(A, [M, N], method, 'Gamma', gamma):指定伽马值,gamma为一个标量,表示图像的伽马值。 imresize(A, [M, N], method, 'OutputSizeMode', mode):指定输出图像的大小模式,mode为字符串,可选值包括:'full'(输出完整图像)、'valid'(输出与输入图像相同大小的部分)等。 imresize(A, [M, N], method, 'Scale', scale):指定缩放比例,scale为一个标量或一个包含两个元素的向量,分别表示宽度和高度的缩放比例。 imresize(A, [M, N], method, 'SmoothEdges', smooth):指定是否平滑图像边缘,smooth为一个逻辑值,表示是否平滑图像边缘。 以上就是imresize函数的用法,希望能对您有所帮助。 ### 回答2: 在MATLABimresize函数用于调整图像的大小。它可以按比例缩放图像,也可以指定新图像的大小。其函数原型如下: B = imresize(A, scale) B = imresize(A, [numrows numcols]) 其,A为输入图像,scale为缩放比例,B为输出图像。numrows和numcols分别为新图像的行数和列数。 如果scale为1,则新图像大小与原图像大小相同。如果scale小于1,则新图像大小为原图像大小的缩小比例。如果scale大于1,则新图像大小为原图像大小的放大比例。例如,如果scale为0.5,则新图像为原图像的一半大小。 如果指定了numrows和numcols,则新图像大小根据这两个参数确定。如果numrows和numcols与原图像大小比例不同,则图像会被拉伸或压缩以适应新的大小。 除了上面的两个参数外,imresize函数还有其他参数可以控制缩放过程。其,method参数用于指定缩放方法,常用的方法有双线性插值,最近邻插值和双立方插值等。另外,antialias参数用于控制是否抗锯齿,imresize默认会抗锯齿。 需要注意的是,缩放图像会造成信息的损失,因此应该谨慎使用imresize函数。如果需要保持原始图像的质量,在缩放时应该使用更高级别的算法,如基于小波的缩放算法。 ### 回答3: imresize函数matlab图像处理工具箱常用的一个函数,用于对图像进行缩放操作。函数的格式为:B = imresize(A, scale),其A是原始图像,B是缩放后的图像,scale是缩放比例。 scale可以是一个标量,用于同时缩小图像的宽和高;也可以是一个二元组([height, width]),用于指定缩小后的图像高和宽。例如,scale=0.5或scale=[400,300]。 除了缩小图片,imresize函数也可以进行放大图片操作。放大图片时,可以通过interpolation参数指定插值方法。常用的插值方法有:nearest-neighbor、bilinear、bicubic、lanczos。其,nearest-neighbor是最简单的方法,但画质较差;bicubic和lanczos方法可以产生更加平滑的缩放效果,但需要较长的计算时间。 除了缩放比例和插值方法之外,imresize函数还可以通过method参数指定缩放算法。常用的缩放算法有:imresizeimresize3、imfilter。其imresize算法默认使用双线性插值,并支持灰度图像、彩色图像以及各种数据类型的图像。imfilter算法也支持各种数据类型的图像,但需要通过自定义滤波器来实现缩放;imresize3算法则是专门针对3D图像的缩放算法。 总之,imresize函数matlab图像处理工具箱非常强大和实用的一个函数,可以实现对图像进行缩放、放大以及各种矩阵运算操作。但在使用时需要根据实际需求选择适当的缩放比例和插值方法,以及调整算法参数,才能获得最佳的缩放效果。