本文是摘抄与总结,仅供自己学习和日后查阅使用。
可以自己写一个双线性插值函数,
-------------------------------------------------------------------
function outputimg = my_imresize(A,n)
% A 是图像矩阵,n是放缩的倍数
% 返回值outputimg是一个放缩后的图像矩阵
if n <= 0
error('缩放倍数n的值应该大于0!');
end
%四舍五入计算放大后图像矩阵
[H,W,CH] = size(A);
DH = round(H * n);
DW = round(W * n);
outputimg = zeros(DH,DW,CH);
%利用双线性插值公式,从新矩阵映射回原图像
for di = 1:DH
for dj = 1:DW
ii = di / n;jj = dj / n;
i = floor(ii);j = floor(jj);
u = ii - i;v = jj - j;
i = i + 1;j = j + 1;
%边界处理
if (i < 1)
i = 1;
end
if (j < 1)
j = 1;
end
if((i + 1) > H)
i = H - 1;
end
if((j + 1) > W)
j = W -1;
end
%线性插值公式
outputimg(di,dj,:) = (1 - u) * (1 - v) * A(i,j,:) + (1 - u) * v * A(i,j + 1,:);
+ u * (1 - v) * A(i + 1,j,:) + u * v * A(i + 1,j + 1,:);
end
end
%转化成uint8才能正常显示
outputimg = uint8(outputimg);
-------------------------------------------------
对其进行调用,也可以直接使用imresize()函数(文章最后有简单介绍),处理CUFED5
---------------------------------------------------
clc;close all;clear all;
for num = 0:125
c1 = '00';
if num>=10
c1='0'
end
c2 = num2str(num);
c3 = '_0.png';
img_name = [c1,c2,c3]
if num>=100
img_name = [c2,c3]
end
A = imread(img_name);
B = my_imresize(A,0.25);
imwrite(B,['CUFED5_LR\' , img_name]);
% figure,imshow(A),title('原图');
% figure,imshow(B),title('缩小1/4后的图像');
end
----------------------------------------------
之后发现双线性插值效果并不理想
从这两张图片就可以看出差别
双线性:
双三次:
于是打算使用双三次插值。这次直接调用函数,
只改变这一行即可
B = imresize(A, 0.25, 'bicubic');
最后是imresize()函数。
matlab中imresize()函数的功能是改变图像的大小。
其用法有多种:*
1、B = imresize(A,m) 将图片A放大m倍
2、B = imresize(A,m,method) 将图片A由参数method指定的插值运算方法来改变图像的大小到m倍,
method的几种可选值:
'nearest’最近邻插值(默认)
'bilinear’双线性插值
'bicubic’双三次插值
在数值分析这个数学分支中,双三次插值(英语:Bicubic interpolation)是二维空间中最常用的插值方法。在这种方法中,函数f在点 (x,y) 的值可以通过矩形网格中最近的十六个采样点的加权平均得到。
3、B = imresize(A,[mrows ncols],method) 将图片A由参数method指定的插值运算方法,来改变图像的大小到长宽为[mrows ncols]
4、B = imresize(…,method,n)
5、B = imresize(…,method,h)
其中的h可以是任意一个FIR滤波器(h通常由函数ftrans2、fwind1、fwind2、或fsamp2等生成的二维FIR滤波器)。