双线性插值实现

时间:2014-10-05 07:36:03

标签: matlab linear-interpolation

我正在尝试实现双线性插值函数,但由于某种原因它不起作用。 这是我的功能:

    function [g] = imgscale(data)

    a = data;
    [row col d] = size(a);  %3 dimentional array
    zoom=3;                 %zooming factor
    zr=zoom*row;
    zc=zoom*col;

    for i=1:zr

        x=i/zoom;

        x1=floor(x);
        x2=ceil(x);
        if x1==0
            x1=1;
        end

        for j=1:zc

            y=j/zoom;

            y1=floor(y);
            y2=ceil(y);
            if y1==0
                y1=1;
            end

            BL=a(x1,y1,:);
            TL=a(x1,y2,:);
            BR=a(x2,y1,:);
            TR=a(x2,y2,:);           

            R1=((x2-x)/(x2-x1))*BR+((x-x1)/(x2-x1))*BL;
            R2=((x2-x)/(x2-x1))*TR+((x-x1)/(x2-x1))*TL;
            P=((y2-y)/(y2-y1))*R1+((y-y1)/(y2-y1))*R2;
            im_zoom(i,j,:)=p;

        end
    end
g = im_zoom;

当它变大时,图像中有黑色的行和列。 我怎么能解决它?

1 个答案:

答案 0 :(得分:0)

请注意,您的代码中存在多个错误,包括逻辑和对算法的理解以及至少一个错字,但我将限制自己解决图像中黑线的直接问题。

时代码中会发生什么
  

x == x1 == x2?

x替换为x1和我x2中的R1

R1=((x-x)/(x-x))*BR+((x-x)/(x-x))*BL;
or
R1=(0/0)*BR+(0/0)*BL

我很惊讶你没有被零警告分开。避免这种情况的一种方法(不一定是最好的方法)是对R1R2P的计算进行简单的检查:

if x == x1 % this implies x == x2 as well
    R1=BR; % same as R1=BL
    R2=TR; % same as R1=TL
else
    % normal calculations for R1 & R2
end
if y == y1
    P=R1;
else
    % normal calculation for P
end

我没有在此处明确包含R1R2P的计算,因为这会出现另一个错误,我不想将错误的代码发布为解决方案的一部分。修复此错误还可以为当前问题提供更清晰,更优雅的解决方案。

到目前为止我注意到的其他问题是:
  - 您试图让x1y1保持为零似乎有点过时了。您需要考虑您在极值范围内所期望的行为(例如,行的前四个和后四个像素)。
  - 您不应该使用ij作为循环变量,因为Matlab已将这些定义为虚构单位。
  - 用于计算插值像素颜色的权重不正确。想想如果像素靠近左边而不是右边,左边的颜色应该有多大的贡献   - 一旦您的体重计算正确,可以通过注意x2 - x1始终为零或一个增加图像尺寸的情况来简化它们。
  - 我假设循环的最后一行有拼写错误,P

中应该有一个大写im_zoom(i,j,:)=P;