opencv实现仿射变换和透射变换

OpenCV中的仿射变换和透视变换是常用的图像几何变换方法,可以用于实现图像的旋转、缩放、平移、扭曲等操作。这两种变换方式在计算机视觉、图像处理以及计算机图形学等领域广泛应用。

仿射变换 仿射变换是一种保持直线平行性质的线性变换,它可以对图像进行平移、旋转、缩放和剪切等操作。在OpenCV中,通过使用getAffineTransform()函数来获取仿射变换矩阵,并使用warpAffine()函数将变换矩阵应用于原始图像。
仿射变换需要以三个点或者三对点来定义原图到目标图的映射关系,其中包括了平移、旋转、缩放和剪切参数。根据这些参数,可以计算出一个2×3的变换矩阵,该矩阵表示了原图到目标图之间的几何变换关系。

透视变换 透视变换是一种非线性变换,它可以改变图像的投影视角,用于校正透视畸变或实现投影效果。透视变换可以用于纠正图像中的平面物体的倾斜、旋转和缩放,使其呈现出正常的尺寸和角度。
在OpenCV中,通过使用getPerspectiveTransform()函数获取透视变换矩阵,并使用warpPerspective()函数将变换矩阵应用于原始图像。透视变换需要提供四个点或者四对点来定义原图到目标图之间的映射关系。

透视变换的主要原理是根据四个点的位置关系计算出透视变换矩阵。该矩阵可以将原图的任意四边形区域投影为矩形,从而实现图像的透视校正或投影效果。

无论是仿射变换还是透视变换,OpenCV都提供了相应的函数来方便地进行操作。通过这些函数,可以对图像进行各种几何变换,从而实现图像的扭曲、校正、修复等功能。

这些变换方法在计算机视觉和图像处理中具有重要的应用。例如,在图像拼接中,透视变换可以用于将多张倾斜的图像拼接成全景图;在虚拟增强现实中,仿射变换和透视变换可以用于对虚拟物体进行渲染和投影;在人脸识别中,透视变换可以用于校正人脸图像的畸变,提高识别准确性。总之,仿射变换和透视变换为图像处理和计算机视觉领域的许多应用提供了强大的工具。

##1, 什么是仿射变换?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

#设置字体
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']

#图像的读取
img = cv.imread("lena.png")

#仿射变换
rows , cols = img.shape[:2]

#创建变换矩阵
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[100,100],[200,50],[100,250]])
M = cv.getAffineTransform(pts1,pts2)

#完成仿射变换
dst = cv.warpAffine(img,M,(cols,rows))

#图像的显示
fig,axes = plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img[:,:,::-1])
axes[0].set_title("原图")

axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("放射后结果")
plt.show()

代码讲解

首先,导入所需的库:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
然后,读取图像:

img = cv.imread("lena.png")
这里假设存在名为"lena.png"的图像文件,使用cv.imread()函数将其读取为一个NumPy数组对象,并赋值给变量img。

接下来,定义仿射变换所需的坐标点:

pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[100,100],[200,50],[100,250]])
pts1是原图中的三个点的坐标,pts2是对应的目标仿射后的三个点的坐标。这里选择了两个三角形形状的区域作为示例。

然后,通过这些坐标点获取仿射变换的矩阵:

M = cv.getAffineTransform(pts1,pts2)
使用cv.getAffineTransform()函数根据这两组对应的点,计算得到仿射变换的矩阵,赋值给变量M。

接着,进行仿射变换操作:

dst = cv.warpAffine(img,M,(cols,rows))
使用cv.warpAffine()函数对图像进行仿射变换,将原图img和变换矩阵M作为参数传入,得到仿射后的结果赋值给变量dst。

最后,使用Matplotlib库显示原图和仿射后的结果:

fig,axes = plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img[:,:,::-1])
axes[0].set_title("原图")

axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("仿射后结果")
plt.show()
通过创建一个包含2个子图的Figure对象,并调用imshow()函数分别在两个子图上显示原图和仿射后的结果。set_title()函数用于设置子图的标题。最后,使用plt.show()函数显示图像。

注意,代码中的cols和rows是通过img.shape[:2]获取的图像的行数和列数,用于指定仿射变换结果的大小。

效果展示

在这里插入图片描述

2,什么是透射变换

在这里插入图片描述

在这里插入图片描述

代码实现

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']

img = cv.imread("lena.png")
rows, cols, _ = img.shape

pts1 = np.float32([[50, 50], [200, 50], [50, 200], [200, 200]])
pts2 = np.float32([[10, 100], [200, 50], [100, 250], [200, 200]])

T = cv.getPerspectiveTransform(pts1, pts2)
dst = cv.warpPerspective(img, T, (cols, rows))

fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)
axes[0].imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
axes[0].set_title("原图")
axes[1].imshow(cv.cvtColor(dst, cv.COLOR_BGR2RGB))
axes[1].set_title("透视变换后的结果")
plt.show()


结果展示

在这里插入图片描述
注意事项:
在使用OpenCV进行仿射变换和透视变换时,需要注意以下事项:

变换矩阵的创建:要进行仿射变换或透视变换,必须通过变换矩阵定义变换关系。可以使用OpenCV提供的函数计算变换矩阵,也可以手动指定矩阵中的值。

点的坐标变换:变换矩阵可以用来对图像中的点进行坐标变换。对于仿射变换,可以使用变换矩阵乘以源点的坐标向量得到目标点的坐标向量。对于透视变换,需要将源点的坐标向量转换为齐次坐标,然后乘以变换矩阵,最后将结果转换回欧几里得坐标。

插值方法选择:在进行变换时,需要对变换后的像素进行插值操作,以确定其灰度值。OpenCV支持多种插值方法,包括最近邻插值、双线性插值、三次样条插值等。不同方法对应的精度和速度有所差异,需要根据实际需求进行合理选择。

边界填充方式:变换后的图像可能会出现一些空洞或者扭曲,需要通过边界填充方式来解决。OpenCV支持多种边界填充方式,包括零填充、最近邻填充、镜像填充等。不同的填充方式会对变换结果产生不同的影响,需要根据实际情况进行选择。

变换参数的调整:变换矩阵中的参数可以通过手动调整来控制变换效果。例如,在仿射变换中,可以通过调整旋转角度、缩放因子和平移量来改变变换效果。在透视变换中,则需要调整四个顶点的坐标来控制变换效果。

变换效果的评估:变换的效果可以通过多种指标来评估,包括变换后图像的几何形状、像素值分布、峰值信噪比等。可以通过比较不同参数组合的结果,使用指标评估方法来选择最佳的变换参数。

变换链的应用:变换链可以将多个变换操作组合起来,形成复杂的变换操作。例如,在对图像进行校正时,可以使用仿射变换和透视变换组合的变换链。需要注意变换顺序对最终结果的影响,应该根据实际情况选择合适的变换顺序。

总之,在使用OpenCV进行仿射变换和透视变换时,需要综合考虑上述因素,并根据具体情况选择合适的方法和参数。需要注意调整变换矩阵中的参数、选择合适的插值方法和边界填充方式、评估变换效果等问题。变换链的应用也是获得最佳效果的关键。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值