opencv 仿射变换和透视变换

本文介绍了OpenCV中仿射变换和透视变换的概念,包括它们的矩阵表示、API使用方法,以及如何计算变换矩阵。此外,还探讨了在文字校正场景下这两种变换的应用,特别是基于离散点求最小外接轮廓的文本纠偏算法,该方法在实际项目中表现出较高的准确性。

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

一、话说仿射变换和透视变换

对于平面区域,有两种方式的几何转换:一种是基于2×3矩阵进行的变换,叫仿射变换;另一种是基于3×3矩阵进行的变换,叫透视变换或者单应性映射。关于仿射变换和透射变换的矩阵变换,这篇博文不做重点讨论,因为图像本质就是矩阵,对矩阵的变换就是对图像像素的操作,很简单的数学知识。

仿射变换可以形象的表示成以下形式。一个平面内的任意平行四边形ABCD可以被仿射变换映射为另一个平行四边形A’B’C’D’。通俗的解释就是,可以将仿射变换想象成一幅图像画到一个胶版上,在胶版的角上推或拉,使其变形而得到不同类型的平行四边形。相比较仿射变换,透射变换更具有灵活性,一个透射变换可以将矩形转变成梯形。如下图: 

1.1 仿射变换的API

void

### OpenCV仿射变换的应用场景及实现方法 #### 应用场景 仿射变换在图像处理领域具有广泛的应用,主要包括但不限于以下几个方面: - **几何校正**:通过调整图像中的透视关系,使倾斜的物体看起来更端正[^1]。 - **对象变形**:通过对特定区域应用仿射变换,模拟拉伸、压缩或其他形状变化的效果[^2]。 - **视角转换**:改变相机拍摄的角度或方向,从而获得不同的观察效果[^3]。 这些应用场景通常涉及旋转、缩放平移操作,能够显著提升图像的质量实用性。 --- #### 实现方法 以下是使用OpenCV实现仿射变换的具体方法: ##### 方法一:`cv2.getAffineTransform()` 配合 `cv2.warpAffine()` 此方法适用于已知三组对应点的情况。具体步骤如下: 1. 定义源图像上的三个点及其对应的变换后的目标位置; 2. 调用 `cv2.getAffineTransform()` 计算变换矩阵; 3. 利用 `cv2.warpAffine()` 对整幅图像进行变换。 代码示例如下: ```python import cv2 import numpy as np # 原始图像路径 image_path = 'example.jpg' img = cv2.imread(image_path) # 定义原始图像上的三个点 src_points = np.float32([[50, 50], [200, 50], [50, 200]]) # 定义变换后的目标位置 dst_points = np.float32([[10, 100], [200, 50], [100, 250]]) # 获取仿射变换矩阵 M_affine = cv2.getAffineTransform(src_points, dst_points) # 执行仿射变换 result_img = cv2.warpAffine(img, M_affine, (img.shape[1], img.shape[0])) # 显示结果 cv2.imshow('Original Image', img) cv2.imshow('Transformed Image', result_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 上述代码实现了基于指定点集的仿射变换,并展示了原始图像与变换后图像的对比。 --- ##### 方法二:`cv2.getRotationMatrix2D()` 配合 `cv2.warpAffine()` 如果仅需对图像执行简单的旋转、缩放平移操作,可以直接调用 `cv2.getRotationMatrix2D()` 来获取变换矩阵。 代码示例如下: ```python import cv2 import numpy as np # 加载图像 image_path = 'example.jpg' img = cv2.imread(image_path) # 图像中心作为旋转中心 center = (img.shape[1] / 2, img.shape[0] / 2) # 设置旋转角度(顺时针为负值) angle = 45 # 逆时针旋转45度 # 缩放比例 scale = 1.0 # 获取旋转矩阵 rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale) # 进行仿射变换 rotated_image = cv2.warpAffine(img, rotation_matrix, (img.shape[1], img.shape[0])) # 展示结果 cv2.imshow('Rotated Image', rotated_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这段代码演示了如何围绕图像中心进行旋转并保持尺寸不变的操作。 --- #### 总结 无论是通过定义对应点还是直接设定旋转参数的方式,都可以借助OpenCV完成复杂的仿射变换任务。这两种方式各有优劣,在实际开发过程中可根据需求灵活选用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值