【Python图像处理篇】opencv中的仿射变换和透视变换

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

【Python图像处理篇】opencv中的仿射变换和透视变换,Python,opencv,python,图像处理

仿射变换可以将矩形图片映射为平行四边形,
透视变换可以将矩形图片映射为任意四边形。


前言

opencv提供了两个变换函数,cv2.warpAffine和cv2.warpPerspective,
使用这两个函数可以实现所有类型的变换。

cv2.warpAffine 接收的参数2x3的变换矩阵;

cv2.warpPerspective 接收的3x3的变换矩阵。


一、仿射变换 cv2.warpAffine()

1.1 函数说明

img_out = cv.warpAffine(img, mat, size)

@desc:
img_out -- 输出图像
img -- 原始图像
mat -- 2×3的变换矩阵
size -- 变换后图像尺寸
  1. 仿射变换(Affine Transformation) 包括平移(transform)、旋转(rotate)、缩放(scale)、剪切(shear)。
  2. 本质上是另外两种简单变换的叠加:一个是线性变换,一个是平移变换
  3. 该变换能保证图像的平直性和平行性,原来的直线仿射变换后还是直线,原来的平行线经过仿射变换之后还是平行线。
  4. 进行哪种形式的仿射变换完全取决于变换矩阵mat。

1.2 仿射变换实例

变换矩阵mat不同,变换类型不同

仿射变换矩阵mat的三种设定方式:

  1. 人为给定
  2. 使用函数 cv2.getRotationMatrix2D()
  3. 使用函数 cv2.getAffineTransform(src, dst)

1.2.1 平移变换

平移矩阵 mat_shift 为人为给定。

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

# ----------------------------------------------------#
#           读取图像
# ----------------------------------------------------#
image_original = cv.imread("LenaRGB.bmp")
H, W, _ = image_original.shape
cv.imshow("image_original", image_original)
cv.waitKey(delay=0)

# ----------------------------------------------------#
#           平移变换
# mat = [[1,0,dx],
#        [0,1,dy]]
# ----------------------------------------------------#
dx = 50
dy = 100
mat_shift = np.float32([[1, 0, dx],
                        [0, 1, dy]])  # 构造平移矩阵
image_shift = cv.warpAffine(image_original, mat_shift, (W, H))
cv.imshow("image_shift", image_shift)
cv.waitKey(delay=0)
cv.destroyAllWindows()

【Python图像处理篇】opencv中的仿射变换和透视变换,Python,opencv,python,图像处理

1.2.2 旋转变换

旋转矩阵 mat_rotate 使用函数 cv2.getRotationMatrix2D() 获得。

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

# ----------------------------------------------------#
#           读取图像
# ----------------------------------------------------#
image_original = cv.imread("LenaRGB.bmp")
H, W, _ = image_original.shape
cv.imshow("image_original", image_original)
cv.waitKey(delay=0)

# ----------------------------------------------------#
#           旋转变换
# 对于图像的变换,OpenCV 提供了 getRotationMatrix2D() 函数来得到旋转矩阵
# 该函数包含三个参数,第一个参数是旋转中心,第二个参数是旋转角度,第三个参数是缩放比例
# mat = cv2.getRotationMatrix2D(center, angle, scale)
# ----------------------------------------------------#
center = (256, 256)
angle = 45
scale = 1
mat_rotate = cv.getRotationMatrix2D(center, angle, scale)
image_rotate = cv.warpAffine(image_original, mat_rotate, (W, H))
cv.imshow("image_rotate", image_rotate)
cv.waitKey(delay=0)
cv.destroyAllWindows()

【Python图像处理篇】opencv中的仿射变换和透视变换,Python,opencv,python,图像处理

1.2.3 一般仿射变换

仿射矩阵 mat_affine 使用函数cv2.getAffineTransform() 获得。

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

# ----------------------------------------------------#
#           读取图像
# ----------------------------------------------------#
image_original = cv.imread("LenaRGB.bmp")
H, W, _ = image_original.shape
cv.imshow("image_original", image_original)
cv.waitKey(delay=0)

# ----------------------------------------------------#
#           仿射变换
# 变换矩阵mat可通过cv.getAffineTransfrom(points1, points2)函数获得
# 变换矩阵的获取需要至少三组变换前后对应的点坐标,设取原图上的三个点组成矩阵points1,变换后的三个点组成的矩阵points2
# mat_affine = cv.getAffineTransform(points1, points2)
# image_affine = cv.warpAffine(image_original, mat_affine, (image_original.shape[1], image_original.shape[0]))
# ----------------------------------------------------#
points1 = np.float32([[30, 30], [100, 40], [40, 100]])
points2 = np.float32([[60, 60], [200, 80], [80, 200]])
mat_affine = cv.getAffineTransform(points1, points2)
image_affine = cv.warpAffine(image_original, mat_affine, (W, H))
cv.imshow("image_affine", image_affine)
cv.waitKey(delay=0)
cv.destroyAllWindows()

