Matlab 透视变换 原理及其代码实现
一、透视变换内涵
透视变换本质:将一个图像投影到新的视平面
透视变换思路:
将二维坐标系转换为三维坐标系。
将三维坐标系投影到新的二维坐标系。
该过程属于非线性变换过程,一个菱形在经过非线性变换后得到一个四边形,但是不在平行。
透视变换又可以称为投影变换,仿射变换属于透视变换的特例。透视变换能够保持直线性,即原图中的直线,在经透视变换后仍为直线。
二、透视变换的详细原理
总体思路:
求出投影映射矩阵:根据4个基准坐标对
反求出源图像坐标:根据映射矩阵内参数,求一个二元一次方程组
透视变换矩阵变换公式为:
另外定点,即移动到的目标点为:
其中透视变换矩阵:
要移动的点,即源目标点(可以手动标记)为:
这是一个从二维空间变换到三维空间的转换,因为图像在二维平面,故除以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 透视变换 原理及其代码实现相关推荐
- 透视变换原理实例代码详解
导读 在上篇文章中,我们介绍了仿射变换,我们只需要通过一个两行三列的变换矩阵M就能够对图像实现平移.缩放.翻转.旋转操作.我们发现这些变换其实都属于平面变换,如果我们想要进行空间变换呢? 将上图的扑克 ...
- 多类线性分类器算法原理及代码实现 MATLAB
多类线性分类器算法原理及代码实现 MATLAB 一.算法原理 下面举例说明为何蓝圈部分在case2中是确定的而在case1中不确定: 二.代码实现 1.HK函数 function [] = HK(w1 ...
- MATLAB BPSK通信系统调制解调仿真原理及代码(二)
此仿真是瑞丽衰落信道与高斯信道的仿真对比,高斯信道的原理及仿真代码前文已有讲述. 高斯信道下的原理及代码请见 MATLAB BPSK通信系统调制解调仿真原理及代码(一)_惜洛-Jankin的博客-CS ...
- 交互式多模型 IMM的原理及代码实现(matlab)
交互式多模型 IMM的原理及代码实现 文章目录 交互式多模型 IMM的原理及代码实现 交互式多模型简单原理 仿真图片 代码实现(matlab) 交互式多模型简单原理 交互式多模型 IMM(Intera ...
- 23. matlab并行计算原理以及parpool函数
声明: 因电脑问题, 只做记录,以后尝试. 出处: Matlab并行运算 - wenyusuran的专栏 - CSDN博客 https://blog.csdn.net/wenyusuran/arti ...
- 自适应滤波器设计及matlab实现,自适应滤波器设计及Matlab实现附程序代码
自适应滤波器设计及Matlab实现附程序代码 维纳自适应滤波器设计及 Matlab 实现摘 要本文从随机噪声的特性出发,分析了传统滤波和自适应滤波基本工作原理和性能,以及滤波技术的现状和发展前景.然后 ...
- 基于偏置比例导引的任意指定攻击角度控制导引律(matlab源代码+原理)
** 基于偏置比例导引的任意指定攻击角度控制导引律(matlab源代码+原理) ** 1.问题描述 以平面内攻击静止目标为例,作如下导引几何关系 M-导弹,T-目标,M的速度V恒定,R-弹目距离,q- ...
- 详解 OpenCV 透视变换原理 及 实例
OpenCV提供了两种图片变换的方式:仿射变换和透视变换,两者的区别很容易区分, 前者是将矩形的图片变成平行四边形 后者是将图片变成梯形 这两种变换虽然都有各自的应用场景,但在实际的图片变换中由于透视 ...
- Romberg积分法MATLAB实现(附代码、实例、详解)
第一部分:问题分析 (1)实验题目:龙贝格积分算法 具体实验要求:用matlab编写龙贝格积分的代码,要求代码实现用户输入了被积函数.积分区间.精度之后,龙贝格积分表(T-数表). (2)实验目的:让 ...
最新文章
- Android stadio Switch repository Android stadio切换仓库
- servlet的理解
- 10.OD-强制在OEP前加载dll
- 答网友提问,ABAP post调用外部接口遇到405 not allow
- 根据当月数据库自动生成下个月数据库--3
- 目标检测_目标检测: AnchorFree 时代
- python全栈还是大数据好_青岛PYTHON全栈应用开发班
- 【Java】使用springboot运行程序时出现的错误
- Codeforces 797B - Odd sum
- 作业五之系统设计时所实现的质量属性战术
- Android项目总结(3)-登录页图片循环过渡播放动画效果
- 删除python读取的txt每一行尾部的\n
- python表白代码简单
- [2014年10月5日亲测可用]迅雷极速版高速通道加速破解补丁发布
- css中button宽高大小不包含boder问题和文字不居中问题
- 正定与半正定矩阵,判别的方法不能混用,否则出错
- go包base64解密
- 青岛科技大学计算机硕士就业,2021年青岛科技大学专业排行榜,哪个专业就业比较好...
- linux rm 文件找回_linux rm -rf * 文件恢复记
- 以下11條小建議,幫助你們的異地戀一直保持活力
热门文章
- 天翼网关关闭 itv 网络
- 我的世界网易手服务器文件夹,Minecraft服务端新手搭建指南(Linux篇)
- 计算机组成原理复习(总结)
- 针对具有纯滞后环节的一阶惯性系统PID参数整定(衰减曲线法)
- Mysql截取字符串,格式化字符串
- 软件测试找了两个月都没找到工作怎么办?
- 即时消费、无接触配送、商品溯源......被按暂停的“零售行业“,正被疫情再次重启...
- 【工作小tip】项目活动签到码扫码获取不到数据的bug的解决
- Web Crawler与Scrap技术分析
- eclipse中日志无法打印到文件中的解决办法