一、透视变换内涵

透视变换本质:将一个图像投影到新的视平面

透视变换思路:

  1. 将二维坐标系转换为三维坐标系。

  2. 将三维坐标系投影到新的二维坐标系。

该过程属于非线性变换过程,一个菱形在经过非线性变换后得到一个四边形,但是不在平行。

透视变换又可以称为投影变换,仿射变换属于透视变换的特例。透视变换能够保持直线性,即原图中的直线,在经透视变换后仍为直线。

二、透视变换的详细原理

总体思路:

  1. 求出投影映射矩阵:根据4个基准坐标对

  2. 反求出源图像坐标:根据映射矩阵内参数,求一个二元一次方程组

透视变换矩阵变换公式为:

另外定点,即移动到的目标点为:

其中透视变换矩阵:

要移动的点,即源目标点(可以手动标记)为:

这是一个从二维空间变换到三维空间的转换,因为图像在二维平面,故除以Z,(X’;Y’;Z’)表示图像上的点:

另a33=1,展开上面的公式,可得到一个点为:

四个点,即可得到8个方程,便可求解出透视变换矩阵A。

三、Matlab代码实现

clear all;
close all;
clc;img= imread('1.jpg');
img= rgb2gray(img);
imshow(mat2gray(img));
[M N] = size(img);dot=ginput();       %取四个点,依次是左上,右上,左下,右下,这里我取的是书的四个角
w=round(sqrt((dot(1,1)-dot(2,1))^2+(dot(1,2)-dot(2,2))^2));     %从原四边形获得新矩形宽
h=round(sqrt((dot(1,1)-dot(3,1))^2+(dot(1,2)-dot(3,2))^2));     %从原四边形获得新矩形高y=[dot(1,1) dot(2,1) dot(3,1) dot(4,1)];        %四个原顶点
x=[dot(1,2) dot(2,2) dot(3,2) dot(4,2)];%这里是新的顶点,我取的矩形,也可以做成其他的形状
%大可以原图像是矩形,新图像是从dot中取得的点组成的任意四边形.:)
Y=[dot(1,1) dot(1,1) dot(1,1)+h dot(1,1)+h];
X=[dot(1,2) dot(1,2)+w dot(1,2) dot(1,2)+w];B=[X(1) Y(1) X(2) Y(2) X(3) Y(3) X(4) Y(4)]';   %变换后的四个顶点,方程右边的值
%联立解方程组,方程的系数
A=[x(1) y(1) 1 0 0 0 -X(1)*x(1) -X(1)*y(1);             0 0 0 x(1) y(1) 1 -Y(1)*x(1) -Y(1)*y(1);x(2) y(2) 1 0 0 0 -X(2)*x(2) -X(2)*y(2);0 0 0 x(2) y(2) 1 -Y(2)*x(2) -Y(2)*y(2);x(3) y(3) 1 0 0 0 -X(3)*x(3) -X(3)*y(3);0 0 0 x(3) y(3) 1 -Y(3)*x(3) -Y(3)*y(3);x(4) y(4) 1 0 0 0 -X(4)*x(4) -X(4)*y(4);0 0 0 x(4) y(4) 1 -Y(4)*x(4) -Y(4)*y(4)];fa=inv(A)*B;        %用四点求得的方程的解,也是全局变换系数
a=fa(1);b=fa(2);c=fa(3);
d=fa(4);e=fa(5);f=fa(6);
g=fa(7);h=fa(8);rot=[d e f;a b c;g h 1];        %公式中第一个数是x,Matlab第一个表示y,所以我矩阵1,2行互换了pix1=rot*[1 1 1]'/(g*1+h*1+1);  %变换后图像左上点
pix2=rot*[1 N 1]'/(g*1+h*N+1);  %变换后图像右上点
pix3=rot*[M 1 1]'/(g*M+h*1+1);  %变换后图像左下点
pix4=rot*[M N 1]'/(g*M+h*N+1);  %变换后图像右下点height=round(max([pix1(1) pix2(1) pix3(1) pix4(1)])-min([pix1(1) pix2(1) pix3(1) pix4(1)]));     %变换后图像的高度
width=round(max([pix1(2) pix2(2) pix3(2) pix4(2)])-min([pix1(2) pix2(2) pix3(2) pix4(2)]));      %变换后图像的宽度
imgn=zeros(height,width);delta_y=round(abs(min([pix1(1) pix2(1) pix3(1) pix4(1)])));            %取得y方向的负轴超出的偏移量
delta_x=round(abs(min([pix1(2) pix2(2) pix3(2) pix4(2)])));            %取得x方向的负轴超出的偏移量
inv_rot=inv(rot);for i = 1-delta_y:height-delta_y                        %从变换图像中反向寻找原图像的点,以免出现空洞,和旋转放大原理一样for j = 1-delta_x:width-delta_xpix=inv_rot*[i j 1]';       %求原图像中坐标,因为[YW XW W]=fa*[y x 1],所以这里求的是[YW XW W],W=gy+hx+1;pix=inv([g*pix(1)-1 h*pix(1);g*pix(2) h*pix(2)-1])*[-pix(1) -pix(2)]'; %相当于解[pix(1)*(gy+hx+1) pix(2)*(gy+hx+1)]=[y x],这样一个方程,求y和x,最后pix=[y x];if pix(1)>=0.5 && pix(2)>=0.5 && pix(1)<=M && pix(2)<=Nimgn(i+delta_y,j+delta_x)=img(round(pix(1)),round(pix(2)));     %最邻近插值,也可以用双线性或双立方插值end  end
end
figure;
imshow(uint8(imgn));

