终于找到一个可以在自己电脑中运行的超分辨率重建程序了,Matlab 7.0真的是太老了(实际上是自己的笔记本太老了,哈哈)
demo_SR.m
% ========================================================================= % 超分辨率卷积神经网络(SRCNN)的测试码 % % 参考文献 % Chao Dong, Chen Change Loy, Kaiming He, Xiaoou Tang. % 学习深度卷积网络的图像超分辨率,欧洲计算机视觉会议记录,2014年 % % Chao Dong % 香港中文大学工业工程系 % 如有任何问题,请发电子邮件至 [email protected] % ========================================================================= close all; clear all; %% 读取真实图像 im = imread('Set5\butterfly_GT.bmp'); %im = imread('Set14\zebra.bmp'); %% 设定参数 up_scale = 3; model = 'model\x3.mat'; % up_scale = 2; % model = 'model\x2.mat'; % up_scale = 4; % model = 'model\x4.mat'; %% 仅在照度方面工作 if size(im,3)>1 im = rgb2ycbcr(im); im = im(:, :, 1); end im_gnd = modcrop(im, up_scale); im_gnd = double(im_gnd)/255;%single 这里换成double Matlab 7.0就可以运行了 %% 双三次插值 im_l = imresize(im_gnd, 1/up_scale, 'bicubic'); %缩小 im_b = imresize(im_l, up_scale, 'bicubic');%再放大 %% SRCNN im_h = SRCNN(model, im_b); %% 删除边框 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]); %% 计算 PSNR psnr_bic = compute_psnr(im_gnd,im_b); psnr_srcnn = compute_psnr(im_gnd,im_h); %% 显示结果 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']);
这个演示先把图像缩小了再来超分辨率重建放大只能说明某种对比效果,
用自己的图像重建才有趣:
% 超分辨率重建(卷积神经网络(SRCNN))单色 % % 设定参数:文件名、放大倍数 close all;clear all; % 文件名 name='6b.jpg';%'7b.png'; % 放大倍率 2,3 或 4 倍 up_scale = 3; %% 读取一个图像 im = imread(name); if up_scale == 3 model = 'model\x3.mat'; else if up_scale == 4 model = 'model\x4.mat'; else up_scale = 2; model = 'model\x2.mat'; end end %% 仅在照度方面工作 % 对YCrCb颜色空间中的Y通道进行重建 if size(im,3)>1 im = rgb2ycbcr(im); im = im(:, :, 1); end %调整图像大小(与放大率匹配的) im_gnd = modcrop(im, up_scale); im_gnd = double(im_gnd)/255;%single %% 双三次插值 % 先将低分辨率图像使用双三次差值放大至目标尺寸(如放大至2倍、3倍、4倍) im_b = imresize(im_gnd, up_scale, 'bicubic'); %% SRCNN im_h = SRCNN(model, im_b); im_h=uint8(im_h * 255); figure, imshow(im_h); title('SRCNN 重建'); %保存结果 imwrite(im_h, ['SRCNN 重建' '.jpg']);
输入图:
重建图(分别是 2、3、4倍):
这是单色。
再把颜色加上去(颜色部分只是双三次放大,毕竟重建速度慢)
% 超分辨率重建(卷积神经网络(SRCNN)) % % 设定参数:文件名、放大倍数 close all;clear all; % 文件名 name='6b.jpg';%'7b.png'; % 放大倍率 2,3 或 4 倍 up_scale = 3; %% 读取一个图像 im = imread(name); if up_scale == 3 model = 'model\x3.mat'; else if up_scale == 4 model = 'model\x4.mat'; else up_scale = 2; model = 'model\x2.mat'; end end %调整图像大小(与放大率匹配的) im = modcrop(im, up_scale); im = double(im)/255;%single %% 双三次插值 % 先将低分辨率图像使用双三次差值放大至目标尺寸(如放大至2倍、3倍、4倍) im = imresize(im, up_scale, 'bicubic'); %% 仅在照度方面工作 if size(im,3)>1 im = rgb2ycbcr(im); im_b = im(:, :, 1);%1、2、3分别是Y、Cr、Cb im2 = im(:, :, 2); im3 = im(:, :, 3); else im_b=im; end %% SRCNN im_h = SRCNN(model, im_b);% 对YCrCb颜色空间中的Y通道进行重建 if size(im,3)>1 [m,n]=size(im_h); im_h1=zeros(m,n,3);%三通道合回 im_h1(:,:,1)=im_h; im_h1(:,:,2)=im2; im_h1(:,:,3)=im3; im_h1 = uint8(im_h1 * 255);%转回uint8 im_h1 = ycbcr2rgb(im_h1);%转回rgb else im_h1=uint8(im_h * 255); end %% 删除边框 %im_h1 = shave(im_h1, [up_scale, up_scale]); figure, imshow(im_h1); title('SRCNN 重建');%显示 %保存结果 imwrite(im_h1, ['SRCNN 重建' '.jpg']);
重复3倍试试 3x3=9倍:
听说这个SRCNN是最简单的,效果还是很不错的。