z变换判断稳定性和因果性_图像处理的仿射变换与透视变换

aee99074cf4c590f8a37ddefa6e970e8.png

原文首发于微信公众号:【3D视觉工坊】。

引言

这一周主要在研究图像的放射变换与透视变换,目前出现的主要问题是需要正确识别如下图中的编码标志点圆心。
1.当倾斜角较小时:

4730cf5cb7908e38df7886b50d37d7b9.png

倾斜角较小

2.倾斜角较大时:

7378d19cacd8d276ad2ba830088b1486.png

倾斜角较大

由上面两幅图可以看出,当倾斜角较大时,中间的圆斑将变为椭圆,四周的圆环带之间的面积比关系也将出现变化,影响识别算法的正确判断。
那么如何将倾斜角如此大的编码标志点进行校正呢?这便是本篇文章需要解决的问题。

一 仿射变换与透视变换

其实一直有点没太理解「放射」俩字是啥意思,但是大家都这么叫,其实仿射变换和透视变换更直观的叫法可以叫做「平面变换」和「空间变换」或者「二维坐标变换」和「三维坐标变换」。如果这么命名的话,其实很显然,这俩是一回事,只不过一个是二维坐标(x,y),一个是三维坐标(x,y,z)。也就是:
仿射变换:

f6d6e38ffb12488b1d497f862fbfc4df.png
1.1

46d988dad3472cb119247ecf10e8cee4.png

7b7ddd123c63632a51c889b519b22d9d.png
1.2

透视变换:

daf597f378c8d9b92055479149795281.png
1.3

fb0179413092d7db5e2745f297e7972e.png

b8a30060aca5a94c461f9c398c0f2ada.png

c3a5b7727e9569af3fd6ddad77443dfc.png
1.4

32dbe51d8e49313f2404e0079e1cebad.png
1.5

274365f3d9d86c664aa4f5cb4dd84a62.png
1.6

从另一个角度也能说明三维变换和二维变换的意思,仿射变换的方程组有6个未知数,所以要求解就需要找到3组映射点,三个点刚好确定一个平面。透视变换的方程组有8个未知数,所以要求解就需要找到4组映射点,四个点就刚好确定了一个三维空间。
仿射变换和透视变换的数学原理也不需要深究,其计算方法为坐标向量和变换矩阵的乘积,换言之就是矩阵运算。在应用层面,放射变换是图像基于3个固定顶点的变换,如图1.1:所示:

5a8bf742babe7791d67e19c2e69b38dc.png
图1.1 基于三个点的仿射变换

图中红点即为固定顶点,在变换先后固定顶点的像素值不变,图像整体则根据变换规则进行变换同理,透视变换是图像基于4个固定顶点的变换,如图1.2所示:

3f9b2066ebcc17f5bfb73be1061363e0.png
图1.2 基于四个点的透视变换

在OpenCV中,放射变换和透视变换均有封装好的函数,分别为:

void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())

void warpPerspective(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())

两种变换函数形式完全相同,因此以仿射变换为例:

void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
参数InputArray src:输入变换前的图像;
参数OutputArray dst:输出变换后图像,需要初始化一个空矩阵用来保存结果,不用设定矩阵尺寸;
参数Size dsize:设置输出图像大小;
参数int flags=INTER_LINEAR:设置插值方式,默认方式为线性插值;
后两个参数不常用,在此不赘述。

关于生成变换矩阵InputArray M的函数getAffineTransform():

Mat getAffineTransform(const Point2f* src, const Point2f* dst)
参数const Point2f* src:原图的三个固定顶点
参数const Point2f* dst:目标图像的三个固定顶点
返回值:Mat型变换矩阵,可直接用于warpAffine()函数
注意,顶点数组长度超过3个,则会自动以前3个为变换顶点;数组可用Point2f[]或Point2f*表示

示例代码如下:

//读取原图Mat I = imread("..//img.jpg");//设置空矩阵用于保存目标图像Mat dst;//设置原图变换顶点Point2f AffinePoints0[3] = { Point2f(100, 50), Point2f(100, 390), Point2f(600, 50) };//设置目标图像变换顶点Point2f AffinePoints1[3] = { Point2f(200, 100), Point2f(200, 330), Point2f(500, 50) };//计算变换矩阵Mat Trans = getAffineTransform(AffinePoints0, AffinePoints1);//矩阵仿射变换warpAffine(I, dst, Trans, Size(I.cols, I.rows));//分别显示变换先后图像进行对比imshow("src", I);imshow("dst", dst);waitKey();

同理,透视变换与仿射变换函数类似:

void warpPerspective(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())

生成变换矩阵函数为:

Mat getPerspectiveTransform(const Point2f* src, const Point2f* dst)

注意透视变换顶点为4个。

两种变换完整代码及结果比较:

#include <iostream>
#include <opencv.hpp>
using namespace std;
using namespace cv;Mat AffineTrans(Mat src, Point2f* scrPoints, Point2f* dstPoints)
{Mat dst;Mat Trans = getAffineTransform(scrPoints, dstPoints);warpAffine(src, dst, Trans, Size(src.cols, src.rows), CV_INTER_CUBIC);return dst;
}Mat PerspectiveTrans(Mat src, Point2f* scrPoints, Point2f* dstPoints)
{Mat dst;Mat Trans = getPerspectiveTransform(scrPoints, dstPoints);warpPerspective(src, dst, Trans, Size(src.cols, src.rows), CV_INTER_CUBIC);return dst;
}void main()
{Mat I = imread("..//img.jpg");  //700*438Point2f AffinePoints0[4] = { Point2f(100, 50), Point2f(100, 390), Point2f(600, 50), Point2f(600, 390) };Point2f AffinePoints1[4] = { Point2f(200, 100), Point2f(200, 330), Point2f(500, 50), Point2f(600, 390) };Mat dst_affine = AffineTrans(I, AffinePoints0, AffinePoints1);Mat dst_perspective = PerspectiveTrans(I, AffinePoints0, AffinePoints1);for (int i = 0; i < 4; i++){circle(I, AffinePoints0[i], 2, Scalar(0, 0, 255), 2);circle(dst_affine, AffinePoints1[i], 2, Scalar(0, 0, 255), 2);circle(dst_perspective, AffinePoints1[i], 2, Scalar(0, 0, 255), 2);}imshow("origin", I);imshow("affine", dst_affine);imshow("perspective", dst_perspective);waitKey();
}

30fa47f65dc6f3b900075bf7b5c7a26f.png
1.3 程序运行结果

可以看出,仿射变换以3个点为基准点,即使数组长度为4也仅取前3个点作为基准点;透视变换以4个点为基准点,两种变换结果不相同。应根据实际情况判断使用哪种变换方式更佳。

二 编码标志点透视变换矫正

回到引言部分的问题,对于编码标志点中,我们可以以中心椭圆与坐标轴的四个交点为检测点,以椭圆的长轴为半径绘制一个理想圆,理想圆与坐标轴的交点为目标点。运用上面介绍的透视变换知识,便可以很容易的解决问题,如图2.1所示。

03413d60db8c9df8819bbf35f76c2630.png
图2.1 透视变换

三 跋

文章的最后,单纯地需要感谢一下高静小朋友提供的测试样图,才得以文章正式成文。

文章始发于我的个人公众号:3D视觉工坊。

知识星球:「3D视觉工坊」。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云ACM:云原生配置管理利器,让云上的Spring Cloud应用配置管理舞动起来

在传统架构中&#xff0c;如果配置信息有变更&#xff0c;通常是登陆服务器手动修改配置来使配置生效。在微服务架构中&#xff0c;应用数和节点数由于微服务化数量激增&#xff0c;导致发布次数增加&#xff0c;配置变更难度加大&#xff0c;通常是将应用配置抽象出来放置在外…

技术和商业的碰撞,谈阿里云与天猫双11这十年