四、效果展示

Matlab 透视变换 原理及其代码实现相关推荐

  1. 透视变换原理实例代码详解

    导读 在上篇文章中,我们介绍了仿射变换,我们只需要通过一个两行三列的变换矩阵M就能够对图像实现平移.缩放.翻转.旋转操作.我们发现这些变换其实都属于平面变换,如果我们想要进行空间变换呢? 将上图的扑克 ...

  2. 多类线性分类器算法原理及代码实现 MATLAB

    多类线性分类器算法原理及代码实现 MATLAB 一.算法原理 下面举例说明为何蓝圈部分在case2中是确定的而在case1中不确定: 二.代码实现 1.HK函数 function [] = HK(w1 ...

  3. MATLAB BPSK通信系统调制解调仿真原理及代码(二)

    此仿真是瑞丽衰落信道与高斯信道的仿真对比,高斯信道的原理及仿真代码前文已有讲述. 高斯信道下的原理及代码请见 MATLAB BPSK通信系统调制解调仿真原理及代码(一)_惜洛-Jankin的博客-CS ...

  4. 交互式多模型 IMM的原理及代码实现(matlab)

    交互式多模型 IMM的原理及代码实现 文章目录 交互式多模型 IMM的原理及代码实现 交互式多模型简单原理 仿真图片 代码实现(matlab) 交互式多模型简单原理 交互式多模型 IMM(Intera ...

  5. 23. matlab并行计算原理以及parpool函数

     声明: 因电脑问题, 只做记录,以后尝试. 出处: Matlab并行运算 - wenyusuran的专栏 - CSDN博客 https://blog.csdn.net/wenyusuran/arti ...

  6. 自适应滤波器设计及matlab实现,自适应滤波器设计及Matlab实现附程序代码

    自适应滤波器设计及Matlab实现附程序代码 维纳自适应滤波器设计及 Matlab 实现摘 要本文从随机噪声的特性出发,分析了传统滤波和自适应滤波基本工作原理和性能,以及滤波技术的现状和发展前景.然后 ...

  7. 基于偏置比例导引的任意指定攻击角度控制导引律(matlab源代码+原理)

    ** 基于偏置比例导引的任意指定攻击角度控制导引律(matlab源代码+原理) ** 1.问题描述 以平面内攻击静止目标为例,作如下导引几何关系 M-导弹,T-目标,M的速度V恒定,R-弹目距离,q- ...

  8. 详解 OpenCV 透视变换原理 及 实例

    OpenCV提供了两种图片变换的方式:仿射变换和透视变换,两者的区别很容易区分, 前者是将矩形的图片变成平行四边形 后者是将图片变成梯形 这两种变换虽然都有各自的应用场景,但在实际的图片变换中由于透视 ...

  9. Romberg积分法MATLAB实现(附代码、实例、详解)

    第一部分:问题分析 (1)实验题目:龙贝格积分算法 具体实验要求:用matlab编写龙贝格积分的代码,要求代码实现用户输入了被积函数.积分区间.精度之后,龙贝格积分表(T-数表). (2)实验目的:让 ...

最新文章

  1. Android stadio Switch repository Android stadio切换仓库
  2. servlet的理解
  3. 10.OD-强制在OEP前加载dll
  4. 答网友提问,ABAP post调用外部接口遇到405 not allow
  5. 根据当月数据库自动生成下个月数据库--3
  6. 目标检测_目标检测: AnchorFree 时代
  7. python全栈还是大数据好_青岛PYTHON全栈应用开发班
  8. 【Java】使用springboot运行程序时出现的错误
  9. Codeforces 797B - Odd sum
  10. 作业五之系统设计时所实现的质量属性战术
  11. Android项目总结(3)-登录页图片循环过渡播放动画效果
  12. 删除python读取的txt每一行尾部的\n
  13. python表白代码简单
  14. [2014年10月5日亲测可用]迅雷极速版高速通道加速破解补丁发布
  15. css中button宽高大小不包含boder问题和文字不居中问题
  16. 正定与半正定矩阵,判别的方法不能混用,否则出错
  17. go包base64解密
  18. 青岛科技大学计算机硕士就业,2021年青岛科技大学专业排行榜,哪个专业就业比较好...
  19. linux rm 文件找回_linux rm -rf * 文件恢复记
  20. 以下11條小建議,幫助你們的異地戀一直保持活力

热门文章

  1. 天翼网关关闭 itv 网络
  2. 我的世界网易手服务器文件夹,Minecraft服务端新手搭建指南(Linux篇)
  3. 计算机组成原理复习(总结)
  4. 针对具有纯滞后环节的一阶惯性系统PID参数整定(衰减曲线法)
  5. Mysql截取字符串,格式化字符串
  6. 软件测试找了两个月都没找到工作怎么办?
  7. 即时消费、无接触配送、商品溯源......被按暂停的“零售行业“,正被疫情再次重启...
  8. 【工作小tip】项目活动签到码扫码获取不到数据的bug的解决
  9. Web Crawler与Scrap技术分析
  10. eclipse中日志无法打印到文件中的解决办法