python之计算平面点集的的面积

news2024/11/29 12:47:00

在当今数据驱动的世界中,计算平面点集的最小外接轮廓面积被广泛应用于各种实际场景中。它是一项重要而魅力十足的任务,旨在找到一个最小的矩形或多边形区域,能够完全包围给定的离散点集。这个看似简单的问题背后隐藏着许多挑战,需要结合数学、计算几何和优化方法来解决。

计算平面点集的最小外接轮廓面积对很多领域具有重大意义。首先,在计算机视觉中,它是目标检测和图像分割等任务的关键步骤。通过确定目标物体的最小外接轮廓面积,我们可以更好地理解和描述物体的形状,从而实现更准确的目标识别和跟踪。在自动驾驶系统中,该技术可用于检测道路边缘或障碍物边界,从而帮助车辆规划路径并做出决策。此外,在工业制造、地理信息系统和城市规划等领域,计算点集的最小外接轮廓面积可以提供宝贵的空间分析和形状建模工具。

在过去的几十年里,研究者们积极探索计算平面点集最小外接轮廓面积的求解方法,并取得了重要的进展。早期的方法主要基于几何学原理,如旋转卡壳、凸包和分治策略等。这些传统的方法虽然在某些场景下表现良好,但对于复杂点集和大规模数据的处理存在一定限制。近年来,随着计算机性能的提升和数值优化算法的发展,一些新颖且高效的方法应运而生。

最近的研究工作集中在提高算法的效率和鲁棒性。基于机器学习的方法,如支持向量机(SVM)和人工神经网络,被引入以改善凸包计算的精度和速度。此外,通过多核处理、并行计算和GPU加速等技术,研究人员努力提高算法的运行效率,使其能够处理更大规模的点云数据。同时,深度学习技术的发展也为计算平面点集最小外接轮廓面积带来了新的可能性,例如使用卷积神经网络进行分割和轮廓估计。

值得一提的是,随着三维扫描技术的广泛应用,研究者们开始将计算平面点集最小外接轮廓面积推广到三维点云数据,并发展了一系列新的算法。这些算法旨在从复杂的三维场景中提取最小外接体积或曲面,具有很高的实用价值。

总结而言,计算平面点集最小外接轮廓面积是计算机视觉、图像处理和模式识别等领域中一个关键且挑战性的任务。通过求解这个问题,我们可以从离散的点集中提取出有价值的形状信息,为目标检测、自动驾驶和空间建模等应用提供强大的支持。随着技术的不断进步与创新,我们可以期待在这个领域看到更多令人激动的发展和突破。

下面介绍两个案例:

1、先计算凸包,再计算面积

凸包法是一种常用的方法来计算平面点集的最小外接轮廓面积。它基于数学几何原理,通过找到形成凸包的点集来估计最小外接轮廓面积。以下是凸包法的优点和缺点:

优点:

简单直观:凸包法的基本原理易于理解。它可以通过简洁的步骤将点集收束为一个多边形或凸多边形,容易在可视化和概念上表示。

准确性:当点集满足凸性时,凸包法能够提供精确的最小外接轮廓面积。这使得凸包法在许多实际情况下产生可靠的结果。

快速计算:相比其他复杂的算法,凸包法具有很高的计算效率。在点集规模较小时,凸包法通常能够在很短的时间内计算出最小外接轮廓面积。

适用广泛:凸包法适用于各种不同类型的点集,不论其分布是否均匀、是否存在噪声点等。因此,凸包法具有广泛的适用性,并且可以用于多个领域中的问题求解。

缺点:

复杂形状限制:凸包法在处理具有复杂形状的点集时可能存在局限性。由于凸包要求生成一个完全包围点集的凸多边形,因此对于非凸点集或存在内部空洞的点集,凸包法无法提供准确和合理的结果。

对噪声点敏感:凸包法对噪声点较为敏感。当点集中存在离群点或噪声点时,这些点可能会影响最终的凸包结果,导致外接轮廓面积计算不准确。

计算效率随规模增加:虽然凸包法在小规模点集上运行速度较快,但随着点集规模的增加,其计算效率可能迅速下降。对于大规模点集,凸包法的计算时间可能变得相当昂贵。

实现复杂性:尽管凸包法的基本原理简单易懂,但实现优化的凸包算法可能需要复杂的编程技巧和数据结构支持。这使得实施和调试凸包算法可能具有一定的挑战性。

