Python OpenCV超详细讲解透视变换的实现

Python OpenCV超详细讲解透视变换的实现

简介

透视变换是计算机视觉中一种重要的图像处理技术,通过透视变换可以对图像进行几何变换从而得到需要的图像形式。OpenCV的图片处理库中提供了cv2.warpPerspective函数来完成透视变换的处理,本文将详细讲解透视变换的具体实现过程。

实现透视变换的具体步骤

  1. 读取需要进行透视变换的原始图像,可以使用OpenCV的cv2.imread()函数来读取。
import cv2

img = cv2.imread("input.jpg")
  1. 根据原图像中需要进行变换的四个点的坐标值,使用cv2.getPerspectiveTransform()函数得到透视变换矩阵M。
import numpy as np

# 坐标点顺序为左上、右上、右下、左下
src_points = np.array([(200, 200), (600, 200), (600, 500), (200, 500)])
dst_points = np.array([(300, 100), (500, 100), (500, 400), (300, 400)])
M = cv2.getPerspectiveTransform(src_points, dst_points)
  1. 对读取到的原始图像进行透视变换,使用cv2.warpPerspective()函数来实现。
output_img = cv2.warpPerspective(img, M, (img.shape[1], img.shape[0]))
  1. 最后将处理后的图像保存到本地,可以使用OpenCV的cv2.imwrite()函数来保存。
cv2.imwrite("output.jpg", output_img)

示例1:透视变换实现公文校正

在这个示例中,我们将使用透视变换处理照片上的公文纸张,将其校正为水平状态。

  1. 读入需要处理的公文照片,并使用cv2.resize()函数将其缩小一半。
img = cv2.imread("paper.jpg")
img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5)
  1. 使用cv2.Canny()函数进行边缘检测,并使用cv2.dilate()函数对边缘进行膨胀处理,增加边缘的宽度以便接下来的轮廓检测。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 30, 100)
kernel = np.ones((5, 5), np.uint8)
dilated_edges = cv2.dilate(edges, kernel, iterations=1)
  1. 使用cv2.findContours()函数来查找轮廓,并使用cv2.drawContours()函数来绘制轮廓。
contours, _ = cv2.findContours(dilated_edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 255, 0), 2)
  1. 针对得到的轮廓点进行筛选和排序,得到顶点坐标。
contour = contours[0] 
epsilon = 0.02 * cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, epsilon, True)
sorted_points = sort_points(approx)
  1. 获取一个与原始图像大小相同的黑色画布,并使用cv2.fillPoly()函数绘制出透视变换的区域。
black = np.zeros((img.shape[0], img.shape[1], 3), np.uint8)
cv2.fillPoly(black, [sorted_points], (255, 255, 255))
  1. 利用cv2.getPerspectiveTransform()函数得到透视变换矩阵并应用它到原始图像上。
M = cv2.getPerspectiveTransform(sorted_points.astype(np.float32), np.array([(0, 0), (black.shape[1], 0), (black.shape[1], black.shape[0]), (0, black.shape[0])], np.float32))
output = cv2.warpPerspective(img, M, (black.shape[1], black.shape[0]), flags=cv2.INTER_LINEAR)
  1. 将处理后的结果保存到本地。
cv2.imwrite("output.jpg", output)

示例2:透视变换实现图像拼接

在这个示例中,我们将使用透视变换将两张图像拼接在一起。

  1. 读取需要拼接的两张图像。
img1 = cv2.imread("1.jpg")
img2 = cv2.imread("2.jpg")
  1. 根据两张图像中需要进行拼接的四个点的坐标值,使用cv2.getPerspectiveTransform()函数得到透视变换矩阵M。
src_points = np.array([(313, 137), (827, 135), (1077, 765), (76, 763)])
dst_points = np.array([(0, 0), (img1.shape[1], 0), (img2.shape[1],img2.shape[0]), (0, img1.shape[0])])
M = cv2.getPerspectiveTransform(src_points, dst_points)
  1. 对读取到的原始图像进行透视变换,使用cv2.warpPerspective()函数来实现。
output = cv2.warpPerspective(img2, M, (img2.shape[1], img1.shape[0]))
  1. 进行图像拼接,使用cv2.addWeighted()函数将两张图像进行融合拼接。
result = cv2.addWeighted(img1, 1, output, 1, 0)
  1. 最后将处理后的图像保存到本地,可以使用OpenCV的cv2.imwrite()函数来保存。
