SRCNN(一)
SRCNN学习(一):demo_SR.m
一、demo_SR.m 使用方法
1、Place the "SRCNN" folder into "($Caffe_Dir)/examples
2、Open MATLAB and direct to ($Caffe_Dir)/example/SRCNN, run "demo_SR.m"
二、demo_SR.m 运行结果
根据 demo.m 的代码,显示结果为双三次插值后的图片和 SRCNN 重建后的图片,同时输出双三次插值的峰值信噪比以及 SRCNN 重建的峰值信噪比。
原图:
双三次插值 vs SRCNN重建:
三、demo_SR.m 代码分析
根据邹老师的提示:进行单步跟踪,看代码同时要边调试边看效果
我选择 Matlab 中的运行节对代码进行查看
读取真实图像
close all;
clear all 清空工作区
%% read ground truth image
im = imread('Set5\butterfly_GT.bmp');
此时读入名为 butterbly_GT 的图片,工作区显示图片的值
设定参数
%% set parameters
up_scale = 3;
model = 'model\9-5-5(ImageNet)\x3.mat';
这段代码实现参数设置的功能。
其中up_scale为这段代码设定的放大倍率,当 up_scale = 3 时,选择模型为 x3.mat
仅在照度方面
%% work on illuminance only
if size(im,3)>1
im = rgb2ycbcr(im);
im = im(:, :, 1);
end
im_gnd = modcrop(im, up_scale);
im_gnd = single(im_gnd)/255;
size(im,3) 返回第三维度的长度,由前面可知 im 的值为 256x256x3 uint8,所以返回值应大于1会进入循环。
rgb2ycbcr(im) 将彩色RGB图像转换为 YCbCr 颜色空间中的等效图像, im(:,:,1) 将 im 的第三维度长修改为1。
modcrop(im,up_scale) 该函数在 modcrop.m 文件中有对应的定义:
function imgs = modcrop(imgs, modulo) modcrop函数
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
该函数将图片裁剪为能够调整的大小(与放大率匹配)
双三次插值
%% bicubic interpolation
im_l = imresize(im_gnd, 1/up_scale, 'bicubic'); %缩小三倍
im_b = imresize(im_l, up_scale, 'bicubic'); %放大三倍
imresize() 函数用于调整图像大小,在这里的用法传入三个参数,第一为图片,第二为函数将 图像的长宽大小缩放的倍数,第三为缩放的方法,这里使用的 bicubic 即双三次插值的方法。使用双三次插值的方法产生的图片输出像素值是最近 4×4 邻点中的像素的加权平均值。
至此,梳理各个参数所代表的值
im_l :im_gnd 进行双三次插值缩小后的图像
im_b : im_gnd 进行双三次插值缩小后,再进行同比例放大的图像
SRCNN
%% SRCNN
im_h = SRCNN(model, im_b);
此过程根据 SRCNN 对 im_b 进行训练,产生 im_h 图像
删除边框
%% remove border
im_h = shave(uint8(im_h * 255), [up_scale, up_scale]);
im_gnd = shave(uint8(im_gnd * 255), [up_scale, up_scale]);
im_b = shave(uint8(im_b * 255), [up_scale, up_scale]);
shave() 函数在文件 shave.m 中有定义:
function I = shave(I, border)
I = I(1+border(1):end-border(1),...
1+border(2):end-border(2), :, :,);
计算 PSNR
%% compute PSNR
psnr_bic = compute_psnr(im_gnd,im_b);
psnr_srcnn = compute_psnr(im_gnd,im_h);
compute_psnr() 函数在文件 compute_psnr.m 中有定义
function psnr=compute_psnr(im1,im2)
if size(im1, 3) == 3,
im1 = rgb2ycbcr(im1);
im1 = im1(:, :, 1);
end
if size(im2, 3) == 3,
im2 = rgb2ycbcr(im2);
im2 = im2(:, :, 1);
end
imdff = double(im1) - double(im2);
imdff = imdff(:);
rmse = sqrt(mean(imdff.^2));
psnr = 20*log10(255/rmse);
在论文中提到 PSNR 是一种用于定量评估图像恢复质量的广泛使用的度量,并且与感知质量部分相关,2个图像之间 PSNR 值越大,则越相似。普遍基准为 30dB ,30dB 以下的图像劣化较为明显。PSNR 定义为:
PSNR = 10log10(MAX^2/MSE)
这里 MAX 表示图像颜色的最大数值,8bit 图像取值为255。MSE(均方差),即 m×n 单色图像 I 和 K(原图像与处理图像)之间均方误差。
compute_psnr() 就是对生成的图像与原图对比,形成信噪比的直观查看方式。
显示结果
%% show results
fprintf('双三次插值的峰值信噪比: %f dB\n', psnr_bic);
fprintf('SRCNN 重建的峰值信噪比: %f dB\n', psnr_srcnn);
figure, imshow(im_b); title('双三次插值');
figure, imshow(im_h); title('SRCNN 重建');
imwrite(im_b, ['双三次插值' '.bmp']);
imwrite(im_h, ['SRCNN 重建' '.bmp']);
输出两张图片,以及两次比较的信噪比。
四、实践
由于通过论文给的函数只会输出灰度的图像,我在网上查看他人的代码时发现输出具有颜色的图像的方式。
下面时我根据他的代码进行修改后输出的结果
close all;
clear all;
%% read ground truth image 读取真实图像
im = imread('Set5\butterfly_GT.bmp');
%% set parameters 设定参数
up_scale = 3;
model = 'model\9-5-5(ImageNet)\x3.mat';
%% work on illuminance only 仅在照度方面
if size(im,3)>1
im = rgb2ycbcr(im);
im_U = im(:, :, 1);
end
im_gnd = modcrop(im_U, up_scale);
im_gnd = single(im_gnd)/255;
im_gnd2 = modcrop(im, up_scale);
im_gnd2 = single(im_gnd2)/255;
im_2 = im_gnd2(:, :, 2);
im_3 = im_gnd2(:, :, 3);
%% bicubic interpolation 双三次插值
im_l = imresize(im_gnd, 1/up_scale, 'bicubic');
im_b = imresize(im_l, up_scale, 'bicubic');
%% SRCNN
im_h = SRCNN(model, im_b);
%% 三通道合回
[m,n] = size(im_h);
im_h1 = zeros(m,n,3);
im_h1(:, :, 1) = im_h;
im_h1(:, :, 2) = im_2;
im_h1(:, :, 3) = im_3;
im_h1 = uint8(im_h1 * 255);%转回uint8
im_h1 = ycbcr2rgb(im_h1);%转回rgb
%% remove border 删除边框
im_h1 = shave(im_h1, [up_scale, up_scale]);
%% show results 显示结果
figure, imshow(im_h1);
title('SRCNN 重建');
五、结语
这周的学习主要是对 SRCNN 的整个流程进行了重新认识,明白了各个步骤的主要任务,了解到论文中 SRCNN 其实是对图片的 Y 通道提取后,进行重建,最后通过输出 PSNR 和图片的方式,来对重建的程度进行分析。
下周将对 SRCNN.m 文件进行学习,并在学习卷积、步长等概念后对 SRCNN 的三个卷积过程有更深刻的理解。
参考博客:超分辨率重建SRCNN--Matlab 7.0中运行
SRCNN(一)的更多相关文章
- 『超分辨率重建』从SRCNN到WDSR
超分辨率重建技术(Super-Resolution)是指从观测到的低分辨率图像重建出相应的高分辨率图像.SR可分为两类: 1. 从多张低分辨率图像重建出高分辨率图像 2. 从单张低分辨率图 ...
- SRCNN
SRCNN(超分辨率卷积神经网络) 网络结构 l Conv1: f1 = 9 *9 activation = ‘relu’ l Conv2: f2 = 1 *1 activation = ‘rel ...
- SRcnn:神经网络重建图片的开山之作
% ========================================================================= % Test code for Super-Re ...
- SRCNN之后的深度学习超分辨率
SRCNN开山之作 IDN 信息蒸馏网络information distillation network(IDN) Fast and Accurate Single Image Super-Resol ...
- SRCNN代码分析
代码是作者页面上下载的matlab版.香港中文大学汤晓鸥教授.Learning a Deep Convolutional Network for Image Super-Resolution. htt ...
- 体验SRCNN和FSRCNN两种图像超分网络应用
摘要:图像超分即超分辨率,将图像从模糊的状态变清晰. 本文分享自华为云社区<图像超分实验:SRCNN/FSRCNN>,作者:zstar. 图像超分即超分辨率,将图像从模糊的状态变清晰.本文 ...
- 比SRCNN效果好的传统超分辨率算法汇总
1.基于深度协作表达的人脸图像超分辨率算法研究与应用_百度学术 采用一种深度协作表达算法框架,构造深度的多线性模型 分段拟合高低分辨率图像块之间的非线性关系,本文算法简洁高效,提供了一种新的深度学习模 ...
- SRCNN 卷积神经网络
2019-05-19 从GitHub下载了代码(这里) 代码量虽然不多,但是第一次学,花了时间还是挺多的.根据代码有跑出结果(基本没有改),但是对于数据集的处理还是看的很懵逼,主要是作者的实现都是用类 ...
- DL论文
题目:Accurate Image Super-Resolution Using Very Deep Convolutional Networks(2016CVPR) 摘要:文中提出了一种高精度处理单 ...
随机推荐
- Python基础总结与实践
Python简介 Python是一种动态解释型编程语言,在模块载入时将源码编译成字节码, 这些字节码被虚拟机PVM解释执行,其中解释执行是Python性能较低的主要原因: Python使用C语言编写, ...
- 为什么L1稀疏,L2平滑?
使用机器学习方法解决实际问题时,我们通常要用L1或L2范数做正则化(regularization),从而限制权值大小,减少过拟合风险.特别是在使用梯度下降来做目标函数优化时,很常见的说法是, L1正 ...
- Oracle表连接学习笔记
目录 一.表连接类型 1.1 内连接 1.2 外连接 二.表连接方法 2.1 表连接方法分类 2.2 表连接方法特性区别 @ 一.表连接类型 表连接类型可以分为:内连接.外连接,在看<收获,不止 ...
- java从键盘输入学生成绩,找出最高分,并输出学生成绩等级。
/*从键盘输入学生成绩,找出最高分,并输出学生成绩等级:成绩 >=最高分-10 等级为A成绩 >=最高分-20 等级为B成绩 >=最高分-30 等级为C其余为 等级为D 提示:先输入 ...
- jrtplib移植
jrtplib版本:3.11.1 jthread版本:1.3.3 libsrtp版本:1.6.0 jrtplib库有两种编译方式: 1. 使能jthread编译,此方式可使jrtplib自动在后台轮询 ...
- innobackup 参数
innobackupex [--compress] [--compress-threads=NUMBER-OF-THREADS] [--compress-chunk-size=CHUNK-SIZE] ...
- Emgu.CV.CvInvoke的类型初始值设定项引发异常
被这个问题蛋疼了一个下午,终于解决了.我的服务器出现这个问题的原因:可能是没有安装emgucv. 解决方法: 1.下载并安装emgucv 下载地址:链接: https://pan.baidu.com/ ...
- shell脚本中的交互式输入自动化
shell中有时我们需要交互,但是呢我们又不想每次从stdin输入,想让其自动化,这时我们就要使shell交互输入自动化了. 1 利用重定向 重定向的方法应该是最简单的 例: 以下的te ...
- UVA_10653 公主与王子 #刘汝佳DP题刷完计划
题意如蓝书66页例题27所示. 这个问题描述了一个LCS的特殊情况——单个字符串内所有元素各不相同. 题目要求输入两个数字串,A,B,要求求出最长公共字串.且数字上限是256*256. 做法:数组A表 ...
- shell脚本杀掉指定进程下所有子进程(包括子进程的子进程)
搜索了网上好像并没有杀掉指定进程下所有子进程(包括子进程的子进程)的脚本,自己琢磨写了一版,虽说比较简单,但希望分享大家,帮助需要的人 #!/bin/sh # 递归找到进程最底层子进程并杀除. mai ...