【Python图像处理篇】opencv中的仿射变换和透视变换,Python,opencv,python,图像处理

1.3 仿射变换总结

  1. 在仿射变换中,原图中所有的平行线,在结果图像中仍然保持平行。
    为了得到仿射变换矩阵,需要从原图像中找到三个点以及在输出图像中的对应点。然后cv2.getAffineTransform()函数会创建一个2x3的矩阵,即为仿射变换矩阵。
    最后将矩阵传入函数cv2.warpAffine()对图像进行仿射变换。
  2. 仿射变换是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的平直性(直线经过变换之后依然是直线)和平行性(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。
  3. 任意的仿射变换都能表示为乘一个矩阵(线性变换),再加上一个向量(平移)的形式。

二、透视变换 cv2.warpPerspective()

2.1 函数说明

img_out = cv.warpPerspective(img, mat, size)

@desc:
img_out -- 输出图像
img -- 原始图像
mat -- 3×3的变换矩阵
size -- 变换后图像尺寸
  1. 透视变换(Perspective Transformation) 也叫视角转换,是将图片投影到一个新的视平面,也称作投影映射。顾名思义,将图片从一个视角转换到另一个视角
  2. 该变换能保证图像的平直性,不保证平行性,透视变换可保持直线不变形,但是平行线可能不再平行。

2.2 透视变换实例

透视变换矩阵 mat_perspective 使用函数 cv.getPerspectiveTransform() 获得。

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

# ----------------------------------------------------#
#           读取图像
# ----------------------------------------------------#
image_original = cv.imread("LenaRGB.bmp")
H, W, _ = image_original.shape
cv.imshow("image_original", image_original)
cv.waitKey(delay=0)

# ----------------------------------------------------#
#           透视变换
# 变换矩阵mat可通过cv.getPerspectiveTransform()函数获得,原理和cv.getAffineTransform()相同
# 透视变换至少需要四组变换前后对应的点坐标
# 设取原图上的四个点组成矩阵points1,变换后的四个点组成的矩阵points2
# mat_perspective = cv.getPerspectiveTransform(points1, points2)
# image_perspective = cv.warpPerspective(image_original, mat_perspective, (image_original.shape[1], image_original.shape[0]))
# ----------------------------------------------------#
points1 = np.float32([[30, 30], [10, 40], [40, 10], [5, 15]])
points2 = np.float32([[0, 0], [400, 0], [0, 400], [400, 400]])

mat_perspective = cv.getPerspectiveTransform(points1, points2)
image_perspective = cv.warpPerspective(image_original, mat_perspective,
                                       (image_original.shape[1], image_original.shape[0]))

cv.imshow("image_perspective", image_perspective)
cv.waitKey(delay=0)
cv.destroyAllWindows()

【Python图像处理篇】opencv中的仿射变换和透视变换,Python,opencv,python,图像处理

2.3 透视变换总结

  1. 对于视角变换,需要一个3x3的变换矩阵。
    为了得到视角变换(透视变换)矩阵,需要在输入图像上找四个点,以及在输出图像上对应的位置。这四个点中的任意三个都不能共线。
    然后函数cv2.getPerspectiveTransform()创建一个3x3的矩阵,即为视角变换矩阵。
    最后将矩阵传入函数cv2.warpPerspective对图像进行透视变换。
  2. 视角变换是二维到三维,再到另一个二维视平面的映射。
  3. 相对于仿射变换,视角变换灵活性更高,将一个四边形矩形区域映射到另一个四边形区域(不一定是平行四边形),不只是线性变换,但也是通过矩阵乘法实现的,使用的是3x3的矩阵,矩阵前两行和仿射矩阵相同,也实现了线性变换和平移,第三行用于实现透视变换。

三、单应性变换cv2.findHomography()

参考单应性cv.findHomography 相关的:
OpenCV中的「透视变换 / 投影变换 / 单应性」—cv.warpPerspective、cv.findHomography
单应性矩阵可以当作透视变换中的透视变换矩阵mat 。

四、总结

  1. 仿射变换可以将矩形图片映射为平行四边形,
    透视变换可以将矩形图片映射为任意四边形。

  2. 仿射变换是透视变换的一种特殊形式,它是把二维转到三维,变换后在映射回之前的二维空间,而不是另一个二维空间。
  3. 仿射变换至少需要三个对应的点坐标,透视变换至少需要四个。

参考链接:
cv2.warpAffine、cv2.warpPerspective
cv2.getPerspectiveTransform()与cv2.warpPerspective()详解
python之详细图像仿射变换讲解(图像平移、旋转、缩放、翻转)
透视变换(Perspective Transformation)★文章来源地址https://www.toymoban.com/news/detail-820964.html

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

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

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

相关文章

  • Python-OpenCV中的图像处理-几何变换

    对图像进行各种几个变换,例如移动,旋转,仿射变换等。 cv2.resize() cv2.INTER_AREA v2.INTER_CUBIC v2.INTER_LINEAR res = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) 或 height, width = img.shape[:2] res = cv2.resize(img, (2 width, 2 height), interpolation=cv2.INTER_CUBIC) OpenCV提供了使用函数cv2.warpAffine()实

    2024年02月13日
    浏览(49)
  • Python-OpenCV中的图像处理-傅里叶变换

    傅里叶变换经常被用来分析不同滤波器的频率特性。我们可以使用 2D 离散傅里叶变换 (DFT) 分析图像的频域特性。实现 DFT 的一个快速算法被称为快速傅里叶变换( FFT)。 对于一个正弦信号:x (t) = A sin (2πft), 它的频率为 f,如果把这个信号转到它的频域表示,我们会在频率

    2024年02月12日
    浏览(43)
  • OpenCV-Python中的图像处理-傅里叶变换

    傅里叶变换经常被用来分析不同滤波器的频率特性。我们可以使用 2D 离散傅里叶变换 (DFT) 分析图像的频域特性。实现 DFT 的一个快速算法被称为快速傅里叶变换( FFT)。 对于一个正弦信号:x (t) = A sin (2πft), 它的频率为 f,如果把这个信号转到它的频域表示,我们会在频率

    2024年02月12日
    浏览(29)
  • 《数字图像处理-OpenCV/Python》连载(44)图像的投影变换

    本书京东优惠购书链接:https://item.jd.com/14098452.html 本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html 几何变换分为等距变换、相似变换、仿射变换和投影变换,是指对图像的位置、大小、形状和投影进行变换,将图像从原始平面投影到新的视平面。OpenCV图像的几

    2024年02月04日
    浏览(45)
  • OpenCV中的图像处理 —— 霍夫线 / 圈变换 + 图像分割(分水岭算法) + 交互式前景提取(GrabCut算法)

    🌎上一节我们介绍了OpenCV中傅里叶变换和模板匹配,这一部分我们来聊一聊霍夫线/圈变换的原理和应用、使用分水岭算法实现图像分割和使用GrabCut算法实现交互式前景提取 🏠哈喽大家好,这里是ErrorError!,一枚某高校大二本科在读的♂同学,希望未来在机器视觉领域能够有

    2023年04月08日
    浏览(31)
  • Python-OpenCV中的图像处理-图像梯度

    图像梯度,图像边界等 使用到的函数有: cv2.Sobel(), cv2.Scharr(), cv2.Laplacian() 等 原理:梯度简单来说就是求导。OpenCV 提供了三种不同的梯度滤波器,或者说高通滤波器: Sobel,Scharr 和 Laplacian。Sobel, Scharr 其实就是求一阶或二阶导数。 Scharr 是对 Sobel(使用小的卷积核求解

    2024年02月13日
    浏览(31)
  • Python-OpenCV中的图像处理-图像平滑

    使用低通滤波器可以达到图像模糊的目的。这对与去除噪音很有帮助。其实就是去除图像中的高频成分(比如:噪音,边界)。所以边界也会被模糊一点。(当然,也有一些模糊技术不会模糊掉边界)。 这是由一个归一化卷积框完成的。他只是用卷积框覆盖区域所有像素的平

    2024年02月13日
    浏览(27)
  • Python-OpenCV中的图像处理-图像轮廓

    轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓在形状分析和物体的检测和识别中很有用。 为了更加准确,要使用二值化图像。在寻找轮廓之前,要进行阈值化处理或者 Canny 边界检测。 查找轮廓的函数会修改原始图像。如果你

    2024年02月13日
    浏览(39)
  • 【OpenCV实现图像:使用OpenCV进行图像处理之透视变换】

    透视变换(Perspective Transformation)是一种图像处理中常用的变换手段,它用于将图像从一个视角映射到另一个视角,常被称为投影映射。透视变换可以用于矫正图像中的透视畸变,使得图像中的物体在新的视平面上呈现更加规则的形状。 透视变换通常涉及到寻找图像中的特定

    2024年02月03日
    浏览(43)
  • Python-OpenCV中的图像处理-图像阀值

    与名字一样,这种方法非常简单。但像素值高于阈值时,我们给这个像素赋予一个新值(可能是白色),否则我们给它赋予另外一种颜色(也许是黑色)。这个函数就是 cv2.threshhold()。这个函数的第一个参数就是原图像,原图像应该是灰度图。第二个参数就是用来对像素值进

    2024年02月13日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包