热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PythonAlphaShape:基于点集估算图像区域的Alpha形状算法解析

本文探讨了基于点集估算图像区域的Alpha形状算法在Python中的应用。通过改进传统的Delaunay三角剖分方法,该算法能够生成更加灵活和精确的形状轮廓,避免了单纯使用Delaunay三角剖分时可能出现的过大三角形问题。这种“模糊Delaunay三角剖分”技术不仅提高了形状的准确性,还增强了对复杂图像区域的适应能力。

好的,这是个主意. Delaunay三角剖分将产生不加区别的大三角形.它也会有问题,因为只会生成三角形.

因此,我们将生成您可能称之为“模糊Delaunay三角剖分”的东西.我们将所有点都放入kd树中,对于每个点p,查看它的k个最近邻点. kd树让这个快.

对于这些k个邻居中的每一个,找到到焦点p的距离.使用此距离生成加权.我们希望附近的点比更远的点更受青睐,所以这里指数函数exp(-alpha * dist)是合适的.使用加权距离建立概率密度函数,描述绘制每个点的概率.

现在,从该分布中抽出很多次.将经常选择附近的积分,而不太经常选择更远的积分.对于绘制的点,记下为焦点绘制的次数.结果是加权图,其中图中的每条边连接附近的点,并根据选择对的频率进行加权.

现在,从权重太小的图表中剔除所有边缘.这些是可能没有连接的点.结果如下:

现在,让我们将所有剩余的边缘扔到shapely.然后我们可以通过缓冲它们将边缘转换为非常小的多边形.像这样:

使用覆盖整个区域的大多边形来区分多边形将产生用于三角测量的多边形.可能还要等一下.结果如下:

最后,剔除所有太大的多边形:

#!/usr/bin/env python

import numpy as np

import matplotlib.pyplot as plt

import random

import scipy

import scipy.spatial

import networkx as nx

import shapely

import shapely.geometry

import matplotlib

dat = np.loadtxt('test.asc')

xycoors = dat[:,0:2]

xcoors = xycoors[:,0] #Convenience alias

ycoors = xycoors[:,1] #Convenience alias

npts = len(dat[:,0]) #Number of points

dist = scipy.spatial.distance.euclidean

def GetGraph(xycoors, alpha=0.0035):

kdt = scipy.spatial.KDTree(xycoors) #Build kd-tree for quick neighbor lookups

G = nx.Graph()

npts = np.max(xycoors.shape)

for x in range(npts):

G.add_node(x)

dist, idx = kdt.query(xycoors[x,:], k=10) #Get distances to neighbours, excluding the cenral point

dist = dist[1:] #Drop central point

idx = idx[1:] #Drop central point

pq = np.exp(-alpha*dist) #Exponential weighting of nearby points

pq = pq/np.sum(pq) #Convert to a PDF

choices = np.random.choice(idx, p=pq, size=50) #Choose neighbors based on PDF

for c in choices: #Insert neighbors into graph

if G.has_edge(x, c): #Already seen neighbor

G[x][c]['weight'] += 1 #Strengthen connection

else:

G.add_edge(x, c, weight=1) #New neighbor; build connection

return G

def PruneGraph(G,cutoff):

newg = G.copy()

bad_edges = set()

for x in newg:

for k,v in newg[x].items():

if v['weight']

bad_edges.add((x,k))

for b in bad_edges:

try:

newg.remove_edge(*b)

except nx.exception.NetworkXError:

pass

return newg

def PlotGraph(xycoors,G,cutoff=6):

xcoors = xycoors[:,0]

ycoors = xycoors[:,1]

G = PruneGraph(G,cutoff)

plt.plot(xcoors, ycoors, "o")

for x in range(npts):

for k,v in G[x].items():

plt.plot((xcoors[x],xcoors[k]),(ycoors[x],ycoors[k]), 'k-', lw=1)

plt.show()

def GetPolys(xycoors,G):

#Get lines connecting all points in the graph

xcoors = xycoors[:,0]

ycoors = xycoors[:,1]

lines = []

for x in range(npts):

for k,v in G[x].items():

lines.append(((xcoors[x],ycoors[x]),(xcoors[k],ycoors[k])))

#Get bounds of region

xmin = np.min(xycoors[:,0])

xmax = np.max(xycoors[:,0])

ymin = np.min(xycoors[:,1])

ymax = np.max(xycoors[:,1])

mls = shapely.geometry.MultiLineString(lines) #Bundle the lines

mlsb = mls.buffer(2) #Turn lines into narrow polygons

bbox = shapely.geometry.box(xmin,ymin,xmax,ymax) #Generate background polygon

polys = bbox.difference(mlsb) #Subtract to generate polygons

return polys

def PlotPolys(polys,area_cutoff):

fig, ax = plt.subplots(figsize=(8, 8))

for polygon in polys:

if polygon.area

mpl_poly = matplotlib.patches.Polygon(np.array(polygon.exterior), alpha=0.4, facecolor=np.random.rand(3,1))

ax.add_patch(mpl_poly)

ax.autoscale()

fig.show()

#Functional stuff starts here

G = GetGraph(xycoors, alpha=0.0035)

#Choose a value that rips off an appropriate amount of the left side of this histogram

weights = sorted([v['weight'] for x in G for k,v in G[x].items()])

