双线性插值实现

问题描述:

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

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; 

当成为放大,有图像中的黑色行列数。 我怎么解决它?

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

在你的代码时会发生什么

X == == X1 X2?

代入R1xx1x2我们得到

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 in im_zoom(i,j,:)=P;