python图像处理(十)——图像仿射变换、图像透视变换和图像校正

本文介绍了Python图像处理中的图像仿射变换和透视变换。仿射变换保持了图像的平直性和平行性,通过`cv2.getAffineTransform`和`cv2.warpAffine`实现;透视变换则通过`cv2.getPerspectiveTransform`和`cv2.warpPerspective`进行,用于图像校正,例如将A4纸进行几何校正,涉及高斯模糊、边缘检测和霍夫变换等步骤。

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

一、图像仿射变换

1.原理

仿射变换(Affine Transformation 或Affine Map)是一种二维坐标(x, y)到二维坐标(u, v)的线性变换,转换过程坐标点的相对位置和属性不发生变换,是一个线性变换,该过程只发生旋转和平移过程。因此,一个平行四边形经过仿射变换后还是一个平行四边形。所以,仿射= 旋转 + 平移。其数学表达式形式如下:

对应的齐次坐标矩阵表示形式为:

 

仿射变换保持了二维图形的“平直性”(直线经仿射变换后依然为直线)和“平行性”(直线之间的相对位置关系保持不变,平行线经仿射变换后依然为平行线,且直线上点的位置顺序不会发生变化)。非共线的三对对应点确定一个唯一的仿射变换。图像的旋转加上拉升就是图像仿射变换,仿射变化也是需要一个M矩阵就可以,但是由于仿射变换比较复杂,一般直接找很难找到这个矩阵,opencv提供了根据变换前后三个点的对应关系来自动求解M。这个函数是M=cv2.getAffineTransform(pos1,pos2),其中两个位置就是变换前后的对应位置关系。输出的就是仿射矩阵M。然后在使用函数cv2.warpAffine()。

2.函数原型

仿射变换的函数原型如下:

M = cv2.getAffineTransform(post1, post2)

  • post1 = 表示变换前的位置
  • post2 = 表示变换后的位置

cv2.warpAffine(src, M, (cols, rows))

  • src表示原始图像
  • M表示仿射变换矩阵
  • (rows, cols)表示变换后的图像大小,rows表示行数,cols表示列数
### 图像增强与几何变换的技术方法 #### 基于 OpenCV Python图像增强技术 图像增强是一种提升图像质量的过程,通常用于改善视觉效果或提高计算机算法处理能力。在 OpenCV 中,可以通过多种方式实现图像增强,其中包括对比度调整、直方图均衡化、锐化滤波器等。 - **对比度调整**:通过线性拉伸像素值范围来增加图像的动态范围[^1]。 - **直方图均衡化**:通过对输入图像的灰度分布进行重新映射,使得输出图像具有更均匀的亮度分布[^2]。 ```python import cv2 img = cv2.imread('image.jpg', 0) # 加载灰度图像 equalized_img = cv2.equalizeHist(img) cv2.imshow('Equalized Image', equalized_img) cv2.waitKey(0) ``` - **锐化滤波器**:利用高斯模糊或其他边缘检测算子突出图像中的细节特征[^3]。 ```python kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]]) sharpened_image = cv2.filter2D(src=img, ddepth=-1, kernel=kernel) ``` --- #### 几何变换的核心概念技术 几何变换是指改变图像的空间属性的操作,主要包括缩放、旋转、平移仿射变换透视变换等。这些操作能够有效扩展数据集并模拟不同视角下的观察条件。 - **缩放(Scaling)**:使用 `resize()` 函数调整图像大小时可以选择不同的插值方法以适应特定需求。例如: - INTER_NEAREST:最近邻插值法,适用于快速计算但精度较低的情况; - INTER_LINEAR:双线性插值,默认选项,在速度质量之间取得平衡; - INTER_CUBIC:三次样条插值,提供更高的分辨率但运算成本较高。 ```python scaled_img = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA) ``` - **旋转(Rotation)**:围绕指定中心点按一定角度转动图像。这可通过构建旋转矩阵完成。 ```python center = (width / 2, height / 2) rotation_matrix = cv2.getRotationMatrix2D(center=center, angle=45, scale=1) rotated_img = cv2.warpAffine(img, rotation_matrix, (width, height)) ``` - **仿射变换(Affine Transformation)**:基于三组对应点定义新的坐标系关系,并应用到整个图像上。 ```python M_affine = cv2.getAffineTransform(pts1, pts2) affined_img = cv2.warpAffine(img, M_affine, (cols, rows)) ``` - **透视变换(Perspective Transformation)**:当需要校正倾斜视图或者创建三维投影效果时非常有用。 ```python pts1 = np.float32([[x1,y1],[x2,y2],[x3,y3],[x4,y4]]) pts2 = np.float32([[a,b],[c,d],[e,f],[g,h]]) M_perspective = cv2.getPerspectiveTransform(pts1, pts2) perspective_img = cv2.warpPerspective(img, M_perspective, (new_width,new_height)) ``` --- #### 综合运用实例 为了进一步说明如何综合以上提到的各种技术方法,这里给出一个完整的例子——随机生成一组仿射变换参数并对原始图片施加变化。 ```python def random_transform(image): rows, cols = image.shape[:2] # 随机选取三个控制点位置 src_points = np.float32([ [random.randint(0,int(cols*0.2)), random.randint(0,int(rows*0.2))], [random.randint(int(cols*0.8),cols), random.randint(0,int(rows*0.2))], [random.randint(0,int(cols*0.2)), random.randint(int(rows*0.8),rows)] ]) dst_points = np.float32([ [random.randint(0,int(cols*0.2)), random.randint(0,int(rows*0.2))], [random.randint(int(cols*0.7),cols), random.randint(0,int(rows*0.3))], [random.randint(0,int(cols*0.3)), random.randint(int(rows*0.7),rows)] ]) matrix = cv2.getAffineTransform(src_points, dst_points) transformed_image = cv2.warpAffine(image, matrix, (cols, rows)) return transformed_image ``` 调用此函数即可获得经过随机仿射变换后的版本。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值