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. 总结

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

嗯嗯,您学废了嘛?

用OpenCV进行透视变换相关推荐

  1. 文档扫描仪的构建——使用Python,OpenCV应用透视变换来获得图像的自顶向下的“鸟瞰图”

    使用Python,OpenCV应用透视变换来获得图像的自顶向下的"鸟瞰图" 1. 效果图 2. 应用透视变换的步骤 3. 优化:矩形角点的获取 4. 源码 参考 这篇博客演示了如何 ...

  2. OpenCV:透视变换

    一.话说透视变换 透视变换是将图像从一个视平面投影到另外一个视平面的过程,所以透视变换也被称为投影映射(Projection Mapping).我们知道在图像的仿射变换中需要变换矩阵是一个2x3的两维 ...

  3. 【Python+OpenCV 图像透视变换 warpPerspective函数】

    Python+OpenCV 图像透视变换 warpPerspective函数 1.函数介绍 2.代码实例 3.实现效果 1.函数介绍 warpPerspective():对图像进行透视变换.简单来说, ...

  4. python opencv 实现透视变换——将侧视图进行正投影

    python opencv 实现透视变换--将侧视图进行正投影 这个方法可以将倾斜拍摄的四边形图片投影成矩形,在图像处理工程里经常要用,之前写过一个C语言版本的,可以搜我博客:透视变换 但是pytho ...

  5. 【OpenCV】透视变换 Perspective Transformation(续)

    透视变换的原理和矩阵求解请参见前一篇<透视变换 Perspective Transformation>.在OpenCV中也实现了透视变换的公式求解和变换函数. 求解变换公式的函数: [cp ...

  6. 【OpenCV】透视变换 Perspective Transformation

    透视变换的原理和矩阵求解请参见前一篇<透视变换 Perspective Transformation>.在OpenCV中也实现了透视变换的公式求解和变换函数. 求解变换公式的函数: Mat ...

  7. 使用opencv的透视变换裁剪倾斜人脸

    需求 人脸检测以后,有了检测框,需要将眼睛扶正,并裁剪,然后resize成需要的大小. 人脸检测结果如下: 其中蓝色是检测框,内部的红色框是我根据长宽扩展的正方形,绿色框是根据眼睛倾斜角度计算的正方形 ...

  8. 基于opencv实现透视变换(Python)

    透视变换 文章目录 透视变换 1.导入opencv等相关库,并封装一个显示图像的函数,方便后面显示图像 2.读取图片 3.设置输出图片的宽高 4.设置透视变换前后顶点位置✨✨✨ 5.调用opencv中 ...

  9. OPenCV 图像透视变换矫正

    图像透视变换矫正 Fu Xianjun. All Rights Reserved. 文章目录 前言 一.图像透视变换矫正是什么? 二.使用步骤 1.引入库 2.读入数据 总结 前言 随着人工智能的不断 ...

  10. 【OpenCV】透视变换应用——实现鸟瞰图与贴图

    透视变换是3D转换,透视变换的本质是将图像投影到一个新的视平面: 据此,我们可以使用透视变化来实现鸟瞰图和图形贴图的效果: 一.鸟瞰图 实现前: 实现效果: 1.准备一个空的mat对象 用于保存转换后 ...

最新文章

  1. 【Linux】【C/C++】十叉非完全树的构造和重构
  2. java变量数据类型_Java——变量和数据类型
  3. EasyStack一天连中五单,OpenStack新拐点显现
  4. XXI Open Cup. Grand Prix of Korea I. Query On A Tree 17 树剖 + 二分 + 树带权重心
  5. 使用C#和Excel进行报表开发(五)-操作单元格边框和颜色 【转】
  6. Eclipse使用技巧
  7. uni一t 说明书_不输特斯拉,站在UNI-T背后的长安「超级工厂」
  8. np.concatenate 函数的使用
  9. GPU/GPGPU架构(三十二)
  10. 给初学者的 RxJava2.0 教程 (九)
  11. 工程制图与计算机绘图实训任务书及参考资料,水利工程制图与计算机绘图实训探讨...
  12. Sublime Text 3.0汉化教程
  13. Windows 软件管理
  14. HDU 1429 bfs 状态压缩
  15. 人艰不拆,一句话毁掉小清新!
  16. HTML-零基础入门
  17. “碰一碰”版本的蓝牙键盘,来啦!
  18. 【老生谈算法】matlabAP近邻传播聚类算法源码——聚类算法
  19. jupyter文件自动保存为html,使用jupyter notebook将文件保存为Markdown,HTML等文件格式...
  20. 基于极限学习机的预测、图像降噪和回归

热门文章

  1. Selenium的下载
  2. 算法导论/第一部分_基础知识
  3. 关于JAVA调用企业微信审批流程的接口
  4. 利用 SSDP 协议生成 100 Gbps DDoS 流量的真相探秘
  5. Spring中重要的一些注解及其实现原理
  6. VoxCeleb1 数据集下载
  7. linux查看服务器连接数
  8. 【新手必读】Unreal Engine 4 UI入门教程(下)
  9. Bootstrap图标库的下载与使用
  10. win10 卡机卡死卡顿的真正原因!