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

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弧度,变换矩阵为:
在这里插入图片描述在这里插入图片描述

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

opencv实现的投射变换函数

  1. 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去筛选出最优解)。所以, 结果可能存在随机性.

  • 8
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值