2009年&#xff0c;发生了两件看似不起眼的事。 初春刚过&#xff0c;阿里云在北京一栋没有暖气的写字楼写下了飞天第一行代码。 同年11月11日&#xff0c;淘宝商城启动了一个叫做双11的促销活动。 谁也没想到&#xff0c;多年以后他们会是现在这模样。 前传 2007年淘宝的…

windows环境 wildfly-10.1.0.Final 安装、配置、部署

文章目录一、下载、解压、配置1. 下载Wildfly2. 解压&#xff0c;成功得到文件夹。3. 配置环境变量4. 添加管控台用户5. 启动并登录管控台测试6. 管控台页面简介7. 修改默认端口由于Wildfly是依赖与Java的Jdk的&#xff0c;所以在这之前要先安装JDK。一、下载、解压、配置 1. …

揭秘 | 双11逆天记录背后的数据库技术革新

每一个数字背后 都需要强大的技术支撑 Higher, Faster, Smarter 是我们不变的追求 技术无边界 创新无止境 ▽ 关于数据库的双11 也许你还想知道 ▽ 2135亿&#xff01;2018 双11阿里数据库技术战报“双11”十年记 阿里数据库演绎变迁三部曲 原文链接 本文为云栖社区原创内容…

重磅!腾讯助推十亿级节点图计算进入分钟级时代;沈向洋离开微软;阿里:拥有超6000项已授权专利,涉及云、AI等领域……...

戳蓝字“CSDN云计算”关注我们哦&#xff01; 嗨&#xff0c;大家好&#xff0c;重磅君带来的【云重磅】特别栏目&#xff0c;如期而至&#xff0c;每周五第一时间为大家带来重磅新闻。把握技术风向标&#xff0c;了解行业应用与实践&#xff0c;就交给我重磅君吧&#xff01;重…

2135亿背后的双11项目协作怎么玩?

2018天猫双11已经收官&#xff0c;2135亿元的成交额再度刷新纪录&#xff0c;这是一场阿里巴巴经济体的深度协作。 在这个大协作项目中&#xff0c;项目协作难题难以想象&#xff1a;如何保证众多部门、百个核心产品、千个垂直项目、几千人的的高效协作&#xff1f;如何在双11…

下一代大数据处理引擎,阿里云实时计算独享模式重磅发布

11月14日&#xff0c;阿里云重磅发布了实时计算独享模式&#xff0c;即用户独享一部分物理资源&#xff0c;这部分资源在网络/磁盘/CPU/内存等资源上跟其他用户完全独立&#xff0c;是实时计算在原有共享模式基础上的重大升级。 独享模式优点更加突出 1、UDX开放&#xff1a;实…

刷爆了!李彦宏:这类程序员我给100万!你怎么看?

从2017年开始&#xff0c;人工智能便波澜不断&#xff0c;无论是从BAT高调布局AI&#xff0c;还是从年薪50万招聘AI应届生&#xff0c;炽手可热形容AI工程师一点都不过分。百度推出“少帅计划”,针对30岁以下的深度学习科学家&#xff0c;开出100万以上年薪&#xff01;阿里巴巴…

Element-UI中Cascader 级联选择器使用

Element-UI的级联组件官方文档 <el-cascaderv-model"value":options"options":props"{ expandTrigger: hover }"change"handleChange"></el-cascader>说明&#xff1a; options:绑定数据源 props:数据配置项 v-model“val…

DRDS SQL 审计与分析——全面洞察 SQL 之利器

背景 数据库存储着系统的核心数据&#xff0c;其安全方面的问题在传统环境中已经成为泄漏和被篡改的重要根源。而在云端&#xff0c;数据库所面临的威胁被进一步的放大。因此&#xff0c;对云数据库的操作行为尤其是全量 SQL 执行记录的审计日志&#xff0c;就显得尤为重要&am…

机器学习:从入门到晋级

