先简单写下。
双线性插值:缩放后图像矩阵(简称TI)像素坐标映射到原图像矩阵(简称OI)中得坐标点P(x,y),P点临近四个坐标点像素值的线性加权求和即P点像素值。
“双”指的图像为二维矩阵,则在x方向和y方向都线性加权求和,顺序无所谓。
双三次插值:
以下为双三次插值的公式,其中s(x)为插值核。f(M)为对应缩放后矩阵坐标点的像素值。
关于s(x)公式我有疑问,有的博客上将x分为(|x|<=1,1<|x|<2,others),有的分为(|x|<1,1<=|x|<2,others),我暂时没查到有根据的正确的划分,如果哪位大神知道请告诉我下谢谢~
本篇文章内的公式和代码均以下图划分为主。
双三次插值matlab简易版代码
以下代码非常简洁,仅仅是将公式编码完成了最基本的计算,给大家做个参考,最终运行时间为23.200182 秒,可长了...
(话说matlab自带的imresize方法进行双三次插值运行0.851554 秒 = =)
% Author: Dabao
% Time: 2019.03.28 16:01
tic; % calculate running time
% read original image I
I = imread('/Users/apple/Downloads/IMG_3331.JPG');
I = double(I);
[oh,ow,od] = size(I);
zmf = 2; %缩放因子
% initial target image TI
th = round(oh*zmf);
tw = round(ow*zmf);
TI = zeros(th,tw,od); %预分配内存提高计算速度
% add original image with 2 rows and 2 cols
% expand the border to prevent calculation overflow
a = I(1,:,:); b = I(oh,:,:);
temp_I = [a;a;I;b;b];
c = temp_I(:,1,:); d = temp_I(:,ow,:);
FI = [c,c,temp_I,d,d];
% fill target image with new pixels
for w = 1:tw
j = floor(w/zmf)+2; v = rem(w,zmf)/zmf;
for h = 1:th
i = floor(h/zmf)+2; u = rem(h,zmf)/zmf;
A = [s(u+1),s(u),s(u-1),s(u-2)];
C = [s(v+1);s(v);s(v-1);s(v-2)];
for d = 1:od % image's 3 channels
B = FI(i-1:i+2,j-1:j+2,d);
TI(h,w,d) = A*B*C;
end
end
end
figure;
imshow(uint8(TI));
toc;
% 插值核函数
function w = s(wx)
wx = abs(wx);
if wx<1
w = 1 - 2*wx^2 + wx^3;
elseif wx>=1 && wx<2
w = 4 - 8*wx + 5*wx^2 - wx^3;
else
w = 0;
end
|
请发表评论