- 不均匀映射
对图像的几何操作,包括均匀和不均匀的调整大小(后者称为扭曲)。可以拉伸、收缩、扭曲或旋转图像的功能叫做几何变换。对于平面区域,有两种几何变换:使用23矩阵的变换,称为仿射变换;而基于33矩阵进行变换,称为透视变换或者同形。
仿射变换可以如下显示:平面中的任何平行四边形ABCD可以通过一些仿射变换映射到任何其他平行四边形。如果这些平行四边形的面积不是零,隐含的仿射变换就由两个平行四边形的三个顶点唯一确定。
仿射变换可以将矩形变换为平行四边形,它们可以挤压形状,但必须保持两边平行,可以旋转或者缩放它们。
透视变换可以将矩形变换转为任意四边形(包括梯形等不规则四边形)。 - 仿射变换
仿射变换有两种情况。在第一种情况下,我们有一个想要转化的图像(或者感兴趣区域);在第二种情况下,我们有一系列的点,想要计算转换的结果。这两种情况。虽然在概念上非常相似,但是在执行方面有很大差异。 - 密集仿射变换函数cv::warpAffine()
在第一种表示下,明显输入输出格式都是图像,隐含的要求是假设映射中像素是基础图像的一种密集表示,这意味着图像扭曲必须处理内插,使得图像平滑而自然。
void cv::warpAffine(
cv::InputArray src,
cv::OutputArray dst,
cv::InputArray M,
cv::size dsize,
int flags = cv::INTER_LINEAR,
int borderMode=cv::BORDER_CONSTANT,
const cv::scalar&borderValue=cv::scalar())
输入M时我们前面介绍的量化所需变换的2*3矩阵。一般来说,该方程右边所示的位置可能不是整数像素。这种情况下,需要使用插值来找到dst(x,y)合适的值。flags,选择插值的方法,附加参数cv::WARO_INVERSE_MAP,可以使用通常的布尔OR,允许从dst到src而不是src到dst的反向变换。
- 计算仿射映射矩阵的cv::getAffineTransform()
cv::Mat cv::getAffineTransform(
const cv::Point2f* src,
const cv::Point2f* dst)
上述为你已经有两个图像的时候。这里src dst是包含三个二维(x,y)点的数组。返回值是从这些点计算的仿射变换的数组。一旦这三个独立的角被映射,所有其他点的映射可以完全确定。
cv::transform()用于稀疏仿射变换
我们已经解释cv::warpAffine()是处理密集映射的正确方法,对于稀疏映射,最好使用cv::transform()
void cv::transform(
cv::InputArray src,
cv::OutputArray dst,
cv::InputArray mtx)
通常,src是具有DS通道的N1数组,其中N是要变换的点数,DS是这些源点的维数。输出数组dst将具有相同的大小,但可能具有不同数量的通道Dd。变换矩阵mtx是DSDd,然后将其应用于src的每个元素,之后将结果放入dst。
cv::invertAffineTransform()用于逆仿射变换
给定表示2*3矩阵的仿射变换,通常希望能够计算逆变换,它可以用于将所有转换点放回他们原来得位置。
void cv::invertAffineTransform(
cv::InputArray M,
cv::OutputArray iM)
这个函数需要一个23的数组M,并返回另外一个23的数组M的逆iM。
本文介绍了OpenCV中的图像几何变换,包括仿射变换和透视变换。仿射变换能保持平行性,可用于拉伸、旋转和缩放图像,而透视变换则允许将矩形转换为任意四边形。在OpenCV中,使用cv::warpAffine()进行密集仿射变换,cv::getAffineTransform()计算变换矩阵,cv::transform()处理稀疏变换,以及cv::invertAffineTransform()求逆变换。
----------常见的图像变换&spm=1001.2101.3001.5002&articleId=105347694&d=1&t=3&u=616116af41ad473680a92be394cd5b45)
2733

被折叠的 条评论
为什么被折叠?



