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中運行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM