刚性变换、仿射变换、透视变换和非线形变换

您所在的位置:网站首页 仿射变换包含哪些 刚性变换、仿射变换、透视变换和非线形变换

刚性变换、仿射变换、透视变换和非线形变换

2023-12-11 10:50| 来源: 网络整理| 查看: 265

1. 几个变换的区别: 在这里插入图片描述 2. 坐标系 1) 笛卡尔坐标系 在这里插入图片描述 即数学中的直角坐标系.

2) 齐次坐标 齐次坐标就是用N+1维来代表N维坐标 我们可以在一个2D笛卡尔坐标末尾加上一个额外的变量w来形成2D齐次坐标,因此,一个点(X,Y)在齐次坐标里面变成了(x,y,w),并且有 X = x/w Y = y/w 我们把齐次坐标转化为笛卡尔坐标的方法是前面n-1个坐标分量分别除以最后一个分量即可. 在这里插入图片描述 你会发现(1, 2, 3), (2, 4, 6) 和(4, 8, 12)对应同一个Euclidean point (1/3, 2/3),任何标量的乘积,例如(1a, 2a, 3a) 对应 笛卡尔空间里面的(1/3, 2/3) 。因此,这些点是“齐次的”,因为他们代表了笛卡尔坐标系里面的同一个点。换句话说,齐次坐标有规模不变性 3. 仿射变换 仿射变换(Affine Transformation) Affine Transformation是一种二维坐标到二维坐标之间的线性变换,保持二维图形的“平直性”(译注:straightness,即变换后直线还是直线不会打弯,圆弧还是圆弧)和“平行性”(译注:parallelness,其实是指保二维图形间的相对位置关系不变,平行线还是平行线,相交直线的交角不变。) 仿射变换可以通过一系列的原子变换的复合来实现,包括:平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)。 在这里插入图片描述来源: https://www.cnblogs.com/happystudyeveryday/p/10547316.html a. 平移

变换矩阵H: 在这里插入图片描述

平移变换: x' = x + tx y' = y + ty 写成矩阵形式: [x'; y' ;1] = H * [x; y; 1] = [1, 0, tx; 0, 1, ty; 0, 0, 1] * [x; y; 1]

平移变换是一种“刚体变换”,rigid-body transformation,就是不会产生形变的理想物体

b) 缩放 将每一点的横坐标放大(缩小)至sx倍,纵坐标放大(缩小)至sy倍,变换矩阵H为: 在这里插入图片描述

缩放变换: x' = sx * x y' = sy * y 写成矩阵形式: [x'; y' ;1] = H * [x; y; 1] = [sx, 0, 0; 0, sy, 0; 0, 0, 1] * [x; y; 1]

c) 旋转 在这里插入图片描述````

绕原点的二维旋转 在这里插入图片描述 绕任意点的二维旋转

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

缩放变换:

x' = x * cos(theta) - y * sin(theta) y' = x * sin(theta) + y * cos(theta) 写成矩阵形式: [x'; y' ;1] = H * [x; y; 1] = [cos(theta), -sin(theta), 0; sin(theta), cos(theta), 0; 0, 0, 1] * [x; y; 1]

平移, 缩放, 旋转组合: 旋转变换,目标图形以(x, y)为轴心顺时针旋转theta弧度,变换矩阵为: 在这里插入图片描述在这里插入图片描述

透视变换 透视变换(Perspective Transformation), 有8个自由度. 在这里插入图片描述 projective transformation(投影变换) = homography(单应性变换) = collineation( 直射变换).

opencv实现的投射变换函数

cv2.getRotationMatrix2D(center, angle, scale) 变换矩阵为2x3的矩阵. 在这里插入图片描述 import cv2 import numpy as np img = cv2.imread('aier.jpg') # 读入图像,(H, W, C) rows,cols = img.shape[:2] # 取前两个值(H,W) # 第一个参数旋转中心,第二个参数旋转角度,第三个参数:缩放比例, 生成一2*3的矩阵 center = (cols/2, rows/2) # 以图像中心为旋转中心 angle = 90 # 顺时针旋转90° scale = 1 # 等比例旋转,即旋转后尺度不变 M = cv2.getRotationMatrix2D(center, angle, scale) print(M) ''' [[ 6.123234e-17 1.000000e+00 1.500000e+02] [-1.000000e+00 6.123234e-17 6.500000e+02]] '''

https://blog.csdn.net/weixin_40522801/article/details/106454622

2. cv2.findHomography() 变换矩阵为3x3的矩阵, 最后一个元素为1, 所以需要解8个未知数, 即需要4对点.

两者联系: 都用于计算单应矩阵,即解一个线性方程组。由于单应矩阵有8个未知数(3*3,其中第9个数为1),所以至少需要4个点(每个点-x,y,提供2个约束方程)。

两者区别: 1.计算方法不同:通过跟踪源码,发现getPerspectiveTransform用的是SVD分解,findHomography看不出是用什么方法, 但两者计算结果是一样的。 2.输入参数不同:getPerspectiveTransform只会拿前4个点去计算,findHomography则会拿一堆点(>=4)去计算(其是不断从一堆点中重复拿出4个点去计算出一个结果,再采用一些优化算法RANSAC/LMEDS去筛选出最优解)。所以, 结果可能存在随机性.



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3