透视变换(perspective transformation)

article/2025/10/3 21:26:28

透视变换(Perspective Transformation)是将图片投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。如下图所示

透视变换

透视变换的原理和公式推导见如下博客
【图像处理】透视变换 Perspective Transformation
【OpenCV】透视变换 Perspective Transformation(续)
opencv之仿射变换
图像几何变换之透视变换
图像变换——向前映射和向后映射

opencv 相关函数

Mat getPerspectiveTransform(const Point2f* src, const Point2f* dst)
// Calculate a perspective transform from four pairs of the corresponding points.
// src – Coordinates of quadrangle vertices in the source image.
// dst – Coordinates of the corresponding quadrangle vertices in the destination image.void warpPerspective(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
// Apply a perspective transform to an image.
// src – Source image.
// dst – Destination image that has the size dsize and the same type as src.
// M – 3*3 transformation matrix.
// dsize – Size of the destination image.
// flags – Combination of interpolation methods and the optional flag WARP_INVERSE_MAP that means that M is the inverse transformation (dstsrc).
// borderMode – Pixel extrapolation method. When borderMode=BORDER_TRANSPARENT, it means that the pixels in the destination image that corresponds to the “outliers” in the source image are not modified by the function.
// borderValue – Value used in case of a constant border. By default, it is 0.void perspectiveTransform(InputArray src, OutputArray dst, InputArray mtx)
Parameters:	
src – Source two-channel or three-channel floating-point array. Each element is a 2D/3D vector to be transformed.
dst – Destination array of ***the same size and type as src*** .
mtx – 3x3 or 4x4 floating-point transformation matrix.
  • c++ 代码实现

