【图像处理】双三次插值(Bicubic interpolation)原理及matlab简易版代码

时间:2024-04-12 09:30:01

先简单写下。

双线性插值:缩放后图像矩阵(简称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),我暂时没查到有根据的正确的划分,如果哪位大神知道请告诉我下谢谢~

本篇文章内的公式和代码均以下图划分为主。 

【图像处理】双三次插值(Bicubic interpolation)原理及matlab简易版代码

 

双三次插值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