04_MATLAB实现逆透视

代码:

clc, clear;

x1=0;

y1=50;

u1=50;

v1=25;

 

x2=0;

y2=170;

u2=50;

v2=148;

 

x3=35;

y3=50;

u3=28;

v3=48;

 

x4=35;

y4=170;

u4=28;

v4=126;

 
%u:x v:y
A=[u1,v1,1,0,0,0,-u1*x1,-v1*x1;0,0,0,u1,v1,1,-u1*y1,-v1*y1;u2,v2,1,0,0,0,-u2*x2,-v2*x2;0,0,0,u2,v2,1,-u2*y2,-v2*y2;

u3,v3,1,0,0,0,-u3*x3,-v3*x3;0,0,0,u3,v3,1,-u3*y3,-v3*y3;u4,v4,1,0,0,0,-u4*x4,-v4*x4;0,0,0,u4,v4,1,-u4*y4,-v4*y4];

B=[x1;y1;x2;y2;x3;y3;x4;y4];

M=A\B

img_origin = imread('D:\1.jpg'); %读取图像文件

%img_origin = rgb2gray(img_origin1); %将真彩色图像转换为灰度图像二维矩阵

 
img_size = size( img_origin ); % 返回矩阵的行数或列数 其中r=size(A,1)该语句返回矩阵A的行数row为垂直方向



m1=M(1); %上面程序生成的m参数

m2=M(2);

m3=M(3);

m4=M(4);

m5=M(5);

m6=M(6);

m7=M(7);

m8=M(8);

 

u=0; % 水平方向column

v=80; % 行row为垂直方向

x=(m1*u+m2*v+m3)/(m7*u+m8*v+1);% 水平方向column

y=(m4*u+m5*v+m6)/(m7*u+m8*v+1); % 行row为垂直方向

x=uint16(x);

y=uint16(y); %本段为生成新矩阵容纳校正后的图像

img_undist = zeros(x ,y ); % zeros(m,n)产生m×n的全0矩阵 所有元素初始化为0

new_size = size(img_undist); % 返回m×n全0矩阵的行数或列数

img_undist = uint8( img_undist );

for i = (img_size(1)):-1:1 % 行row为垂直方向

for j = 1:(img_size(2)) % 水平方向column

u=i; % 水平方向column

v=j; % 垂直方向

x=(m1*u+m2*v+m3)/(m7*u+m8*v+1); % 水平方向column

y=(m4*u+m5*v+m6)/(m7*u+m8*v+1);% 行row为垂直方向

x=int16(x); %物理坐标用负,现修正显示

y=int16(y);

if(y>0 &&x>0 )

img_undist(x,y)= img_origin(i,j); %对应坐标
end_y = y;
end_x = x;
end

end

end
disp(y);
disp(x);


img_undist=flipud(img_undist); %矩阵以水平轴翻转

subplot(1,2,1);imshow(img_origin);title('原图,60*160');

subplot(1,2,2);imshow(img_undist);title('校正图');	


效果图:在这里插入图片描述
尚未进行插值

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值