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

这篇具有很好参考价值的文章主要介绍了opencv实现仿射变换和透射变换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

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

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

##1, 什么是仿射变换?
opencv实现仿射变换和透射变换,OpenCV从入门到精通,opencv,人工智能,计算机视觉,python
opencv实现仿射变换和透射变换,OpenCV从入门到精通,opencv,人工智能,计算机视觉,python
opencv实现仿射变换和透射变换,OpenCV从入门到精通,opencv,人工智能,计算机视觉,python

代码实现

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]获取的图像的行数和列数,用于指定仿射变换结果的大小。

效果展示

opencv实现仿射变换和透射变换,OpenCV从入门到精通,opencv,人工智能,计算机视觉,python

2,什么是透射变换

opencv实现仿射变换和透射变换,OpenCV从入门到精通,opencv,人工智能,计算机视觉,python

opencv实现仿射变换和透射变换,OpenCV从入门到精通,opencv,人工智能,计算机视觉,python

代码实现

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,人工智能,计算机视觉,python
注意事项:
在使用OpenCV进行仿射变换和透视变换时,需要注意以下事项:

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

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

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

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

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

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

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

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

到了这里,关于opencv实现仿射变换和透射变换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【OpenCV】-仿射变换

    1、认识仿射变换 仿射变换(Affine Map)又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间的过程。保持二维图形之间的相对位置保持不变,平行线依然是平行线,且直线上的点的位置顺序不变。 一个任意的仿射变换都可以

    2024年02月08日
    浏览(65)
  • opencv仿射变换

    #include opencv2/opencv.hpp /* 功能:对一系列坐标点进行平移仿射变换 参数: srcPoints:输入点坐标 dstPoints:变换后的点坐标 x:x方向平移的距离 y:y方向平移的距离 */ void tranlatePoints(std::vectorcv::Point2f srcPoints, std::vectorcv::Point2f dstPoints,double x,double y) {     cv::Mat affineMatrix = (cv::Mat_double

    2024年01月16日
    浏览(41)
  • OpenCV(十一):图像仿射变换

    目录 1.图像仿射变换介绍  仿射变换: 仿射变换矩阵: 仿射变换公式: 2.仿射变换函数 仿射变换函数:warpAffine() 图像旋转:getRotationMatrix2D() 计算仿射变换矩阵:getAffineTransform()  3.demo 1.图像仿射变换介绍  仿射变换:        仿射变换是由平移、缩放、旋转、翻转和错切组

    2024年02月10日
    浏览(56)
  • 【opencv】几何变换——仿射变换(4 计算仿射矩阵getAffineTransform(src, ds)

    对于空间变换的仿射矩阵有两种计算方式: 仿射变换矩阵有六个未知数,需要三组对应位置坐标,构造出由六个方程组成的方程组即可解六个未知数; 函数getAffineTransform();通过方程法计算参数src到dst的对应仿射变换矩阵; 头文件:#includeopencv2/imgproc.hpp 函数getAffineTransform()输

    2024年02月12日
    浏览(46)
  • 【OpenCV • c++】图像几何变换 | 图像仿射变换

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪

    2024年02月16日
    浏览(52)
  • 【OpenCV】图像变换(缩放、平移、旋转、仿射)

    图像变换是指通过对图像进行缩放、平移、旋转、仿射、透视等变换来改变图像的形状和大小。在本篇博客中,我们将详细介绍OpenCV中的图像变换函数,并提供示例代码以帮助读者更好地理解这些函数的使用方法。 缩放变换是指通过改变图像的大小来改变图像的形状。在Op

    2024年02月07日
    浏览(61)
  • 【C++ OpenCV】图像变换:连接、尺寸、翻转、旋转、仿射变换

    目录 图像缩放变换 图像翻转 图像拼接 纵向拼接 横向拼接 图像插值原理 作用 单线性插值 双线性插值的公式 双线性插值的例子 双线性插值的直观展示 意义 仿射变换 图像旋转 实操 一、实现图像旋转 二、根据定义的三个点实现仿射变换,并且求取仿射变换矩阵 源码 src -

    2024年01月18日
    浏览(196)
  • OpenCV图像的仿射变换、旋转和缩放

    以下是对代码的逐行解释:

    2024年02月13日
    浏览(53)
  • opencv图像仿射变换,cv2.warpAffine

    目录 仿射变换原理介绍 cv2.warpAffine函数介绍 代码实例          仿射变换 ,又称 仿射映射 ,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。         在有限维的情况,每个仿射变换可以由一个矩阵A和一个向量b给出,它可以写

    2024年02月05日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包