【问题标题】:Bilinear interpolation implementation双线性插值实现
【发布时间】:2014-11-29 18:59:45
【问题描述】:

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

    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;

当它变大时,图像中有黑色的行和列。 我该如何解决?

【问题讨论】:

    标签: matlab linear-interpolation


    【解决方案1】:

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

    什么时候在你的代码中发生什么

    x == x1 == x2?

    x 替换为x1x2 中的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 对于增加图像大小的情况始终为 0 或 1 来简化它们。
    - 我假设循环的最后一行有错字,im_zoom(i,j,:)=P; 中应该有一个大写字母 P

    【讨论】:

      猜你喜欢
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      相关资源
      最近更新 更多