计算机视觉中的计算几何

news2024/11/24 3:55:46

计算几何领域出现于 20 世纪 70 年代,研究解决几何问题的数据结构和算法。这尤其包括确定图像内的拓扑结构,或者实际上是更高维的表示,例如点邻域,这可以帮助从数字图像数据等中导出几何意义[1]。

计算机视觉主要涉及静态或动态图像处理、理解和重建[3]。由于深度神经网络驱动的算法提供了令人印象深刻的、超人类的结果,目标识别(分类)、目标检测(分类和定位)和目标分割(分类、定位和边界检测)的计算机视觉应用领域一直受到欢迎。研究和工业界的关注不断增加。

毫不奇怪,考虑到这些重叠的兴趣领域,计算几何为计算机视觉及其对应领域计算机图形学领域提供了有用的概念。一组点的 Voronoi 图(又称为 Dirichlet 曲面细分、Voronoi 曲面细分或 Voronoi 划分)及其对偶点的 Delaunay 三角剖分(又称为 Delone 三角剖分)是此类有用概念的示例 [1, 2]。相关的计算机视觉应用包括人脸识别、人脸变形、图像合成和表面建模。在这篇博文中,我们演示了如何使用图像中人脸的 Delaunay 三角剖分/Voronoi 图作为人脸识别或人脸变形等应用的先驱。

让我们从定义开始。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 

1、Voronoi图

Voronoi图将域划分为一组点的最近邻域。考虑点集 P = {p₁, p2, …, pₙ} ∈ ℝ²。将 pᵢ, pⱼ ∈ P, pᵢ ≠ pⱼ 的平分线 BS(pᵢ, pⱼ) 定义为距离函数 d 中相对于 pᵢ, pⱼ 的等距轨迹,即 BS(pᵢ,pⱼ) = {q ∈ P : d( pᵢ,q) = d(pⱼ,q)}。令 pᵢ 相对于 pⱼ 的优势区域 D(pᵢ,pⱼ) 表示包含由 BS(pᵢ,pⱼ) 界定的 pᵢ 的区域。给定 P 的 pᵢ 的 Voronoi 区域定义为:

并且由到 pᵢ 的距离小于或等于到任何其他点 pⱼ ∈ P 的距离的所有点组成。一对 Voronoi 区域共享的边界称为 Voronoi 边。 Voronoi 边在 Voronoi 顶点相交。 P 的 Voronoi 图由下式给出:

其中 ∂R(pᵢ,P) 表示 R(pᵢ,P) 的边界。术语有界 Voronoi 图是指 VD(P) 与其基础域的合取。

图 1:欧几里得平面中不同点集的 Voronoi 图以及它们强加在(红色)示例点上的(蓝色)所谓的自然邻域关系

我们将自己限制在欧几里得平面域中的点,例如,参见图 1。然而,Voronoi 图定义可以推广到在没有来自流形 M 的噪声的情况下获取的点 P,即 P ⊂ M 的更一般情况。例如,请参见图 2,了解 3D 流形上点的固有(非欧几里得)Voronoi 图。

类似地,我们没有定义关于距离函数 d 的距离度量:Voronoi 图定义适用于跨流形 M 定义的任何测地距离度量。因此,例如,在欧几里德平面域情况下,标准欧几里德距离函数可用于计算 d(⋅,⋅)。

点集 P = {p₁, p2, …, pₙ} ∈ ℝ² 的 Delaunay 三角剖分由 VD(P) 的对偶图给出,Delaunay 三角剖分的每条边都与 VD(P) 的一条边相关联,即 Delaunay 边连接 VD(P) 中的(自然)相邻点。请参见图 3 的示例。 Delaunay 三角剖分通常存在于欧几里得距离度量以外的度量中,但不能保证存在或明确定义。

图 3:欧几里得平面中一组(黑色)点的(黑色)Delaunay 三角剖分及其对偶(红色)Voronoi 图(来源:维基百科)

