首先是编写代码需要用到的知识,如numpy和tensorflow,cv2的使用
参照的代码是github上的SRCNN的实现,网址如下:

https://github.com/Edwardlzy/SRCNN

基本的配置

对于图片放大或者缩小的倍数是3

scale=3

图片输入的大小是33,图片输出的是21,使用图片进行训练的步长是14.使用图片进行测试的步长是21

图片的预处理

def im2double(im):
    info = np.iinfo(im.dtype)
    return im.astype(np.float) / info.max

这里是对图片进行归一化处理,比如对于精度为8的,就是除以255.让图片所有的值都是在0到1之间。

为什么要进行归一化?

分为两个方法来说,针对与图片来说,转化为标准模式。
针对于训练网络来说,加速训练。

然后就是图片的裁剪,裁剪成可以被整除的图片

def modcrop(image, scale=3):
    if image.shape[2] == 1:
        size = image.shape
        size -= np.mod(size, scale)
        image = image[0:size[0], 0:size[1]]
    else:
        size = image.shape[0:2]
        size -= np.mod(size, scale)
        image = image[0:size[0], 0:size[1], 0]
    return image

传入图片,实际上就是numpy的***数组。
如果 image.shape[2] == 1,表示就是一个灰度图片。

def modcrop_color(image, scale=3):
    size = image.shape[0:2]# 0----1,不包括2
    size -= np.mod(size, scale)
    image = image[0:size[0], 0:size[1], :]
    return image

最后保留的有颜色的图片

size -= np.mod(size, scale)

实例代码

dirpath = './Train/'
for root, dirs, files in os.walk(dirpath):
    for file in files:
        img = cv.imread(dirpath + file)
        img = cv.cvtColor(img, cv.COLOR_BGR2YCR_CB)
        img = im2double(img) # Only use the luminance value.

        # Create groundtruth and baseline image.
        im_label = modcrop(img)
        size = im_label.shape
        h = size[0]
        w = size[1]
        im_temp = scipy.misc.imresize(im_label, 1/scale, interp='bicubic')
        im_input = scipy.misc.imresize(im_temp, scale, interp='bicubic')

        # Generate subimages for training.
        for x in range(0, h - size_input, stride):
            for y in range(0, w - size_input, stride):
                subim_input = im_input[x : x + size_input, y : y + size_input]
                subim_label = im_label[int(x + padding) : int(x + padding + size_label), int(y + padding) : int(y + padding + size_label)]

                subim_input = subim_input.reshape([size_input, size_input, 1])
                subim_label = subim_label.reshape([size_label, size_label, 1])

                data.append(subim_input)
                label.append(subim_label)
                counter += 1
order = np.random.choice(counter, counter, replace=False)
data = np.array([data[i] for i in order])
label = np.array([label[i] for i in order])

打乱顺序,但是data和label依次是对应的

文件的读写

我们使用的训练测试图片都是转化为h5的形式的进行使用的

# Write to HDF5 file.
savepath = os.path.join(os.getcwd(), 'checkpoint/train.h5')
with h5py.File(savepath, 'w') as hf:
    hf.create_dataset('data', data=data)
    hf.create_dataset('label', data=label)

总结

以上就是对图片(训练集和测试集)预处理的总结
1,使用的图片的大小(33----->21),训练步长14,测试步长21
2,图片的归一化以及图片的裁剪

def im2double(im):
    info = np.iinfo(im.dtype)
    return im.astype(np.float) / info.max

图片的裁剪

def modcrop_color(image, scale=3):
    size = image.shape[0:2]# 0----1,不包括2
    size -= np.mod(size, scale)
    image = image[0:size[0], 0:size[1], :]
    return image

3,图片的扩大和缩小

    im_temp = scipy.misc.imresize(im_label, 1/scale, interp='bicubic')
    im_input = scipy.misc.imresize(im_temp, scale, interp='bicubic')