博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SRCNN(一)
阅读量:6709 次
发布时间:2019-06-25

本文共 4617 字,大约阅读时间需要 15 分钟。

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 重建的峰值信噪比。

  • 原图:

    1473324-20180922210918714-2113086824.jpg

  • 双三次插值 vs SRCNN重建:

    1473324-20180922210934210-290799371.png


三、demo_SR.m 代码分析

  • 根据邹老师的提示:进行单步跟踪,看代码同时要边调试边看效果
  • 我选择 Matlab 中的运行节对代码进行查看

  • 读取真实图像

close all;clear all                                                         清空工作区%% read ground truth image                                      im  = imread('Set5\butterfly_GT.bmp');

1473324-20180922210952715-1842859241.png

此时读入名为 butterbly_GT 的图片,工作区显示图片的值

  • 设定参数

%% set parameters                                                 up_scale = 3;model = 'model\9-5-5(ImageNet)\x3.mat';

1473324-20180922211002245-24195004.png

这段代码实现参数设置的功能。

其中up_scale为这段代码设定的放大倍率,当 up_scale = 3 时,选择模型为 x3.mat

  • 仅在照度方面

%% work on illuminance only                                       if size(im,3)>1    im = rgb2ycbcr(im);    im = im(:, :, 1);endim_gnd = modcrop(im, up_scale);im_gnd = single(im_gnd)/255;

1473324-20180922211021430-1551417228.png

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 interpolationim_l = imresize(im_gnd, 1/up_scale, 'bicubic'); %缩小三倍im_b = imresize(im_l, up_scale, 'bicubic');     %放大三倍

1473324-20180922211354159-327005976.png

imresize() 函数用于调整图像大小,在这里的用法传入三个参数,第一为图片,第二为函数将 图像的长宽大小缩放的倍数,第三为缩放的方法,这里使用的 bicubic 即双三次插值的方法。使用双三次插值的方法产生的图片输出像素值是最近 4×4 邻点中的像素的加权平均值。

至此,梳理各个参数所代表的值

  • im_l :im_gnd 进行双三次插值缩小后的图像
  • im_b : im_gnd 进行双三次插值缩小后,再进行同比例放大的图像

  • SRCNN

%%  SRCNNim_h = SRCNN(model, im_b);

1473324-20180922211413073-1630919326.png

此过程根据 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]);

1473324-20180922211421168-1792339722.png

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);

1473324-20180922211429480-447711608.png

compute_psnr() 函数在文件 compute_psnr.m 中有定义

function psnr=compute_psnr(im1,im2)if size(im1, 3) == 3,    im1 = rgb2ycbcr(im1);    im1 = im1(:, :, 1);endif size(im2, 3) == 3,    im2 = rgb2ycbcr(im2);    im2 = im2(:, :, 1);endimdff = 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);endim_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');%% SRCNNim_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 重建');

1473324-20180922211457258-1023405383.png


五、结语

这周的学习主要是对 SRCNN 的整个流程进行了重新认识,明白了各个步骤的主要任务,了解到论文中 SRCNN 其实是对图片的 Y 通道提取后,进行重建,最后通过输出 PSNR 和图片的方式,来对重建的程度进行分析。

下周将对 SRCNN.m 文件进行学习,并在学习卷积、步长等概念后对 SRCNN 的三个卷积过程有更深刻的理解。

转载于:https://www.cnblogs.com/howtoloveyou/p/9691233.html

你可能感兴趣的文章
C# 递归查找文件夹下所有文件和子文件夹的所有文件
查看>>
如何发布你的 Maya 应用到欧特克官方的 Exchange Store
查看>>
react之自定义react-redux的provider、connect
查看>>
JQuery中工厂函数$()初探
查看>>
网上发现的一个android UI包
查看>>
新闻源图片放到js里
查看>>
SpringBoot学习:整合Mybatis,使用HikariCP超高性能数据源
查看>>
Java--面向对象
查看>>
微信模板消息群发系统
查看>>
高内聚低耦合
查看>>
2012 chengdu现场赛 Browsing History HDU4464(简单字符串)
查看>>
Codeforces Round #239 (Div. 1) 解题报告
查看>>
R与JAVA的混合编程
查看>>
hibernate工作流程、session
查看>>
python_时间日期
查看>>
MVC架构介绍-序列化属性
查看>>
问题2017S02
查看>>
用合适的索引避免不必要的全表扫描
查看>>
Ajax上传文件
查看>>
445. Add Two Numbers II - Medium
查看>>