opencv warpPerspective透视变换实现原理与过程

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

【版权声明】
本文为博主原创文章,未经博主允许严禁转载,我们会定期进行侵权检索。

        cv2.warpPerspective函数是OpenCV库中用于执行透视变换的函数之一。它可以将图像从一个透视投影转换为另一个透视投影,实现图像的旋转、缩放、平移等操作。该操作可表示为:

DST = M * SRC

        上式中SRC表示原图像,DST表示变换后图像,M表示透视变换矩阵(3x3)。

1 cv2.warpPerspective

        cv2.warpPerspective函数在OpenCV中用于执行透视变换,其计算过程和各个参数如下所示:

1.1 计算过程

        (1)定义目标图像的大小和数据类型(dtype)。

        (2)计算透视变换矩阵(3x3矩阵),可以通过cv2.getPerspectiveTransform函数获得。

        (3)应用透视变换矩阵到源图像上的每个像素,计算其在目标图像中的位置。

        (4)根据这个位置,使用插值方法估算目标图像中的像素值。

        在第三步中,其实现方式实际是依据M’ * DST = SRC,即根据目标尺寸计算其在源图中对应位置,然后获取原图相应位置的像素值。这里M’表示M的逆矩阵。

        1.2 参数说明

        src: 源图像,即待进行透视变换的图像。

        M: 变换矩阵,即3x3的透视变换矩阵。

        dsize: 目标图像的大小,以元组形式表示,例如(width, height)。

        flags: 插值方法的标志,用于指定插值方法,默认为cv2.INTER_LINEAR。

        borderMode: 边界模式,用于指定超出边界的像素处理方式,默认为cv2.BORDER_CONSTANT。

        borderValue: 当边界模式为cv2.BORDER_CONSTANT时,用于指定边界像素的值,默认为0。

        1.3 返回值

        dst: 目标图像,即经过透视变换后的图像。

2 示例程序

        示例程序如下所示。

import cv2
import numpy as np

if __name__ == '__main__':
    # 生成输入图像
    h, w = 200, 300  # 图像大小
    origin_image = np.zeros((h, w), dtype=np.uint8)
    pts = np.array([[50, 50], [100, 160], [250, 100]], np.int32)
    pts = pts.reshape((-1, 1, 2))
    origin_image = cv2.fillConvexPoly(origin_image, pts, 255, 100)
    # 透视变换矩阵
    M = np.array([[0.99, -0.11, 80], [-0.11, 0.99, 30], [0, 0, 1]])
    # opencv透视变换
    dst_opencv = cv2.warpPerspective(origin_image.copy(), M, (w, h))
    # 显示原始图像和经过透视变换后的图像
    cv2.imshow('original', origin_image)
    cv2.imshow('opencv', dst_opencv)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

        示例程序的原始图像和变换后图像如下所示。

warpperspective 旋转,opencv,linux,python,opencv,透视变换,python

3 自定义验证程序mdst

        基于公式验证M’ * DST = SRC变换过程,程序如下所示。

import cv2
import numpy as np


# warp_perspective验证,M' * DST = SRC
def m_dst(src, M, dsize):
    M = np.linalg.inv(M) # 求逆矩阵
    dst = np.zeros((dsize[1], dsize[0]), dtype=np.uint8)
    pos = np.array(np.meshgrid(range(dsize[0]), range(dsize[1]))).T.reshape(-1, 2)
    dpos = np.hstack((pos, np.ones((pos.shape[0], 1)))).T
    spos = M @ dpos
    spos = spos / spos[2, :]
    spos = spos.astype(np.int64).T[:, :2]
    mask = np.where((spos[:, 0] < dsize[0]) & (spos[:, 0] >= 0) & (spos[:, 1] < dsize[1]) & (spos[:, 1] >= 0))
    spos = spos[mask]
    dpos = pos[mask]
    dst[dpos[:, 1], dpos[:, 0]] = src[spos[:, 1], spos[:, 0]]
    return dst


