用OpenCV进行透视变换

news/2024/11/13 14:52:16/

1. 引言

欢迎回来!今天我们将焦点聚焦在我在图像处理中最喜欢的话题之一——透视变换。使用该技术,可以灵活方便的实现各种各样好玩的特效。

闲话少说,我们直接开始吧!

2. 单应矩阵

我们首先展开对单应矩阵的深入研究。作为图像处理的基本工具,它在捕捉图像中的几何变换方面发挥着至关重要的作用。更具体地说,它是实现透视变换的秘密武器。

单应矩阵被定义为图像的两个平面投影之间的映射。它由齐次坐标空间中的3x3变换矩阵表示。这些变换可以是旋转、平移、缩放等操作的组合。

我们用示意图总结如下:
在这里插入图片描述

3. 举个栗子

虽然上图简明地定义了常见的转换,但是如果我们将其应用到输入和输出为图像操作会怎样?根据变换,我们需要几个点来计算单应矩阵。让我们来做吧!像往常一样,让我们首先导入必要的库,如下:

# Import libraries
from skimage.io import imread, imshow
import matplotlib.pyplot as plt
import numpy as np
from skimage import transform

接着导入我们需要的测试图像,代码如下:

# Display the original imageimage = imread('painting.png')
plt.figure(figsize=(20,20))
plt.imshow(image)
plt.title('Original Image', fontsize=20, weight='bold')
plt.axis('off')
plt.show()

结果如下:
在这里插入图片描述

4. 计算变换矩阵

接着我们想对这幅画有一个自上而下的视图。我们需要计算单应矩阵。我们必须确定这幅画明确的角点。在这种情况下,我使用画图应用程序来识别画的四个角点坐标:

# Source points
src = np.array([879, 625,                    # top left431, 2466,                   # bottom left3251, 61,                    # top right3416, 2767]).reshape((4, 2)) # bottom right

为了执行单应性变换,我们需要一组与源点相对应的目标点。这些目标点表示我们希望源点在输出图像中的位置。对于自上而下的视图,这里我们引用源点的最小值和最大值x和y:

# Destination points
dst = np.array([[np.min(src[:, 0]), np.min(src[:, 1])],  # top left[np.min(src[:, 0]), np.max(src[:, 1])],  # bottom left[np.max(src[:, 0]), np.min(src[:, 1])],  # top right[np.max(src[:, 0]), np.max(src[:, 1])],  # bottom right
])

接着我们用以下代码计算单应矩阵,如下:

tform = transform.estimate_transform('projective', src, dst)

5. 透视变换

经过上述处理,我们有了执行透视变换所需要的单应性矩阵,接着我们来执行对应的透视变换,如下:

tf_img = transform.warp(image, tform.inverse)
fig, ax = plt.subplots(figsize=(20,20))
ax.imshow(tf_img)
_ = ax.set_title('projective transformation')

得到结果如下:
在这里插入图片描述

6. 美化显示效果

观察上图,考虑到图像外围添加了白色像素,输出看起来很奇怪,我们可以编辑出代码来裁剪这些奇怪的墙和额外的像素:

# Load the image
image = imread('painting.png')# Source points
src = np.array([879, 625,                    # top left431, 2466,                   # bottom left3251, 61,                    # top right3416, 2767]).reshape((4, 2)) # bottom right# Estimate the width and height from the source points
width = np.max(src[:, 0]) - np.min(src[:, 0])
height = np.max(src[:, 1]) - np.min(src[:, 1])# Destination points (forming a box shape)
dst = np.array([[0, 0],[0, height],[width, 0],[width, height]
])# Compute the projective transform
tform = transform.estimate_transform('projective', src, dst)# Apply the transformation
warped_image = transform.warp(image, tform.inverse, output_shape=(height, width))# Convert the warped image to uint8
warped_image_uint8 = (warped_image * 255).astype(np.uint8)# Display the transformed and cropped image
plt.figure(figsize=(20,20))
plt.imshow(warped_image_uint8)
plt.title('Transformed and Cropped Image', fontsize=20, weight='bold')
plt.axis('off')
plt.show()

最终的显示效果如下:
在这里插入图片描述

7. 总结

经过我们一步一步的优化,我们最终得到了,一幅美丽而干净的自上而下的油画。一般来说,一旦我们有了单应矩阵,我们也可以用它来变换一幅图像,使其与另一幅图像的视角对齐。这对于图像拼接等应用非常有用!

嗯嗯,您学废了嘛?


http://www.ppmy.cn/news/529883.html

相关文章

免费 Windows 数据恢复工具推荐

以下是一些免费的 Windows 数据恢复工具: 1、Recuva: Recuva 是一款功能强大的免费数据恢复工具,可以恢复各种类型的文件,包括文档、图片、音频和视频等。它能够恢复已删除的文件,格式化的硬盘以及无法访问的文件等。…

OCC-BEV:基于三维场景重建的多摄像机统一预训练

论文:https://arxiv.org/pdf/2305.18829.pdf 代码:https://github.com/chaytonmin/Occ-BEV 多摄像机3D感知技术(能够收集车辆周围360的环境信息)已经成为自动驾驶领域的一个突出研究领域,为 Lidarb-based 解决方案提供…

EasyRecovery15最新好用的电脑免费数据恢复软件

EasyRecovery 15mac/win新版本是一款操作安全、价格便宜、用户自主操作的数据恢复方案,它支持从各种各样的存储介质恢复删除或者丢失的文件,其支持的媒体介质包括:硬盘驱动器、光驱、闪存、硬盘、光盘、U盘/移动硬盘、数码相机、手机以及其它…

EasyRecovery15电脑版数据恢复工具 国内免费的数据恢复软件

之前碰到过一次数据恢复的情况,也算是试用了国内国外的数据恢复软件都有尝试过可以给大家做个参考总结:好这个概念,其实最好的判定就是自己的资料有没有成功找回,以及软件对比下,如果有部分文件某一软件找到而其他软件…

7个免费的Windows数据恢复工具

有时候,当不小心删掉一些重要文件之后你会非常后悔,那么数据恢复软件就是帮助你重新获得这些删除文件的重要解决方案。如今市场上有很多免费的数据恢复软件可以帮助你恢复已经删除的文件,在这里,小编将为大家介绍7个免费的Windows…

tidb-写热点的测试及分析

一、写热点现象 1.通过grafana中的TiKV-Trouble-Shooting 中 Hot Write 面板的raft store cpu观测是否有单节点的cpu高于其他节点 2.dashboard中写热点图呈现如下状态 二、解决写入热点的几种方法 建表的时候采用SHARD_ROW_ID_BITS 和PRE_SPLIT_REGIONS使用auto_random来代替…

springboot监听文件新增文件并上传OSS

记录工作中的一点失误,ossUtil类中的属性filedir(文件存储目录)需要“/”才能生成目录 项目中的本地文件夹和oss上的文件夹是一样的,是由传入controller的参数决定的 一、项目目录 二、加入jar 三、代码 1.Config FileListener package com.ssm.boot…

晶体管静态参数测试仪系统 能测 IGBT. Mosfet. Diode. BJT......

DCT1401 晶体管静态参数测试仪系统 DCT1401晶体管静态参数测试仪系统能测试很多电子元器件的静态直流参数(如击穿电压V(BR)CES/V(BR)DSs、漏电流ICEs/lGEs/IGSs/lDSs、阈值电压/VGE(th)、开启电压/VCE(on)、跨导/Gfe/Gfs、压降/Vf、导通内阻Rds(on))。…