综上所述,凸包法作为计算平面点集最小外接轮廓面积的一种常见方法,具有诸多优点。它简单直观、计算快速,并适用于各种情况。然而,它在处理复杂形状和存在噪声点的点集时可能存在一些局限性。因此,在实际应用中,我们需要根据问题的特点选择合适的方法或结合其他技术来解决具体的求解任务。


import numpy as np
from scipy.spatial import ConvexHull
import matplotlib.pyplot as plt

# 指定字体文件路径
import matplotlib.font_manager as fm
font_path = 'C:/Windows/Fonts/simhei.ttf'
prop = fm.FontProperties(fname=font_path)

# 定义椭圆上的点作为示例点集
points = np.array([[1, 0], [0.866, 0.5], [0.5, 0.866], [0, 1], [-0.5, 0.866], [-0.866, 0.5], 
                   [-1, 0], [-0.866, -0.5], [-0.5, -0.866], [0, -1], [0.5, -0.866], [0.866, -0.5]])

# 计算点集的凸包
hull = ConvexHull(points)

# 获取凸包的顶点坐标
vertices = hull.points[hull.vertices]

# 绘制凸包边界和点集
plt.plot(points[:,0], points[:,1], 'o', label='点集')
plt.plot(vertices[:,0], vertices[:,1], 'r--', lw=2, label='凸包边界')
plt.xlabel('x', fontproperties=prop)
plt.ylabel('y', fontproperties=prop)
plt.title('凸包与点集', fontproperties=prop)
plt.legend(prop=prop)
plt.grid(True)
plt.axis('equal')
plt.show()

# 计算凸包顶点形成的多边形的面积
area = hull.area

print("凸包顶点坐标:\n", vertices)
print("凸包面积大小:", area)

图片

凸包顶点坐标:

 [[-1.     0.   ]

 [-0.866 -0.5  ]

 [-0.5   -0.866]

 [ 0.    -1.   ]

 [ 0.5   -0.866]

 [ 0.866 -0.5  ]

 [ 1.     0.   ]

 [ 0.866  0.5  ]

 [ 0.5    0.866]

 [ 0.     1.   ]

 [-0.5    0.866]

 [-0.866  0.5  ]]

凸包面积大小:6.211565981473167(理论面积为np.pi)

注意:面积还有一定差距,可以取多一些点数,减小误差

2、把平面点集轮廓映射到图像中,通过opencv函数cv2.contourArea计算面积

这种方法也适用于内凹的点集,解决凸包法不能完成的任务。


import matplotlib.pyplot as plt
import cv2
import numpy as np

# 圆弧参数
radius = 1.0
start_angle = 0  # 起始角度,单位:度
end_angle = 270  # 终止角度,单位:度
num_points_arc = 1000  # 圆弧上的数据点个数

# 起始角度和终止角度转换为弧度
start_angle_rad = np.deg2rad(start_angle)
end_angle_rad = np.deg2rad(end_angle)

# 计算圆弧上点的极坐标
theta_arc = np.linspace(start_angle_rad, end_angle_rad, num=num_points_arc)
x_arc = 0+radius * np.cos(theta_arc)
y_arc = 0+radius * np.sin(theta_arc)

# 直线参数
line1_start_point = (0, 0)
line1_angle = start_angle_rad
line2_start_point = (0,0)
line2_angle = end_angle_rad

# 计算直线上的数据点
num_points_line = 1000  # 每条直线上的数据点个数
l=np.linspace(0, radius, num=num_points_line)

x_line1 = line1_start_point[0]+l*np.cos(line1_angle)
y_line1 = line1_start_point[1]+l*np.sin(line1_angle)

x_line2 = line2_start_point[0]+l*np.cos(line2_angle)
y_line2 = line2_start_point[1]+l*np.sin(line2_angle)

# 将数据点合并
X = [x_line1,x_arc,x_line2[::-1]]
Y = [y_line1,y_arc,y_line2[::-1]]

fig = plt.figure(figsize=(5, 5))
plt.rcParams['xtick.direction'] = 'in'  # 将x周的刻度线方向设置向内
plt.rcParams['ytick.direction'] = 'in'  # 将y轴的刻度方向设置向内
clist = ['blue', 'red', 'green', 'black', 'darkgreen', 'lime', 'gold', 'purple', 'green', 'cyan', 'salmon', 'grey',
             'mediumvioletred', 'darkkhaki', 'gray', 'darkcyan', 'violet', 'powderblue']