plt.hist(weights, bins=20);plt.show()

PlotGraph(xycoors,G,cutoff=6) #Plot the graph to ensure our cut-offs were okay. May take a while

prunedg = PruneGraph(G,cutoff=6) #Prune the graph

polys = GetPolys(xycoors,prunedg) #Get polygons from graph

areas = sorted(p.area for p in polys)

plt.plot(areas)

plt.hist(areas,bins=20);plt.show()

area_cutoff = 150000

PlotPolys(polys,area_cutoff=area_cutoff)

good_polys = ([p for p in polys if p.area

total_area = sum([p.area for p in good_polys])



推荐阅读
  • MySQL索引详解及其优化策略
    本文详细解析了MySQL索引的概念、数据结构及管理方法,并探讨了如何正确使用索引以提升查询性能。文章还深入讲解了联合索引与覆盖索引的应用场景,以及它们在优化数据库性能中的重要作用。此外,通过实例分析,进一步阐述了索引在高读写比系统中的必要性和优势。 ... [详细]
  • 深入探讨:Java 8 中 HashMap 链表为何选择红黑树而非 AVL 树
    深入探讨:Java 8 中 HashMap 链表为何选择红黑树而非 AVL 树 ... [详细]
  • PyCharm 作为 JetBrains 出品的知名集成开发环境(IDE),提供了丰富的功能和强大的工具支持,包括项目视图、代码结构视图、代码导航、语法高亮、自动补全和错误检测等。本文详细介绍了 PyCharm 的高级使用技巧和程序调试方法,旨在帮助开发者提高编码效率和调试能力。此外,还探讨了如何利用 PyCharm 的插件系统扩展其功能,以满足不同开发场景的需求。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • 本文深入探讨了 hCalendar 微格式在事件与时间、地点相关活动标记中的应用。作为微格式系列文章的第四篇,前文已分别介绍了 rel 属性用于定义链接关系、XFN 微格式增强链接的人际关系描述以及 hCard 微格式对个人和组织信息的描述。本次将重点解析 hCalendar 如何通过结构化数据标记,提高事件信息的可读性和互操作性。 ... [详细]
  • 在HDU 1166敌军布阵问题中,通过运用线段树数据结构,可以高效地计算指定区间的敌军数量。该算法不仅能够在限定的时间和内存条件下快速求解,还能够灵活应对动态变化的战场局势,为实时决策提供支持。 ... [详细]
  • 题目链接:POJ 2777。问题描述:给定一个区域,需要进行多次涂色操作,并在每次操作后查询某个区间内的不同颜色数量。解决方案:由于题目中颜色种类不超过30种,可以利用线段树的懒惰更新策略来高效处理这些操作。通过懒惰标记,避免了不必要的节点更新,从而显著提高了算法的效率。此外,该方法还能有效应对大规模数据输入,确保在合理的时间内完成所有操作。 ... [详细]
  • 如果程序使用Go语言编写并涉及单向或双向TLS认证,可能会遭受CPU拒绝服务攻击(DoS)。本文深入分析了CVE-2018-16875漏洞,探讨其成因、影响及防范措施,为开发者提供全面的安全指导。 ... [详细]
  • 每日精选Codeforces训练题:1119E(贪心算法)、821C(栈模拟)和645D(拓扑排序)
    题目涉及三种不同类型的算法问题:1119E(贪心算法)、821C(栈模拟)和645D(拓扑排序)。其中,1119E的问题背景是有n种不同长度的棍子,长度分别为2^0, 2^1, …, 2^(n-1),每种棍子的数量为a[i]。任务是计算可以组成的三角形数量。根据三角形的性质,任意两边之和必须大于第三边。该问题可以通过贪心算法高效解决,通过合理选择棍子组合来最大化三角形的数量。 ... [详细]
  • 在Java编程中,若需实现两个整数(例如2和3)相除并保留两位小数的结果,可以通过精确计算方法来达到预期效果。具体而言,可以利用BigDecimal类进行高精度运算,确保2除以3的结果准确显示为0.66。此外,还可以通过格式化输出来控制小数位数,确保最终结果符合要求。 ... [详细]
  • 题目:图像处理(HDU1828,计算周长并集,利用线段树与离散化技术进行扫描) ... [详细]
  • BZOJ 1835: 基站位置选择问题(动态规划与线段树优化) ... [详细]
  • Java集合框架特性详解与开发实践笔记
    Java集合框架特性详解与开发实践笔记 ... [详细]
  • 在多堆石子游戏中,通过分析Nim博弈策略,探讨了如何在限定时间和内存条件下实现最优解。本文详细研究了石子游戏中的数学原理和算法优化方法,旨在为参与者提供有效的策略指导。具体而言,文章讨论了不同堆数下的Nim值计算及其应用,帮助玩家在复杂的博弈环境中取得优势。 ... [详细]
  • 【并发编程】全面解析 Java 内存模型,一篇文章带你彻底掌握
    本文深入解析了 Java 内存模型(JMM),从基础概念到高级特性进行全面讲解,帮助读者彻底掌握 JMM 的核心原理和应用技巧。通过详细分析内存可见性、原子性和有序性等问题,结合实际代码示例,使开发者能够更好地理解和优化多线程并发程序。 ... [详细]
author-avatar
骏天天在线
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有