目前&#xff0c;人工智能&#xff08;AI&#xff09;非常热门&#xff0c;许多人都想一窥究竟。如果你对人工智能有所了解&#xff0c;但对机器学习&#xff08;Machine Learning&#xff09;的理解有很多的困惑&#xff0c;那么看完本文后你将会对此有进一步深入理解。在这里…

漫画 | 面试的我 VS 真实的我

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者&#xff5c;纯洁的微笑、孤独烟责编&#xff5c;阿秃“面试造火箭&#xff0c;入职拧螺丝&#xff01;”已经是各大互联网公司招聘的常态&#xff0c;为了应对如今越演越烈的面试形势&#xff0c;程序员一个个都变成了表演大师…

Visual Studio Code Vue代码片段 总览

文章目录一、模板篇1. 初始化.vue 文件模板2. template 作用域插槽模板二、响应提示篇1. error 响应 &#xff01;200提示2. success 响应 200提示三、axios请求篇1. axios get 请求2. axios post 请求3. axios put 请求4. axios delete请求四、事件篇…

一个案例彻底弄懂如何正确使用 mysql inndb 联合索引

有一个业务是查询最新审核的5条数据 SELECT id, title FROM th_content WHERE audit_time < 1541984478AND status ONLINE ORDER BY audit_time DESC, id DESC LIMIT 5; 查看当时的监控情况 cpu 使用率是超过了100%&#xff0c;show processlist看到很多类似的查询都是处…

为你的AliOS Things应用增加自定义cli命令

在日常嵌入式开发中&#xff0c;我们经常会用串口命令来使设备进入某种特定的状态&#xff0c;或执行某个特定的操作。如系统自检&#xff0c;模拟运行&#xff0c;或者进入手动模式进行设备点动。linux下有强大的shell工具&#xff0c;可以让用户和片上系统进行交互&#xff0…

4________请拖拽到此区域5________请拖拽到此区域_5分钟学会:蒙版与通道(剪贴蒙版)...

剪贴蒙版可以用一个图层中包含像素的区域来限制它上层图像的显示范围。它的最大优点是可以通过一个图层来控制多个图层的可见内容&#xff0c;而图层蒙版和矢量蒙版都只能控制一个图层。1、实例&#xff1a;创建剪贴蒙版颜回&#xff1a;5分钟学会&#xff1a;蒙版与通道 实例&…

一场高质量的技术盛会怎样炼成?「2019中国大数据技术大会」即将来临,邀您共赴!...

2019年12月&#xff0c;一场轰动国内产业界、学术界、科研界及投资领域的顶级科技盛会即将拉开帷幕&#xff0c;它涵盖大数据、人工智能、云计算、AIoT、金融科技、智能制造等十几个前沿领域的热门话题。在过去十二年里&#xff0c;这场盛会从最初仅 60 余人参加的技术沙龙到如…

在Developerkit开发板上运行blink例程

本文将介绍怎么样在VScode环境下&#xff0c;将AliOS Tings提供的blink例程在Developerkit开发板上运行起来。 DeveloperKit开发板 在例程中分别用到两个led和一个按钮&#xff0c;上图中用红色的框标识出来。例程正确运行后&#xff0c;会有一个LED按1s的周期闪烁&#xff0c…

阿里下一代云分析型数据库AnalyticDB入选Forrester云化数仓象限

前言 近期, 全球权威IT咨询机构Forrester发布"The Forrester Wave: CloudData Warehouse Q4 2018"研究报告&#xff0c;阿里巴巴分析型数据库(AnalyticDB)成功入选。 AnalyticDB作为阿里巴巴自主研发的PB级实时云数据仓库&#xff0c;全面兼容MySQL协议以及SQL:200…

俄罗斯互联网的BAT

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者&#xff5c;挖数责编&#xff5c;阿秃1961年&#xff0c;尤里米尔纳 出生在莫斯科一个犹太人家庭&#xff0c;他的父亲是一名经济学家&#xff0c;母亲是一名医生&#xff0c;他儿时的梦想是成为科学家。高中毕业后&#xff0c…