我正在尝试实现双线性插值函数,但由于某种原因它不起作用。 这是我的功能:
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;
当它变大时,图像中有黑色的行和列。 我怎么能解决它?
答案 0 :(得分:0)
请注意,您的代码中存在多个错误,包括逻辑和对算法的理解以及至少一个错字,但我将限制自己解决图像中黑线的直接问题。
时代码中会发生什么
x == x1 == x2?
将x
替换为x1
和我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
,R2
和P
的计算,因为这会出现另一个错误,我不想将错误的代码发布为解决方案的一部分。修复此错误还可以为当前问题提供更清晰,更优雅的解决方案。
到目前为止我注意到的其他问题是:
- 您试图让x1
和y1
保持为零似乎有点过时了。您需要考虑您在极值范围内所期望的行为(例如,行的前四个和后四个像素)。
- 您不应该使用i
和j
作为循环变量,因为Matlab已将这些定义为虚构单位。
- 用于计算插值像素颜色的权重不正确。想想如果像素靠近左边而不是右边,左边的颜色应该有多大的贡献
- 一旦您的体重计算正确,可以通过注意x2 - x1
始终为零或一个增加图像尺寸的情况来简化它们。
- 我假设循环的最后一行有拼写错误,P
im_zoom(i,j,:)=P;