专栏首页深度学习和计算机视觉基于Opencv的图像单应性转换实战

基于Opencv的图像单应性转换实战

同形转换

我们所常见的都是以这样的方式来处理图像:检测斑点,分割感兴趣的对象等。我们如何将它们从一种形式转换为另一种形式来处理这些图像呢?通过单应矩阵快速转换图像可以实现这个需求。

单应性

单应性,也被称为平面单应性,是两个平面之间发生的转换。换句话说,它是图像的两个平面投影之间的映射。它由同构坐标空间中的3x3转换矩阵表示。在数学上,同质矩阵表示为:

在坐标标平面上:

如图所示,图像中的元素在同一个坐标平面中投影到另一幅图像,保留了相同的信息,但具有变换的透视图。现在,让我们使用Python代码实现这一操作。与往常一样,在我们实际执行此操作之前。必须导入以下库:

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

我们将在本文中使用多个图像。通过单击标题中嵌入的链接来下载图像。考虑一下这个棋盘:

chess = imread('chess.png')
imshow(chess)

假设你们想改为看到木板及其零件的鸟瞰图。是否可以仅使用图像中的信息来做到这一点?在这种情况下,你们要做的就是找到木板的角并将其设置为原坐标。之后,在要进行单应性投影的同一图像中,选择要显示变换后的图像的目标坐标。该代码已实现:

#source coordinates
src = np.array([391, 100, 
                14, 271,
                347, 624,
                747, 298,]).reshape((4, 2))
#destination coordinates
src = np.array([100, 100, 
                100, 650,
                650, 650,
                650, 100,]).reshape((4, 2))
#using skimage’s transform module where ‘projective’ is our desired parameter
tform = transform.estimate_transform('projective', src, dst)
tf_img = transform.warp(chess, tform.inverse)
#plotting the transformed image
fig, ax = plt.subplots()
ax.imshow(tf_img)
_ = ax.set_title('projective transformation')

既然我们已经做到了,那么考虑到目标图像来自其他图像的情况,我们又如何处理另一个图像呢?让我们来看这个例子。考虑一下这张图像,一场篮球比赛。

still2 = imread('still2.png')
imshow(still2)

假设我们有兴趣通过单应性法改变球场的一半。首先,从上面的图像(即半场的角)确定原坐标。然后,从另一幅与上述图像完全不同的图像中找到我们的目的地坐标。我们正在谈论的另一个图像如下所示:

court = imread('court.png')
plt.imshow(court)

让我们通过代码实际看到这一点:

src_2 = np.array([440, 470,
                  10, 750,
                  1190, 490,
                  1195, 785,]).reshape((4, 2))
dst_2 = np.array([3, 7,
                  3, 506,
                  447, 7,
                  447, 506,]).reshape((4, 2))
fig, ax = plt.subplots(3, 1, figsize=(25, 15))
ax[0].imshow(still2, )
 ax[0].scatter(src_2[:,0], src_2[:,1], c='red', s=30)
 ax[0].set_title('source coordinates')
ax[1].imshow(court)
 ax[1].scatter(dst_2[:,0], dst_2[:,1], c='red', s=30)
 ax[1].set_title('destination coordinates')
dst_2 = dst_2*2 #because image sizes are not the same.
 tform = transform.estimate_transform('projective', src_2, dst_2)tf_img = transform.warp(still2, tform.inverse)
ax[2].imshow(tf_img)
 ax[2].scatter(dst_2[:,0], dst_2[:,1], c='red', s=10)

就这样利用单应矩阵来进行变换图像,现在,我们不仅可以从另一个角度来看待球场上的玩家,而且仍然保留了原始角度的相关信息。

