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

重磅干货,第一时间送达

同形转换

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

单应性

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

在坐标标平面上:

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

from skimage.io import imread, imshowfrom skimage import transformimport matplotlib.pyplot as pltimport numpy as np

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

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

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

#source coordinatessrc = np.array([391, 100, 14, 271, 347, 624, 747, 298,]).reshape((4, 2))#destination coordinatessrc = np.array([100, 100, 100, 650, 650, 650, 650, 100,]).reshape((4, 2))#using skimage’s transform module where 'projective’ is our desired parametertform = transform.estimate_transform('projective', src, dst)tf_img = transform.warp(chess, tform.inverse)#plotting the transformed imagefig, 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)

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

下载1:OpenCV-Contrib扩展模块中文版教程
(0)

相关推荐

  • 这个操作可能不值钱,但却值得学习 | 【图片批量裁剪】

    前言 有一句叫:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已 这句话,在实际的应用中,让我体会很深,目前很多算法已经能到初步满足我们的需求,更多的时候是要花费大量的时间在处理数据上 ...

  • python+opencv图像处理(四十四)

    童年记忆中的爆米花,小时候只在过年的时候才能吃到,现在偶尔能在路边看到有在爆的,看到了总忍不住想买,虽然味道没什么变化,只是再吃不出来以前的幸福了. 长大了......心也大了...... 可是,实力 ...

  • Python之数据分析(三维立体图像、极坐标系、半对数坐标)

    文章目录 写在前面: 一.三维立体图像 1.三维线框 2.三维曲面 3.三维散点 二.极坐标系 三.半对数坐标 写在前面: import numpy as np import matplotlib.p ...

  • python+opencv图像处理(十)

    图像旋转 本篇主要利用opencv的转换函数warpAffine实现图像的平移和旋转. 1.图像旋转 图像旋转即是根据某个中心点进行旋转. 要进行旋转,要找到中心点,要知道旋转角度,opencv提供了 ...

  • python进阶—OpenCV之图像处理(一)

    文章目录 颜色空间转换 RGB色彩空间 HSV色彩空间 YUV色彩空间 简单的物体跟踪示例 HSV空间目标阈值选取 图像几何变换 图像的缩放 图像的位移 图像的旋转 图像的仿射 图像的投射 图像阈值( ...

  • python+opencv图像处理(八)

    无所谓,谁会爱上谁... 无所谓,不能天天更... 只要是,不要一直断... -----------------------------------我是可爱的分割线 图像平移的意思就是将图像沿着x轴. ...

  • python+opencv图像处理(十二)

    图像仿射变换和透视变换 天晴了...... 1.仿射变换 图像的仿射变换就是图像的旋转加上拉升,说直白点,就是把矩形变成平行四边形. 要把矩形变成平行四边行,只需要拉伸其四个角点就行了,事实上,只需要 ...

  • DL之HNN:基于HNN(subplot)将凌乱数字矩阵图像(模拟手写数字图片)实现转为最相近的阿拉伯数字

    DL:基于HNN将凌乱数字矩阵图像(模拟手写数字图片)实现转为最相近的阿拉伯数字 输出结果 代码设计 #DL:基于HNN将凌乱数字矩阵图像(模拟手写数字图片)实现转为最相近的阿拉伯数字 import ...

  • python+opencv图像处理(三)

    彩色图像拆分与合并 外面的世界很精彩,很缤纷,很鲜艳,很五颜六色...... 通常我们拍摄的图片都是彩色的,即RGB图像.自然界中的绝大多数颜色也都可以看作是由红(Red).绿(Green).蓝(Bl ...

  • python+opencv图像处理(十一)

    图像镜像 图像的镜像指的是将图像以某条线为中心进行镜像对换. 图像的镜像根据翻转的方向可分为水平镜像翻转.垂直镜像翻转和对角镜像翻转3种. 水平镜像翻转指的是将图像以y轴为中心进行左右镜像对换. 垂直 ...

  • opencv python智能车道检测,助力无人驾驶

    近年来,基于人工智能的车道检测算法得到了广泛的研究.与传统的基于特征的方法相比,许多方法表现出了优越的性能.然而,当使用具有挑战性的图像时,其准确率通常仍在低80%或高90%之间,甚至更低. 准确可靠 ...