0

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

    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;

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

4

1 回答 1

0

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

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

x == x1 == x2?

xx1和我们x2得到R1

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

我很惊讶你没有得到除以零的警告。避免这种情况的一种方法(不一定是最好的方法)是对R1,R2和的计算进行简单检查P

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

我没有明确地包括R1,R2P这里的计算,因为这是另一个错误出现的地方,我不想发布不正确的代码作为解决方案的一部分。修复此错误还将为当前问题提供更简洁、更优雅的解决方案。

到目前为止我注意到的其他问题是:
- 你试图保持x1y1不为零似乎有点不对劲。您需要考虑在值范围的极端情况下您期望的行为(例如,一行的前四个和最后四个像素)。
- 你不应该使用iandj作为循环变量,因为 Matlab 已经将它们定义为虚数单位。
- 您计算插值像素颜色的权重不正确。想想如果像素更靠近左边而不是右边,左边的颜色应该有多大的贡献。
- 一旦你的重量计算是正确的,它们可以通过注意x2 - x1在增加图像大小的情况下总是为零或一来简化。
- 我假设循环的最后一行有错字,应该有一个大写P字母im_zoom(i,j,:)=P;

于 2014-10-06T18:57:11.577 回答