双线性插值实现
问题描述:
我试图实现双线性插值函数,但由于某种原因它不起作用。 这是我的函数:双线性插值实现
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?
代入R1
x
为x1
和x2
我们得到
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
,R2
和P
这里的计算因为这里有其他的错误,我不想发布不正确的代码作为解决方案的一部分。解决这个错误还可以为当前的问题提供更清晰,更优雅的解决方案。
其他问题是:
- 你试图保持x1
和y1
从为零似乎有点过。您需要考虑您在极限值范围内(例如,一行的前四个像素和最后四个像素)期望的行为。
- 您不应该使用i
和j
作为循环变量,因为Matlab已经将它们定义为虚数单位。
- 计算插值像素颜色的权重不正确。想象一下,如果像素靠近左侧而不是右侧,则左侧颜色应该具有多大的贡献。
- 一旦您的体重计算正确,可以通过注意x2 - x1
对于增加图像尺寸的情况总是为零或一。
- 我假设循环的最后一行有一个错字,应该有一个大写字母P
in im_zoom(i,j,:)=P;