基础——仿射变换矩阵与warpAffine

本文详细介绍了仿射变换的概念,它是二维坐标到二维坐标之间的一种线性变换,保持图形的平直性和平行性。同时,文章还对比了仿射变换与透视变换的区别,并列举了几种常用的变换类型,如平移、缩放、旋转等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文转载于:
http://blog.youkuaiyun.com/q123456789098/article/details/53330484
http://www.cnblogs.com/ghj1976/p/5199086.html


变换模型是指根据待匹配图像与背景图像之间几何畸变的情况,所选择的能最佳拟合两幅图像之间变化的几何变换模型。可采用的变换模型有如下几种:刚性变换、仿射变换、透视变换和非线形变换等,如下图:
这里写图片描述
参考:http://download.youkuaiyun.com/detail/fadefaraway/9751785
  
  
  
  
其中第三个的仿射变换就是我们这节要讨论的。
仿射变换(Affine Transformation)
Affine Transformation是一种二维坐标到二维坐标之间的线性变换,保持二维图形的“平直性”(译注:straightness,即变换后直线还是直线不会打弯,圆弧还是圆弧)和“平行性”(译注:parallelness,其实是指保二维图形间的相对位置关系不变,平行线还是平行线,相交直线的交角不变。)。
这里写图片描述
  
  
  
其中仿射变换和透视变换的区别(c和d的区别)可以看下图:
这里写图片描述
  
  
  
   
仿射变换可以通过一系列的原子变换的复合来实现,包括:平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)。
这里写图片描述
仿射变换可以用下面公式表示:
这里写图片描述
参考:http://download.youkuaiyun.com/detail/fadefaraway/9751785
  
  
  
具体到二维的仿射变换的计算如下:
这里写图片描述
  
  
  
  
  
一些常用转换矩阵如下:
这里写图片描述

### 图像处理中的几何变换 #### 仿射变换透视变换的区别 在图像处理领域,几何变换是一种重要的技术手段,用于改变图像的空间属性。两种常见的几何变换方式分别是仿射变换和透视变换。 对于仿射变换而言,这种变换可以视为一种特殊的线性变换加上平移操作[^3]。具体来说,在二维空间内,任何三点不共线的情况下,给定两组对应的三角形顶点坐标,可以通过计算得到一个唯一的2×3矩阵\( M \),该矩阵能将一组点精确映射至另一组点的位置上。此过程可通过`cv2.getAffineTransform()`函数完成[^1]。值得注意的是,仿射变换保留了直线和平行性的特性,即原始图形中的平行线经变换后依然保持平行状态[^2]。 相比之下,透视变换则更加灵活多变,它不仅涵盖了仿射变换所能实现的效果,还进一步引入了对角线交点不变这一性质[^4]。这意味着当涉及到更复杂的场景如模拟相机镜头造成的视差效应或是纠正倾斜拍摄的照片时,透视变换显得尤为重要。为了执行这样的转换,通常需要提供四组匹配的关键点来构建一个3×3的单应性矩阵H,之后利用`cv2.getPerspectiveTransform()`以及`cv2.warpPerspective()`两个API组合起来达成目的。 综上所述,虽然两者都属于广义上的几何变换范畴,但在实际应用场景中各有侧重——如果仅需简单调整角度、比例而不破坏原有结构,则选用仿射变换;而面对更为复杂的情况比如矫正畸变严重的照片或者创建逼真的视觉特效时,应该优先考虑采用透视变换方案。 ```python import numpy as np import cv2 # 定义源图像和目标图像之间的对应点 (仿射变换) pts_src = np.float32([[50, 50], [200, 50], [50, 200]]) pts_dst = np.float32([[10, 100], [200, 50], [100, 250]]) # 计算仿射变换矩阵 affine_matrix = cv2.getAffineTransform(pts_src, pts_dst) # 应用仿射变换 img_affined = cv2.warpAffine(img_original, affine_matrix, dsize=(width, height)) # 对于透视变换,定义四个点而不是三个 pts_src_persp = np.float32([[78, 95], [356, 107], [59, 368], [365, 379]]) pts_dst_persp = np.float32([[0, 0], [width - 1, 0], [0, height - 1], [width - 1, height - 1]]) # 获取透视变换矩阵 perspective_matrix = cv2.getPerspectiveTransform(pts_src_persp, pts_dst_persp) # 执行透视变换 img_warped = cv2.warpPerspective(img_original, perspective_matrix, dsize=(width, height)) ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值