【工具】——图像批量降采样Matlab程序(Bicubic/Bicubic+Blur/Bicubic+Noise)

概述

  • 程序功能:批量对图片进行不同下采样模型(BI模型/BD模型/BN模型)进行不同放大倍数的下采样
  • 应用场景:图像超分辨率重建获得降采样图片
  • 程序平台:Matlab
function Prepare_TestData_HR_LR()
clear all; close all; clc
path_original = './OriginalTestData';           % HR路径
dataset  = {'Set5'};                            % 待降采样的文件夹名称
ext = {'*.jpg', '*.png', '*.bmp'};              % 可识别图片格式

degradation = 'BI'; % BI, BD, DN降采样类型
if strcmp(degradation, 'BI') 
    scale_all = [2,3,4,8];
else
    scale_all = 3;
end

for idx_set = 1:length(dataset) % 对不同的数据集降采样
    fprintf('Processing %s:\n', dataset{idx_set});
    filepaths = [];
    for idx_ext = 1:length(ext) % 找某数据集内的所有图片名称
        filepaths = cat(1, filepaths, dir(fullfile(path_original, dataset{idx_set}, ext{idx_ext})));
    end
    for idx_im = 1:length(filepaths)    % 遍历所有图片
        name_im = filepaths(idx_im).name;
        fprintf('%d. %s: ', idx_im, name_im);
        im_ori = imread(fullfile(path_original, dataset{idx_set}, name_im));
        if size(im_ori, 3) == 1         % 灰度图像拓展到3通道
            im_ori = cat(3, im_ori, im_ori, im_ori);
        end
        for scale = scale_all           % 单个图片不同降采样倍数循环
            fprintf('x%d ', scale);
            im_HR = modcrop(im_ori, scale);
            if strcmp(degradation, 'BI')    % 对不同降采样模型分别进行不同的处理
                im_LR = imresize(im_HR, 1/scale, 'bicubic');
            elseif strcmp(degradation, 'BD')
                im_LR = imresize_BD(im_HR, scale, 'Gaussian', 1.6); % sigma=1.6
            elseif strcmp(degradation, 'DN')
                randn('seed',0); % For test data, fix seed. But, DON'T fix seed, when preparing training data.
                im_LR = imresize_DN(im_HR, scale, 30); % noise level sigma=30
            end
            % folder
            folder_HR = fullfile('./HR', dataset{idx_set}, ['x', num2str(scale)]);
            folder_LR = fullfile(['./LR/LR', degradation], dataset{idx_set}, ['x', num2str(scale)]);
            if ~exist(folder_HR)
                mkdir(folder_HR)
            end
            if ~exist(folder_LR)
                mkdir(folder_LR)
            end
            % fn
            fn_HR = fullfile('./HR', dataset{idx_set}, ['x', num2str(scale)], [name_im(1:end-4), '_HR_x', num2str(scale), '.png']);
            fn_LR = fullfile(['./LR/LR', degradation], dataset{idx_set}, ['x', num2str(scale)], [name_im(1:end-4), '_LR', degradation, '_x', num2str(scale), '.png']);
            imwrite(im_HR, fn_HR, 'png');
            imwrite(im_LR, fn_LR, 'png');
        end
        fprintf('\n');
    end
    fprintf('\n');
end
end

% 裁剪图片,裁剪不能被降采样倍数整除的图片(右/下)边
function imgs = modcrop(imgs, modulo)   
if size(imgs,3)==1
    sz = size(imgs);
    sz = sz - mod(sz, modulo);
    imgs = imgs(1:sz(1), 1:sz(2));
else
    tmpsz = size(imgs);
    sz = tmpsz(1:2);
    sz = sz - mod(sz, modulo);
    imgs = imgs(1:sz(1), 1:sz(2),:);
end
end

function [LR] = imresize_BD(im, scale, type, sigma)

if nargin ==3 && strcmp(type,'Gaussian')
    sigma = 1.6;
end

if strcmp(type,'Gaussian') && fix(scale) == scale
    if mod(scale,2)==1
        kernelsize = ceil(sigma*3)*2+1;
        if scale==3 && sigma == 1.6
            kernelsize = 7;
        end
        kernel  = fspecial('gaussian',kernelsize,sigma);
        blur_HR = imfilter(im,kernel,'replicate');
        
        if isa(blur_HR, 'gpuArray')
            LR = blur_HR(scale-1:scale:end-1,scale-1:scale:end-1,:);
        else
            LR      = imresize(blur_HR, 1/scale, 'nearest');
        end
        
        
        % LR      = im2uint8(LR);
    elseif mod(scale,2)==0
        kernelsize = ceil(sigma*3)*2+2;
        kernel     = fspecial('gaussian',kernelsize,sigma);
        blur_HR    = imfilter(im, kernel,'replicate');
        LR= blur_HR(scale/2:scale:end-scale/2,scale/2:scale:end-scale/2,:);
        % LR         = im2uint8(LR);
    end
else
    LR = imresize(im, 1/scale, type);
end
end

function ImLR = imresize_DN(ImHR, scale, sigma)

% ImLR and ImHR are uint8 data
% downsample by Bicubic
ImDown = imresize(ImHR, 1/scale, 'bicubic'); % 0-255
ImDown = single(ImDown); % 0-255
ImDownNoise = ImDown + single(sigma*randn(size(ImDown))); % 0-255
ImLR = uint8(ImDownNoise); % 0-255
end

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值