Matlab实现双线性内插(畸变点处理)
%计算畸变点和地面点之前的系数ai,bi(线性关系)
%双线性内插计算灰度值
clc;clear;
x=input('输入全部地面点x坐标:','s');
x=str2num(x); %将输入的字符串转换成数字型
y=input('输入全部地面点y坐标:','s');
y=str2num(y);
B=zeros(length(x),3);
for i=1:length(x)
B(i,1:3)=[1,x(i),y(i)]; %计算Bx-l=0中的系数矩阵B
end
xx=input('输入全部畸变点x"坐标:','s');
xx=str2num(xx);
yy=input('输入全部畸变点y"坐标:','s');
yy=str2num(yy);
L1=xx';
L2=yy';
delta_x=(inv(B'*B))*B'*L1; %计算Bx-l=0中的x
delta_y=(inv(B'*B))*B'*L2;
fprintf('a0=%f a1=%f a2=%f\n',delta_x)
fprintf('a0=%f a1=%f a2=%f\n',delta_x)
a=delta_x; %a,b即为改正系数
b=delta_y;
number=input('输入待求点个数:');
x1_1=zeros(number,1);
y1_1=zeros(number,1);
x1=zeros(number,2);
for j=1:number
x1(j,1:2)=str2num(input('输入待求地面点(x,y)坐标:','s'));
x1_1(j)=a(1)+a(2)*x1(j,1)+a(3)*x1(j,2); %计算畸变点坐标
y1_1(j)=b(1)+b(2)*x1(j,1)+b(3)*x1(j,2);
end
disp('畸变点坐标(第一列x,第二列y)')
disp([x1_1,y1_1])
gray=input('输入灰度值(从左下角开始,按照顺时针输入):','s');
gray=str2num(gray);
for n=1:length(x1_1) %根据双线性内插计算灰度值
format long
u(n)=(x1_1(n)-min(xx))/(max(xx)-min(xx));
v(n)=(y1_1(n)-min(yy))/(max(yy)-min(yy));
f(n)=(1-u(n))*(1-v(n))*gray(1)+(1-u(n))*v(n)*gray(2)+u(n)*v(n)*gray(3)+u(n)*(1-v(n))*gray(4);
end
disp('按输入坐标点顺序输出')
fprintf('%f\n ',f);
disp('最终求得灰度值(按输入坐标点顺序输出)')
fprintf('%f\n ',round(f));
小白练手,敬请斧正。