我们参考 [1, 2],了解众多 Voronoi 图和 Delaunay 三角剖分变体(例如最远点和加权 Voronoi 图)的概述。出于我们的目的,我们可以将自己限制在它们的标准定义中。接下来我们看看他们的计算实现。

2、我们的实现

我们的实施基于以下核心要素:

  • Python 3(在 Juypter Notebook 环境中使用)
  • 适用于 Python 的 OpenCV 3.4.4.19 包装器包

为了确定面部标志,我们使用 Face++ 的演示功能。 使用你自己的示例图像使用此服务时,请考虑任何隐私问题。

如果你更喜欢基于 C++ 的实现,我们建议你查看 CGAL 及其 Voronoi 和 Delaunay 类。这些应该使以下 Python 编码“翻译”为 C++ 相当简单。 Python 编码的灵感来自 Satya Mallick 的博客文章,也可以在 GitHub 上找到。

除了 OpenCV 包之外,我们还使用 numpy 进行数组处理,使用 matplotlib 进行可视化:

辅助函数 rectContains 确定一个点是否落在矩形描述的图像域内,从而确定是否应将其视为图像 Delaunay 三角剖分的输入。

drawPoint 函数正是这样做的,即它在输入图像 img 上以彩色圆圈的形式显示面部标志 p。

voronoi函数使用subdiv成员函数getVoronoiFacetList来获取并随后根据输入图像img的初始OpenCV细分subdiv来绘制其Voronoi图。我们为 Voronoi 面可视化设置了随机配色方案。

类似地,delaunay函数在subdiv成员函数getTriangleList的帮助下确定并随后绘制输入图像img的初始Delaunay细分subdiv的三角形:

我们将这些函数应用于图 4 所示的示例图像。面部边界框和相应的面部标志由 Face++ 演示应用程序生成:

该演示服务返回一个 JSON 文件,其中包含服务在图像域内检测到的面部标志的 (x, y) 坐标等。上面显示了图 4 中输入图像的 JSON 提取。

图 4:原始样本图像(左)以及由 Face++ 生成的面部边界框(中)和相关的面部标志(右)

这些面部标志坐标代表 OpenCV 细分函数的输入点。我们通过使用标准 OpenCV imread 方法读取输入图像来开始展示生成。输入图像的矩形形状决定了存储在 rect 中的细分域。地标点以“Face2Points.txt”的形式上传到点数组中。然后,细分本身被实例化,并通过使用细分插入方法一一插入面部标志点来生成。

然后剩下要做的就是调用 delaunay 和 voronoi 函数传递输入图像及其新生成的细分。结果如图 5 所示:

图 5:输入图像的 Delaunay 三角剖分(左)及其对偶 Voronoi 图(右)

图 6 中的动画演示了输入图像一次一个面部标志点的 Delaunay 三角测量过程:

图 6:输入图像的 Delaunay 三角剖分动画

OpenCV subdiv 对象提供了各种用于检索 Delaunay 或 Voronoi 边和顶点的成员函数。详细信息我们参考OpenCV标准文档。这样,这些相当通用的几何结构的各种元素可以轻松地传递到后续图像处理或计算机视觉应用,例如面部分割、识别 [4,5,6] 和变形。

尽管我们在这篇博文中重点关注计算机视觉应用,但请注意,这些几何结构存在大量用例,其范围远远超出了计算机视觉领域,特别包括机器人导航等应用人工智能的其他领域。例如,请参阅[1,2]以获取灵感。

3、参考文献

[1] M. de Berg, O. Cheong, M. van Kreveld, and M. Overmars, Computational Geometry: Algorithms and Applications, 3rd edition, Springer, Berlin, Germany, 2010

[2] F. Aurenhammer, Voronoi Diagrams - A Survey of a Fundamental Geometric Data Structure, ACM Computing Surveys, 23(3), 1991, pp. 345–405