cv2.imwrite("result.jpg", result)

总结

通过以上示例可以看出,利用OpenCV实现透视变换并不复杂。首先需要获得需要变换的四个点的坐标值,然后计算透视变换矩阵M,最后利用cv2.warpPerspective()函数将原始图像进行变换,实现各种需要的图像处理效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python OpenCV超详细讲解透视变换的实现 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • 用Python进行简单图像识别(验证码)

    下面是“用Python进行简单图像识别(验证码)”的完整攻略: 1. 简介 本攻略通过Python语言实现简单的验证码图像识别。对于机器学习或深度学习领域有一定基础的开发者,这是一项非常有趣的实践。 2. 准备工作 2.1 安装Python环境 如果您还未安装Python环境,可以前往 Python官方网站 下载并安装。 2.2 安装必要的依赖 本攻略使用的…

    python 2023年5月18日
    00
  • python将数组n等分的实例

    下面是关于“python将数组n等分”的完整攻略: 1. 切片方法 Python提供了一种切片方法来将一个数组切成n等份。原理是使用列表切片,设切割成m份,则切片的步长为:len(a)//m,如下代码实现: a = [1, 2, 3, 4, 5, 6, 7] m = 3 n = len(a)//m chunks = [a[i:i + n] for i in …

    python 2023年6月3日
    00
  • Python利用字典破解WIFI密码的方法

    Python利用字典破解WIFI密码的方法 破解WIFI密码 破解WIFI密码的方法有多种,其中一种方式是通过字典攻击。字典攻击的原理是,利用已有的密码字典,通过尝试其中的每一个密码,直到找到正确的密码为止。由于密码字典中通常包含了大量的常见密码,因此这种方式比暴力破解要高效得多。 所需工具 要实现这种方式的破解,需要准备以下工具: Aircrack-ng:…

    python 2023年5月13日
    00
  • 如何在Pycharm中制作自己的爬虫代码模板

    下面是详细讲解如何在Pycharm中制作自己的爬虫代码模板的完整攻略: 在Pycharm中创建一个新的模板 打开Pycharm,选择File -> New Project,创建一个新的Python项目。然后在项目中创建一个新的Python文件,这将是我们将要制作模板的文件。 在该文件中编写代码,将我们想要在爬虫中复用的代码放入函数中,并以注释的方式在代…

    python 2023年5月14日
    00
  • 详解python 破解网站反爬虫的两种简单方法

    详解python 破解网站反爬虫的两种简单方法 简介 在爬取网站数据的过程中,经常会遇到网站反爬虫的情况,例如:IP封禁、UA检测、验证码等。本文将讨论两种简单的python破解网站反爬虫的方法。 方法一:伪装UA 部分网站反爬虫机制是检测爬虫的User-Agent,所以我们可以用伪装的方式进行欺骗。 示例代码: import requests url = …

    python 2023年5月14日
    00
  • python实现kNN算法

    Python实现kNN算法的完整攻略 kNN算法是一种常用的机器学习算法,用于分类和回归问题。本文将详细讲解Python实现kNN算法的整个攻略,包括算法原理、实现过程和示例。 算法原理 kNN算法的基本思想是通过计算待分类样本与训练集中所有样本距离,选取距离近的k个样本,根据这k个样本的类别进行投票,将待分类样本归票数多的类别。在回归中,kNN算法的基本思…

    python 2023年5月14日
    00
  • python pandas分割DataFrame中的字符串及元组的方法实现

    我来详细讲解一下“Python Pandas分割DataFrame中的字符串及元组的方法实现”的完整攻略。 1. 背景介绍 在处理Pandas DataFrame数据时,我们可能会遇到需要对DataFrame中的字符串和元组进行分割的需求。比如,我们可能需要把DataFrame中的某个字符串列按照特定的分隔符进行拆分,或者需要把元组中的某个元素进行提取。 2…

    python 2023年5月14日
    00
  • Python 中的参数传递、返回值、浅拷贝、深拷贝

    参数传递 Python中的参数传递可以分为可变对象和不可变对象两种情况。 对于不可变对象,例如数字、字符串、元组等等,传递参数时会创建其副本,以避免函数内部对参数的修改影响到函数外的变量。 对于可变对象,例如列表、字典等等,传递参数时会将引用传递给函数,函数内部对参数的修改同样会影响到函数外的变量。 下面是一些示例说明: 示例1 – 不可变对象 def ch…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部