# for i in range(len(X)):
#     plt.plot(X[i],Y[i], c=clist[i%17])
# plt.tight_layout()
# plt.show()
# 创建空白图像
blank_image = np.zeros((1400, 1400), dtype=np.uint8)

#坐标变换
X_new=np.array(X).flatten()+radius
Y_new=-1*np.array(Y).flatten()+radius
# 转换为整型数组
X_shifted = np.array(X_new*700, dtype=np.int32)
Y_shifted = np.array(Y_new*700, dtype=np.int32)
# 绘制轮廓
points = np.column_stack((X_shifted, Y_shifted))
cv2.drawContours(blank_image, [points], contourIdx=0, color=255, thickness=3)

# 计算轮廓围成的面积
area = cv2.contourArea(points)/700/700

# 理论面积计算
theta_span = end_angle_rad - start_angle_rad
theoretical_area = 0.5 * radius * radius * theta_span

# 输出面积结果并与理论面积对比
print("轮廓围成的面积:", area)
print("理论面积:", theoretical_area)
print("面积差值:", area - theoretical_area)

# 显示图像
cv2.namedWindow('Contour Image',0)
cv2.imshow("Contour Image", blank_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

轮廓围成的面积:2.3565163265306124

理论面积:2.356194490192345

面积差值:0.0003218363382675449

图片

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

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

相关文章

034-第三代软件开发-自定义Slider(一)

第三代软件开发-自定义Slider(一) 文章目录 第三代软件开发-自定义Slider(一)项目介绍自定义Slider(一)总结一下 关键字: Qt、 Qml、 Slider、 position、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML(Qt Met…

基本微信小程序的体检预约小程序

项目介绍 我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,体检预约系统小程序被用户普遍使用,为方便用户…

linux-vsftp虚拟多用户

目录 1.安装vsftp 2.安装DB工具,能转化普通文件为vsftpd识别数据库加密文件 3.创建登录虚拟用户的名单 4.加密文件 6.需要修改vsftpd的配置文件 7.修改vsftp的配置文件,加载支持虚拟用户模式 8.针对不同用户开启不同权限 9.重启服务 10.测试 安…

[动态规划] (二) LeetCode 面试题 08.01.三步问题

[动态规划] (二) LeetCode 面试题 08.01.三步问题 文章目录 [动态规划] (二) LeetCode 面试题 08.01.三步问题题意解析解题思路1.状态表示2.状态转移方程3.初始化和填表顺序4.返回值 代码实现总结 面试题 08.01. 三步问题 题意解析 (1) 小孩可以跳1-3阶台阶 (2) 结果很大&…

革新技术,释放创意 :Luminar NeoforMac/win超强AI图像编辑器

Luminar Neo,一个全新的AI图像编辑器,正以其强大的功能和独特的创意引领着图像编辑的潮流。借助于最新的AI技术,Luminar Neo为用户提供了无限可能的图像编辑体验,让每一个想法都能被精彩地实现。 Luminar Neo的AI引擎强大而高效&…

035-第三代软件开发-Qt属性系统

第三代软件开发-Qt属性系统 文章目录 第三代软件开发-Qt属性系统项目介绍Qt属性系统目的属性与类成员使用声明属性的要求 动态属性属性和自定义类型总结一下 关键字: Qt、 Qml、 Q_PROPERTY 、 setProperty、 属性 项目介绍 欢迎来到我们的 QML & C 项目&a…

Winsows QT5.15安装教程——组件务必要选上Sources

文章目录 1 下载地址2 开始安装2.1 选择一个磁盘空间大的位置安装QT,安装完可能会占用30G以上的空间2.2 选择组件2.3 接下来进入傻瓜式安装 3 QT 组件一览3.1 “Preview”分类下的开发组件3.1.1 编译器模块。3.1.2 “Qt ”分类下的开发组件 1 下载地址 https://www…

双向链表的初步练习

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇: Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - :来于“云”的“羽球人”…

python项目之数学函数绘图软件(django)

项目简介 管理员用户: (1)个人信息管理:管理员用户可以通过此功能对自己的密码进行维护。 (2)用户信息管理:管理员用户通过此功能可以维护系统内注册用户的信息,比如可以对用户的姓…

NSS [鹤城杯 2021]EasyP

NSS [鹤城杯 2021]EasyP 直接给了源码 <?php include utils.php;if (isset($_POST[guess])) {$guess (string) $_POST[guess];if ($guess $secret) {$message Congratulations! The flag is: . $flag;} else {$message Wrong. Try Again;} }if (preg_match(/utils\.p…

CrossOver 23.6.0 虚拟机新功能介绍

CrossOver 23.6.0 Mac 此应用程序允许您运行为 Microsoft Windows 编写的程序&#xff0c;而无需实际安装操作系统。 CrossOver 23.6.0 Mac 包括一个 Windows 程序库&#xff0c;用于它可以运行的 Windows 程序。 您会发现非常流行的应用程序&#xff0c;例如 Microsoft Word…

【JavaEE】HTTP协议

HTTP协议 HTTP是什么?HTTP 协议格式HTTP 请求格式HTTP响应格式协议格式总结 HTTP 请求 (Request)认识 URLURL 基本格式 关于 URL encode认识 "方法" (method)1. GET 方法2. POST 方法 认识请求 "报头" (header) HTTP 响应详解认识 "状态码" (st…

JDK项目分析的经验分享

基本类型的包装类(Character放在最后) String、StringBuffer、StringBuilder、StringJoiner、StringTokenizer(补充正则表达式的知识) CharacterIterator、StringCharacterIterator、CharsetProvider、CharsetEncoder、CharsetDecoder(较难) java.util.function下的函数表…

word公式编辑器能计算吗 word怎么添加公式编辑器

word作为常用的办公软件&#xff0c;常与公式编辑器配合使用来写论文。但该如何在word中使用公式编辑器呢&#xff1f;本文将介绍word公式编辑器能计算吗&#xff0c;word怎么添加公式编辑器的相关内容。 一、word公式编辑器能计算吗 对于word公式编辑器能计算吗这个问题&am…

遇到的题目

第一个线程打印10次a ,第二个线程打印10次吧&#xff0c;第三个线程打印10次c&#xff0c;三个线程交替打印abc public class PrintABC {private static final Object lock new Object();private static int count 0;public static void main(String[] args) {Thread threadA…

nodejs+vue+elementui+express酒店管理系统

登录&#xff1a;运行系统后&#xff0c;进行登录&#xff0c;可使用本系统。 客房预定&#xff1a;此界面先通过条件查询客房信息&#xff0c;然后进行客房预定。对预定的客房还可以取消和支付操作。 信息查询&#xff1a;可查询所有的公告信息&#xff0c;点击公告名称&#…

【黑马程序员】mysql进阶再进阶篇笔记

64. 进阶-锁-介绍(Av765670802,P121) 为了应对不同场景 全局锁-所有表 表计锁 一张表 行级锁 一行数据 65. 进阶-锁-全局锁-介绍(Av765670802,P122) 66. 进阶-锁-全局锁-一致性数据备份(Av765670802,P123) 67. 进阶-锁-表级锁-表锁(Av765670802,P124) 读锁、写锁 68. 进阶…

List 3.5 详解原码、反码、补码

前言 欢迎来到我的博客&#xff0c;我是雨空集&#xff08;全网同名&#xff09;&#xff0c;无论你是无意中发现我&#xff0c;还是有意搜索而来&#xff0c;我都感到荣幸。这里是一个分享知识、交流想法的平台&#xff0c;我希望我的博客能给你带来帮助和启发。如果你喜欢我…

redis 常用方法

、进入redis redis-cli -p 6409 -h 192.168.0.100 -a q9pCeAEMAWEL 2、查询keys keys activity_mobile_* 3、赋值、查值、删除 set mykey 1 get mykey del mykey 4、批量删除 [milanredis-50-240 ~]$ redis-cli -p 6409 -h 192.168.0.100 -a q9pCeAEMAWEL keys abc* | xa…

小米机械键盘 TKL 开启预售:紧凑 87 键布局,到手 229 元

10 月 25 日消息&#xff0c;小米目前在电商平台上架了“小米机械键盘 TKL”&#xff0c;采用 87 键设计&#xff0c;支持蓝牙、有线、2.4G 连接&#xff0c;到手价为 229 元&#xff0c;最晚 11 月 3 日发货。 ▲ 图源 小米 该键盘采用简洁的黑色设计&#xff0c;紧凑 87 键布…