本文分享自微信公众号 - 小白学视觉(NoobCV),作者:小白

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-03-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 基于Opencv的图像单应性转换实战

    我们所常见的都是以这样的方式来处理图像:检测斑点,分割感兴趣的对象等。我们如何将它们从一种形式转换为另一种形式来处理这些图像呢?通过单应矩阵快速转换图像可以实现...

    OpenCV学堂
  • 基于OpenCV的图像翻转和镜像

    本期,我们将解释如何在Python中实现图像的镜像或翻转。大家只需要了解各种矩阵运算和矩阵操作背后的基本数学即可。

    小白学视觉
  • 基于OpenCV实战的图像处理:色度分割

    通过HSV色阶使用彩色图像可以分割来分割图像中的对象,但这并不是分割图像的唯一方法。为什么大多数人偏爱色度而不是RGB / HSV分割?

    小白学视觉
  • 从 Pokémon Go 谈 AR 游戏开发

    Pokémon Go一出,新鲜的玩法、经典的IP效应让这款使用了Unity以及AR技术的手游火遍了“大洋”南北。可惜的是这款新鲜的游戏还没有惠及中国市场的玩家们...

    WeTest质量开放平台团队
  • 单应性矩阵应用-基于特征的图像拼接

    前面写了一篇关于单应性矩阵的相关文章,结尾说到基于特征的图像拼接跟对象检测中单应性矩阵应用场景。得到很多人留言反馈,让我继续写,于是就有这篇文章。这里有两张照片...

    OpenCV学堂
  • [O'Reilly:学习OpenCV(中文版)]

    《学习OpenCV》将你置身于迅速发展的计算机视觉领域。《学习OpenCV》作者是免费开源0penCV的发起人,《学习OpenCV》为你介绍了计算机视觉,例证了...

    用户3157710
  • Pokémon GO国内玩不了?腾讯AR专家教你自己做!

    Pokémon Go一出,新鲜的玩法、经典的IP效应让这款使用了Unity以及AR技术的手游火遍了“大洋”南北。可惜的是这款新鲜的游戏还没有惠及中国市场的玩家们...

    WeTest质量开放平台团队
  • 如何用OpenCV制作一个低成本的立体相机

    AR/VR的兴起,让我们喜欢上了3D电影和视频,前提是你需要戴上一副3D眼镜才能感受到3D效果。那么,它是如何工作的?当屏幕只是平面时,我们如何体验3D效果?其...

    小白学视觉
  • OpenCV中基于Retinex的图像增强实现

    美国物理学家埃德温∙兰德(Edwin Land) 在 1971 年提出一种被称为色彩的理论,并在颜色恒常性的基础上提出的一种图像增强方法。Retinex 理论认...

    zy010101
  • 基于OpenCV的实用图像处理操作

    图像处理适用于图像和视频。良好的图像处理结果会为后续的进一步处理带来很大的帮助,例如提取到图像中的直线有助于对图像中物体的结构进行分析,良好的特征提取会优化深度...

    小白学视觉
  • OpenCv-Python 开源计算机视觉库 (一)

    1999年,英特尔的 Gary Bradsky 发起了 OpenCv 项目,并于 2000 年发布第一个版本。2005年,OpenCv 被首次应用在 Stanl...

    我是一条小青蛇
  • 大伽带你入门OpenCV Python计算机视觉

    【OpenCV学堂】原创文章作者 贾志刚 推出 OpenCV Python系列视频教程,全套视频教程基于OpenCV Python语言API讲述,简单易学,内容...

    OpenCV学堂
  • 基于OpenCV修复表格缺失的轮廓--如何识别和修复表格识别中的虚线

    通过扫描或照片对文档进行数字化处理时,错误的设置或不良的条件可能会影响图像质量。在识别的情况下,这可能导致表结构损坏。某些图标的处理结果可能只是有轻微的瑕疵,甚...

    小白学视觉
  • 基于深度学习的图像风格转换

    距离上次写博客已经好久好久好久了,真是懈怠的生活节奏,整天混吃等死玩游戏,前些日子做毕业设计时总算又学了点新东西。学了一点深度学习和卷积神经网络的知识,附带着...

    欠扁的小篮子
  • 18本纸质书:OpenCV、Python和机器学习,总有一本适合你

    这次主页君蒙电子工业出版社赞助,为大家准备了6个三本:包含OpenCV类书籍四本,机器学习类书籍两本,每本书送出三份,一共十八个名额。这六种书籍都是干货满满的...

    企鹅号小编
  • 高能干货:OpenCV看这篇就够了,9段代码详解图像变换基本操作

    OpenCV是使用C++进行编写的、以BSD许可证开放源代码的、跨平台的计算机视觉库。它提供了上百种计算机视觉、机器学习、图像处理等相关算法,新版本的OpenC...

    华章科技
  • 干货 | OpenCV看这篇就够了,9段代码详解图像变换基本操作

    【导读】OpenCV是一个以BSD许可证开源的、跨平台的计算机视觉库。它提供了Python、C++、Java、Matlab等多种编程语言接口。它集成了很多计算机...

    AI科技大本营
  • 13行代码实现:Python实时视频采集(附源码)

    本文是《人脸识别完整项目实战》系列博文第3部分:程序设计篇(Python版),第1节《Python实时视频采集程序设计》,本章内容系统介绍:基于Python+o...

    数据饕餮
  • 【综合练习】C++ OpenCV实战---获取数量

    前阵子做了一个实战分享《【干货】C++ OpenCV案例实战---卡片截取(附代码)》,今天我们再把以前学习到的东西综合练习一下,做一个获取个数的小案例。

    Vaccae

扫码关注云+社区

领取腾讯云代金券