if __name__ == '__main__':
    # 生成输入图像
    h, w = 200, 300  # 图像大小
    origin_image = np.zeros((h, w), dtype=np.uint8)
    pts = np.array([[50, 50], [100, 160], [250, 100]], np.int32)
    pts = pts.reshape((-1, 1, 2))
    origin_image = cv2.fillConvexPoly(origin_image, pts, 255, 100)
    # 透视变换矩阵
    M = np.array([[0.99, -0.11, 80], [-0.11, 0.99, 30], [0, 0, 1]])
    # M' * DST = SRC
    dst_mdst = m_dst(origin_image, M, (w, h))
    # 显示原始图像和经过透视变换后的图像
    cv2.imshow('original', origin_image)
    cv2.imshow('mdst', dst_mdst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

        原始图像和变换后图像如下所示。

warpperspective 旋转,opencv,linux,python,opencv,透视变换,python

4 自定义验证程序msrc

        基于公式验证DST = M * SRC变换过程,程序如下所示。

import cv2
import numpy as np


# warp_perspective验证,DST = M * SRC
def m_src(src, M, dsize):
    dst = np.zeros((dsize[1], dsize[0]), np.uint8)
    pos = np.where(src > 0)
    pos = np.vstack((pos[1], pos[0], np.ones_like(pos[0])))
    pos = M @ pos
    pos = pos / pos[2, :]
    pos = pos.astype(np.int64).T[:, :2]
    pos = pos[np.where((pos[:, 0]<dsize[0]) & (pos[:, 0]>=0) & (pos[:, 1]<dsize[1]) & (pos[:, 1]>=0))]
    dst[pos[:, 1], pos[:, 0]] = 255
    return dst

if __name__ == '__main__':
    # 生成输入图像
    h, w = 200, 300  # 图像大小
    origin_image = np.zeros((h, w), dtype=np.uint8)
    pts = np.array([[50, 50], [100, 160], [250, 100]], np.int32)
    pts = pts.reshape((-1, 1, 2))
    origin_image = cv2.fillConvexPoly(origin_image, pts, 255, 100)
    # 透视变换矩阵
    M = np.array([[0.99, -0.11, 80], [-0.11, 0.99, 30], [0, 0, 1]])
    # M' * DST = SRC
    dst_msrc = m_src(origin_image, M, (w, h))
    # 显示原始图像和经过透视变换后的图像
    cv2.imshow('original', origin_image)
    cv2.imshow('msrc', dst_msrc)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

        原始图像和变换后图像如下所示。

warpperspective 旋转,opencv,linux,python,opencv,透视变换,python

5 注意事项

        (1)自定义验证程序mdst和msrc未进行插值,仅仅实现了透视变换过程,可以明显看到边缘效果不如opencv版本。

        (2)mdst和msrc正常情况下结果趋向阈值,但是由于程序中存在一个取整的近似操作,所以二者所得结果不完全相同。在部分情况下,msrc经变换后会出现大量重叠,分辨率下降,效果差于mdst方法。

【版权声明】
本文为博主原创文章,未经博主允许严禁转载,我们会定期进行侵权检索。
  

更多python与C++技巧、三维算法、深度学习算法总结、大模型请关注我的博客,欢迎讨论与交流:https://blog.csdn.net/suiyingy,或”乐乐感知学堂“公众号。Python三维领域专业书籍推荐:《人工智能点云处理及深度学习算法》。文章来源地址https://www.toymoban.com/news/detail-845643.html

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

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

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

相关文章

  • Matlab 透视变换 原理及其代码实现

    透视变换本质 :将一个图像投影到新的视平面 透视变换思路: 将二维坐标系转换为三维坐标系。 将三维坐标系投影到新的二维坐标系。 该过程属于非线性变换过程,一个菱形在经过非线性变换后得到一个四边形,但是不在平行。 透视变换又可以称为投影变换,仿射变换属

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

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

    2024年02月03日
    浏览(64)
  • 基于OpenCV的图像透视变换详解(从理论到实现再到实践)

             一直无法理解两种仿射变换与透视变换的区别,因此详细学习了两种变换的具体细节,重新书写了公式,并给出自己的一些看法。         可以认为, 仿射变换 是 透视变换 的一种 特例 。         仿射变换 是一种 二维坐标 到 二维坐标 之间的 线性变换

    2024年02月01日
    浏览(36)
  • 用OpenCV进行透视变换

    欢迎回来!今天我们将焦点聚焦在我在图像处理中最喜欢的话题之一——透视变换。使用该技术,可以灵活方便的实现各种各样好玩的特效。 闲话少说,我们直接开始吧! 我们首先展开对单应矩阵的深入研究。作为图像处理的基本工具,它在捕捉图像中的几何变换方面发挥

    2024年02月10日
    浏览(44)
  • 【opencv】:图像的透视变换

    仿射变换(Affine Transformation或 Affine Map) , 又称为仿射映射, 是指在几何中, 图像进行从一个向量空间进行一次线性变换和一次平移, 变换为到另一个向量空间的过程。我们常说的仿射变换是透视变换的一个特例。 以上便是透视变换的原理图,即将源图像通过投影映射,

    2024年02月15日
    浏览(44)
  • OpenCV利用透视变换矫正图像

    案例:使用OpenCV将一张折射的图片给矫正过来 实现步骤: 1.载入图像 2.图像灰度化 3.二值分割 4.形态学操作去除噪点 5.轮廓发现 6.使用霍夫直线检测,检测上下左右四条直线(有可能是多条,但是无所谓) 7.绘制出直线 8.寻找与定位上下左右是条直线 9.拟合四条直线方程 1

    2024年02月06日
    浏览(66)
  • 使用opencv对图像进行透视变换

    一.什么是透视变换 透视变换就是透视变换(Perspective Transformation)是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。简单的来说就是

    2024年02月08日
    浏览(51)
  • C++ Opencv之3D透视变换

    各位小伙伴们是不是经常出现拍摄角度不佳,看着特别难受,想把图片中的某个物体翻转一下呢? 本文就以下面这本书为例,只需要鼠标按照顺时针点击书的四个脚就可以完成变换: 侧着看好难受哦,想看正面怎么办? 效果: 舒服了!!! 目录 流程讲解: 1.先读取一个需要3D透视变换的图

    2024年02月03日
    浏览(40)
  • Python中OpenCV透视变换恢复扭曲图像

    在处理图像问题时,经常会遇到将要处理的目标的位置是斜的,需要使用透视变换进行矫正。如下图,该图片中左边的目标是扭曲倾斜拍摄的,那么任务就是将其矫正过来,如下图右图所示。 前提1:这里假设我已经知道四个点坐标(可用深度学习方法检测/分割)和目标宽高

    2024年01月20日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包