[3] R. Szeliski, Computer Vision: Algorithms and Applications, Springer, London, UK, 2011

[4] A. Cheddad, D. Mohamad, and A. A. Manaf, Exploiting Voronoi diagram properties in face segmentation and feature extraction, Pattern Recognition, Vol. 41, 2008, pp. 3842–3859

[5] M. A. Suhail, M. S. Obaidat, S. S. Ipson, and B. Sadoun, Content-based image segmentation, IEEE Int. Conf. Man Cybern. (SMC), Vol. 5, 2002

[6] M. Burge and W. Burger, Ear biometrics, in: A. Jain, R. Bolle, and S. Pankanti (eds.), Biometrics: Personal Identification in Networked Society, Kluwer Academic, Boston, MA, USA, 1999, pp. 273–285


原文链接:计算几何的机器视觉应用 - BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1647882.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用傅里叶变换公式理解camera raw中的纹理和清晰度的概念(可惜的是camera raw的计算公式应该不会是这个傅里叶变换,只能说类似于这里的效果)

知乎说:在Adobe官方的解释中,就像图片可以分解成彩色通道(如:红绿蓝通道),同样的,图片也可以分解成不同的频率,一张图片可以是由高频,中频和低频组成,例如&am…

500 Internal Server Error问题

总结 mysql语句有问题 #前端报错#后端报错 SQL错误,sql的where条件不全 delete from dish.flavor where dish.id#修改一番 #将in加上即可

如何在CentOS部署青龙面板并实现无公网IP远程访问本地面板

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

uniapp/微信小程序实现加入购物车点击添加飞到购物车动画

1、预期效果 2、实现思路 每次点击添加按钮时,往该按钮上方添加一个悬浮元素,通过位移动画将元素移到目标位置。 1. 为每个点击元素设置不同的class,才能通过uni.createSelectorQuery来获取每个元素的节点信息; 2. 添加一个与…

websevere服务器从零搭建到上线(一)|阻塞、非阻塞、同步、异步

文章目录 数据准备(阻塞和非阻塞)、数据读写(同步和异步)小总结(陈硕老师的总结) 知识拓展同步执行实例异步编程实例 八股 数据准备(阻塞和非阻塞)、数据读写(同步和异步) 无论是什么样的IO都包含两个阶段:数据准备和数据读写。 我们的网络IO…

Redis教程——主从复制

在上篇文章我们学习了Redis教程——管道,这篇文章学习Redis教程——主从复制。 主从复制 为了数据更加安全可靠,在实际的项目中,肯定是有多个Redis服务,主机Redis以写为主,从机Redis以读为主,当主机Redis…

什么年代了,还在拿考勤说事

最近,看到了某公司的一项考勤规定:自然月内,事假累计超过3次或者累计请假时间超过8小时的,不予审批,强制休假的按旷工处理。 真的想吐槽,什么年代了,还在拿考勤说事,这是什么公司、什…

国内游戏公司Q1净利润大增40%以上,神州泰岳增幅65.62%

易采游戏网5月7日消息,近日多家国内知名游戏公司公布了其2024年第一季度的财务报告,其中净利润大增40%以上的数据引起了市场的广泛关注。这一业绩表现不仅远超市场预期,也再次证明了国内游戏行业的强劲增长势头。 据了解,这些游戏…

react【实用教程】 搭建开发环境(2024版)Vite+React (官方推荐)

以项目名 reactDemo为例 1. 下载脚手架 在目标文件夹中打开命令行 npm create vite2. 安装项目依赖 cd reactDemo npm i若安装失败,则修改下载源重试 npm config set registry https://registry.npmmirror.com3. 启动项目 npm run dev4. 预览项目 浏览器访问 http…

vue 百度地图点击marker修改marker图片,其他marker图片不变。