void ImageTransform::perspective_form(Mat &srcimg, Mat &dstimg, Mat &offset)
{Point2f quad_src[4];Point2f quad_dst[4];quad_src[0] = Point2f(0.0*srcimg.cols, 0.0*srcimg.rows);quad_src[1] = Point2f(srcimg.cols - 1, 0.0*srcimg.rows);quad_src[2] = Point2f(0.0*srcimg.cols, srcimg.rows - 1);quad_src[3] = Point2f(srcimg.cols - 1, srcimg.rows - 1);quad_dst[0] = Point2f(0.1*srcimg.cols, 0.1*srcimg.rows);quad_dst[1] = Point2f(srcimg.cols - 1, 0.0*srcimg.rows);quad_dst[2] = Point2f(0.0*srcimg.cols, srcimg.rows - 1);quad_dst[3] = Point2f(0.9*srcimg.cols, srcimg.rows - 1);Mat persMat = getPerspectiveTransform(quad_src, quad_dst);vector<Point2f> points, points_tran;for (int row = 0; row < srcimg.rows; row++){for (int col = 0; col < srcimg.cols; col++){points.push_back(Point2f(col, row));}}perspectiveTransform(points, points_tran, persMat);int count = 0;for (int row = 0; row < srcimg.rows; row++){uchar *pixel = srcimg.ptr<uchar>(row);float *dxy = offset.ptr<float>(row);for (int col = 0; col < srcimg.cols; col++){int x = static_cast<int>(points_tran[count].x);int y = static_cast<int>(points_tran[count].y);uchar *new_pixel = dstimg.ptr<uchar>(y);new_pixel[3 * x] = pixel[3 * col]; //最近邻插值new_pixel[3 * x + 1] = pixel[3 * col + 1];new_pixel[3 * x + 2] = pixel[3 * col + 2];dxy[2 * col] = points_tran[count].y - row;dxy[2 * col + 1] = points_tran[count].x - col;count++;}}return;}

程序运行结果


http://chatgpt.dhexx.cn/article/RaYcSvyc.shtml

相关文章

OpenCV 透视变换

OpenCV 透视变换 1. 简介2. 仿射变换2.1. 平移2.2. 旋转2.3. 放缩2.4. 错切2.5. 仿射变换 3. 透视变换 1. 简介 汽车的360度全景影像&#xff0c;从拍照视角变成鸟瞰图 这种变换常常用到透视变换 在了解透视变换前&#xff0c;需要了解一下其他的变换&#xff0c;包括 平移&am…

深入探索透视投影变换

深入探索透视投影变换 最近更新&#xff1a;2013年11月22日 -Twinsen编写 -本人水平有限&#xff0c;疏忽错误在所难免&#xff0c;还请各位数学高手、编程高手不吝赐教 -email: popyynetease.com -B站专栏&#xff1a; https://b23.tv/oWsl6PD 透视投影是3D固定流水线的重要组…

图像透视变换原理及实现

上篇博客讲解了图像的仿射变换原理及实现&#xff0c;这篇博客讲讲透视变换的原理和实现&#xff0c;透视变换也叫投影变换&#xff0c;仿射变换是透视变换的特例。主要是透视变换能保持“直线性”&#xff0c;即原图像里面的直线&#xff0c;经透视变换后仍为直线。下面给出数…

(十四)透视变换

透视变换(Perspective Transformation) 一 图像变换与平面坐标系的关系 1、旋转&#xff1a; 2、平移&#xff1a; 3、刚体变换 4、仿射变换 5、投影变换&#xff08;单应性变换&#xff09; 6 总结一下&#xff1a; 1、刚体变换&#xff1a;平移旋转&#xff0c;只改变物体…

图像畸变矫正——透视变换

图像畸变矫正——透视变换 由于相机制造精度以及组装工艺的偏差引入的畸变&#xff0c;或者由于照片拍摄时的角度、旋转、缩放等问题&#xff0c; 可能会导致原始图像的失真&#xff0c;如果要修复这些失真&#xff0c;我们可以通过透视变换&#xff0c;对图像进行畸变矫正。 …

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

导读 在上篇文章中&#xff0c;我们介绍了仿射变换&#xff0c;我们只需要通过一个两行三列的变换矩阵M就能够对图像实现平移、缩放、翻转、旋转操作。我们发现这些变换其实都属于平面变换&#xff0c;如果我们想要进行空间变换呢&#xff1f; 将上图的扑克牌单独提取出来&am…

[解疑]图像、矩阵的二维空间变换

本文经过参考多个文章整理而成&#xff0c;感谢各位博主的无私分享。 综述 图像&#xff08;2维平面&#xff09;到图像&#xff08;2维平面&#xff09;的四种变换包括&#xff1a;等距变换&#xff0c;相似变换&#xff0c;仿射变换&#xff0c;投影变换。对图像的几何变换…

数字图像处理(入门篇)十四 透视变换

目录 一 透视变换 二 实践 &#xff08;1&#xff09;代码 &#xff08;2&#xff09;结果图 一 透视变换 现实生活中的空间是三维的&#xff0c;图像中的物体存在近大远小的特征&#xff0c;这种畸变仿射变换不能矫正。因此&#xff0c;我们需要使用到三维空间的变化&…

【图像理论】透视变换

透视变换&#xff1a; 定义&#xff1a;本质是将图像投影到一个新的视平面。仿射变换可以理解为透视变换的特殊形式。利用透视中心、像点、目标点三点共线的条件&#xff0c;按透视旋转定律使承影面&#xff08;透视面&#xff09;绕迹线&#xff08;透视轴&#xff09;旋转某…

Python图像处理之透视变换

1 引言 如果你想对图像进行校准&#xff0c;那么透视变换是非常有效的变换手段。透视变换的定义为将图像投影到一个新的视平面&#xff0c;通常也被称之为投影映射。 2 公式 一般来说&#xff0c;通用的图像变换公式如下所示&#xff1a; 上述公式中&#xff0c;u,v代表原…

维特比算法 python_维特比算法理解与实现(Python)

前言 写这篇文章就是想以通俗易懂的方式解析维特比算法&#xff0c;最后给出Python代码的实现。下面的公式和原理均出自《统计学习方法》。 算法的原理 算法的原理1.PNG 算法的原理2.PNG 上面写了一大堆&#xff0c;意思就是&#xff1a;每个时刻选择出概率最大的路径&#xf…

viterbi-algorithm 维特比算法的例子解析

维特比算法的目的&#xff1a; 寻找最可能的隐藏状态序列(Finding most probable sequence of hidden states) 关于原理的讲解可以参考下面两篇文章&#xff0c;讲的比较清楚 小白给小白详解维特比算法1. 小白给小白详解维特比算法2. 本文通过分析维特比算法的例子&#xff0c…

维特比算法代码

维特比算法实现python语言版 本文主要写一个关于维特比算法的代码&#xff0c;具体理论请参考一文搞懂HMM&#xff08;隐马尔可夫模型&#xff09;&#xff1a; HMM&#xff08;隐马尔可夫模型&#xff09;是用来描述隐含未知参数的统计模型&#xff0c;举一个经典的例子&…

维特比算法学习

参考文章1&#xff1a; 简直不要太通俗易懂&#xff0c;这篇文章&#xff0c;很值得看 参考文章2&#xff1a; 解释一些概念性的问题&#xff0c;我把他的一些内容写下来 维特比(Viterbi)算法的核心是动态规划。 对于 HMM 而言&#xff0c;其中一个重要的任务就是要找出最有…

5分钟理解维特比算法

安德鲁维特比老人家发明了维特比算法&#xff0c;用非常巧妙的方法简化了隐马尔可夫第二个问题运算过程。维特比先生后来发明了CDMA技术并与人一起创办了高通公司&#xff0c;高通现在是通信巨头&#xff0c;不生产产品却每年收取大量的专利费。 下面我们用简单的例子&#xff…

Viterbi-Algorithm(维特比算法)

Viterbi-Algorithm 维特比算法是一个特殊但应用最广的动态规划算法。利用动态规划&#xff0c;可以解决任何一个图中的最短路径问题。而维特比算法是针对一个特殊的图-篱笆网了&#xff08;Lattice&#xff09;的有向图最短路径问题而提出来的。它之所以重要&#xff0c;是因为…

NLP学习笔记06-维特比算法

一序 本文属于NLP学习笔记系列。 上一篇整理了前向最大匹配算法与所有组合算法缺点&#xff08;时间复杂度太高了&#xff09;。 二 维特比算法 log(x*y*z) log(x)log(y)log(z) 概率上为了避免小数练乘出现的超范围溢出&#xff0c;改用log&#xff0c;改用-log,使得原来求概…

HMM-维特比算法

HMM-维特比算法&#xff08;viterbi&#xff09; HMM回顾隐马科夫链解法&#xff1a;维特比算法&#xff08;Viterbi&#xff09; HMM回顾 最终的公式可以解释主要分为两个部分&#xff1a; P(xi|yi)&#xff0c;发射概率&#xff0c;字面意思是从一个词性中发射/生成出某一个…

Viterbi算法(维特比算法)

维特比算法背景&#xff1a; 安德鲁维特比&#xff08;Andrew J. Viterbi&#xff09;&#xff0c;CDMA之父&#xff0c;IEEE Fellow&#xff0c;高通公司创始人之一&#xff0c;高通首席科学家。他开发了卷积码编码的最大似然算法而享誉全球。1991年香农奖&#xff08;Claude …

HMM+维特比算法

一、简介 Viterbi 算法 考虑到穷举方法的缺点&#xff0c;可以采用&#xff1a;Viterbi 算法: 动态搜索最优状态序列&#xff0c;这样每个节点保存的是到当前节点的局部最优概率&#xff1b;依据最后一个时刻中概率最高的状态&#xff0c;逆向找其路径中的上一个最大部分最优路…