图片任意凸体区域识别

这个是通过数学方法【基于凸体的定义】实现假的图片识别,比如:我们在一个小区俯视图中,需要

通过点击图中的某个楼栋,需要得到这个楼栋的信息,比如我点击了15号楼,程序需要知道点的是15号楼。

而且支持图片的等比例缩放功能。这样可以满足实际中的图片拖动,放大缩小等等操作。

凸体的定义: 在凸几何中,凸集(convex set)是在凸组合下闭合的仿射空间的子集。更具体地说,在欧氏空间中,凸集是对于集合内的每一对点,连接该对点的直线段上的每个点也在该集合内。例如,立方体是凸集,但是任何中空的或具有凹痕的例如月牙形都不是凸集。

基于上面的凸体定义,实现方式如下:

1、首先采集需要识别的区域,比如在图中采集游轮的区域。



v2-8f02f2cfeeb2ec3e3cdab681b9721105_b.jpg


图1 采集游轮区域

假设采集的数据如下:

{"points":[{"x":475,"y":449},{"x":660,"y":439},{"x":626,"y":394},{"x":489,"y":399},{"x":493,"y":505},{"x":586,"y":515},{"x":594,"y":484}]};

注意: 此采集的点所构造的区域必须是一个凸体。

2、当用户点击图片时,判断用户的点击是否在此间的区域中。



v2-621f562842ac184d97f898356bf650f3_b.jpg


图二、判断所在区域

由上面采集的区域可构造一个凸型区域,假设用户点击了A点、B 点。现在如何判断A、B点与所构造区域的关系。

已知图形是由点R={a,b,c,d,e,f,g}依次链接所得。

1、判断A点是否在图形内部:

1)以a,b作为一条直线,判断A点与点R中除了a、b以为的所有点是否在同一侧。比如判断a,b所构造的直线下,A点与c点是否在直线的同一侧。若不在同一侧,说明A点一定不在图形中,若在同一侧,则判断A点与d点,依次下去,知道判断A点与g点为止。

2)、将a点换成b点,b换成c。执行1. 若一直判断都是true,则说明点A在图形中。否则表示在图形外。

经过上面的运行,可以得到A点在直线a,b下,与其他的cdefg都在同一侧,依次类推。在b、c直线下,在c、d直线下..... 在g、a直线下有A点与b、c、d、e、f都处于同一侧。故可以得到A点在图形内部。

而B点可以发现在直线d、e下,a点与B点处于直线的两侧。故在图形外部。


由此在多个图形下面,当然可以一个一个图形的去判断点与图的位置关系了



v2-6530f0391762d92b5d0f28c47b68578b_b.jpg


图三、多凸体情况下面的区域查找


最后附上我实现的代码:

gitee.com/pdycx/front.g

代码实现了凸体采集,已经应用。采集的时候会判断采集的图形是否凸体

### DBSCAN 算法用于检测非形状的簇 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的空间聚类算法,能够有效发现任意形状的数据簇,包括非形状的簇。它通过定义核心点、边界点以及噪声点来实现数据分组。 #### 核心概念 DBSCAN 的主要参数包括 `ε` 和 `MinPts`。其中: - **ε**: 定义邻域半径,在该范围内寻找邻居点。 - **MinPts**: 邻域内的最小点数阈值,决定某个点是否为核心点[^1]。 当满足条件的核心点被找到时,这些点会扩展形成一个簇。如果某些区域中的点密度较低,则会被标记为噪声点。 #### 处理非形状的机制 由于 DBSCAN 不依赖于预先设定的簇数量,并且其原理是基于点之间的密度连接性而非几何距离约束,因此非常适合处理具有复杂边界的非形状簇。具来说: - 如果两个点属于同一个高密度区域并通过路径相连,则它们将被分配到同一簇中,即使这个路径可能弯曲或呈现复杂的拓扑结构[^3]。 以下是 Python 中使用 scikit-learn 实现 DBSCAN 并应用于非形状数据的一个例子: ```python from sklearn.cluster import DBSCAN import numpy as np import matplotlib.pyplot as plt # 创建模拟数据集 X = np.array([[1, 2], [2, 2], [2, 3], [8, 7], [8, 8], [25, 80]]) # 初始化并运行 DBSCAN db = DBSCAN(eps=3, min_samples=2).fit(X) # 获取标签结果 labels = db.labels_ # 可视化结果 plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=50) plt.title('DBSCAN Cluster Results') plt.show() ``` 上述代码展示了如何利用 DBSCAN 对一组二维数据进行聚类分析。调整参数 `eps` 和 `min_samples` 能够显著影响最终的结果质量。 #### 数据预处理的重要性 值得注意的是,在应用任何涉及距离计算的聚类方法之前,建议先对原始特征向量执行标准化操作以消除不同测量单位带来的偏差问题。这一步骤有助于提高模型性能和鲁棒性。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值