为什么我的双线性插值与内置的matlab函数有很大不同?

时间:2018-11-14 14:10:48

标签: matlab image-processing bilinear-interpolation

我一直在基于Matlab中的Wiki示例进行双线性插值。我将示例跟在T后面,但是将我的函数和内置的matlab函数的输出进行比较时,结果却大相径庭,我不知道为什么或怎么发生。

使用内置的matlab函数:
Photo of a zebra on a white background.

我的功能结果如下:
The same photo above but the image is blurry.

function T = bilinear(X,h,w)
%pre-allocating the output size
T = uint8(zeros(h,w));
%padding the original image with 0 so i don't go out of bounds
X = padarray(X,[2,2],'both');
%calculating dimension ratios
hr = h/size(X,1);
wr = w/size(X,2);

for row = 3:h-3
    for col = 3:w-3
        %for calculating equivalent position on the original image
        o_row = ceil(row/hr);
        o_col = ceil(col/wr);
        %getting the intensity values from horizontal neighbors
        Q12=X(o_row+1,o_col-1);
        Q22=X(o_row+1,o_col+1);
        Q11=X(o_row-1,o_col-1);
        Q21=X(o_row-1,o_col+1);
        %calculating the relative positions to the enlarged image
        y2=round((o_row-1)*hr);
        y=round(o_row*hr);
        y1=round((o_row+1)*hr);
        x1=round((o_col-1)*wr);
        x=round(o_col*wr);
        x2=round((o_col+1)*wr);
        %interpolating on 2 first axis and the result between them
        R1=((x2-x)/(x2-x1))*Q11+((x-x1)/(x2-x1))*Q21;
        R2=((x2-x)/(x2-x1))*Q12+((x-x1)/(x2-x1))*Q22;
        P=round(((y2-y)/(y2-y1))*R1+((y-y1)/(y2-y1))*R2);
        T(row,col) = P;

        T = uint8(T);
        end    
    end
end

传递给函数的参数为​​step4 = bilinear(Igray,1668,1836); (比例因子3)。

1 个答案:

答案 0 :(得分:4)

您正在找到最接近要插值点的像素,然后找到该像素的4个相邻像素并在它们之间进行插值:

o_row = ceil(row/hr);
o_col = ceil(col/wr);
Q12=X(o_row+1,o_col-1);
Q22=X(o_row+1,o_col+1);
Q11=X(o_row-1,o_col-1);
Q21=X(o_row-1,o_col+1);

相反,找到最要插入点的4个像素:

o_row = ceil(row/hr);
o_col = ceil(col/wr);
Q12=X(o_row,o_col-1);
Q22=X(o_row,o_col);
Q11=X(o_row-1,o_col-1);
Q21=X(o_row-1,o_col);

计算距离时,需要使用相同像素的坐标。最简单的方法是将输入图像(row,col)中的输出像素((o_row,o_col))的浮点坐标与输入图像{{1}中最近的像素的位置分开}}。然后,距离就是(fo_row,fo_col)d_row = o_row - fo_row等。

这就是我编写此函数的方式:

1-d_row