直接上代码 marker.name tag;marker.id i; //一定要设置id,我这里是设置的循环key值,要唯一性。map.addOverlay(marker);let pointAIcon2 new BMapGL.Icon(require("../xxxxx.png"), new BMapGL.Size(36, 52));let pointAIcon1 new BMapGL.I…

翔云优配官网美股市场分析问界回应M7事故四大疑问

问界再次新M7 Plus山西高速事故。 4月26日下午,山西运城曾有一辆问界新M7 Plus车辆(以下简称“事故车辆”)在高速行驶时和一辆高速洒水车追尾,碰撞后车辆起火,造成三人遇难,该事故引发了广泛关注。 翔云优配以其专业的服务和较低的管理费用在市场中受到不少关注。该平台提供了…

管理能力学习笔记九:授权的常见误区和如何有效授权

授权的常见误区 误区一:随意授权 管理者在授权工作时,需要依据下属的能力、经验、意愿问最自己:这项工作适合授权给Ta做吗?如果没有,可以通过哪些方法进行培训呢? 误区二:缺乏信任 心理暗示…

Photoshop中选区工具的应用

Photoshop中选区工具的应用 前言Photoshop中选区工具的基本操作创建选区的工具及方法选择、取消、隐藏选区选区的增加、减少选区的应用变换扩大选取与选取相似 Photoshop中采用快速选择工具来创建选区Photoshop中采用色彩范围命令来创建选区Photoshop中采用快速蒙版来创建选区P…

UV胶是什么材料制成的?

UV胶是一种特殊的胶水,由丙烯酸酯单体、活性稀释剂、光引发剂、助剂等材料制成的。它是指在紫外线照射下能够迅速固化的胶水。UV胶的主要成分是丙烯酸酯单体,它在没有紫外线照射时是液体状态,但一旦受到紫外线照射,就会迅速发生聚…

电脑如何查看一段时间内是否被人使用过?

前言 有时候我们可能会担心别人未经许可使用我们的电脑。为了确保自己不在场时电脑是否被使用过,以下两种方法可能会帮到你 第一种方法 WinX打开事件查看器。像WinX能快速打开很多东西,比如安装的应用(可以进行软件的删除),设备管理器&…

生成requirements.txt文件

前言 对于Python项目,生成和使用requirements.txt是十分必要的。通过requirements.txt可以一次性保存和安装项目所需要的所有库。尤其是在复现github上的实验代码时。 方法1 常用的命令 pip freeze > requirements.txt然而这种方法并不好用,有时会…

影响项目成功的六个“致命”错误

项目经理作为项目的负责人,肩负着巨大的责任和挑战。他们需要具备专业知识、出色的综合管理能力以及敏锐的洞察力,以便在项目执行过程中及时关注项目动态,处理好各种问题,并避免那些可能影响项目实施的致命错误。 一、缺乏明确的…

社交媒体数据恢复:华为畅连

尊敬的用户您好,以下是关于社交软件华为畅连的聊天记录数据恢复教程。在华为手机中,我们可以通过华为云服务和第三方软件来恢复删除的聊天记录。以下是详细的步骤: 第一步:登录华为云服务 请在您的华为手机上找到并打开“云服务”…

Python实用记录(十六):PyQt/PySide6联动VSCode便捷操作指南

文章目录 一、安装vscode和配置pyside6环境二、安装vscode扩展三、扩展配置编辑四、编辑运行 一、安装vscode和配置pyside6环境 这一步默认已经通过了 二、安装vscode扩展 三、扩展配置编辑 四个地方需要修改;rcc路径、uic路径、designer.exe路径 uic.exe 用于将…

libcity笔记:libcity/utils/utils.py

1 get_logger 2 set_random_seed def set_random_seed(seed):"""重置随机数种子Args:seed(int): 种子数"""random.seed(seed)#设置 Python 内置的随机数生成器的种子np.random.seed(seed)#设置 NumPy 的随机数生成器的种torch.manual_seed(see…