现在,我有一个图像。我想生成一个加权图 G=(V,E),其中 V 是顶点集,E 是边集(图像中的每个像素作为图中的一个节点)。
但我不知道该怎么做。有谁能帮助我吗?最好是python。非常感谢。
问题补充
很抱歉我对问题的描述不够清楚。
我的目标是使用图像的像素作为节点的网络来建立网络,然后分析网络的性质以检测目标(可能)。
但在第一步中,我需要建立这个网络。我的问题是如何使用图像的像素(RGB)作为网络的节点来建立这个网络来分析图像。
这些节点的边缘可能基于它们的某些特征(位置、外观等)
所以,我只想知道如何建立这个网络?只是一些简单的例子。谢谢
我也在寻找很好的矢量化答案,但没有找到。最后,我自己做了这个。我的意图也是尽可能快地加快这些计算。
让我们从这张漂亮的 28 x 27 图像开始:
网络x
算法的基本原理是识别在右侧和下方具有同伴的单位像素的坐标。网络图的节点应该是任何可散列的对象,因此我们可以使用元组来标记它们。这很容易实现,但效率不高,因为它需要将
np.array
的项转换为元组:让我们看看它的外观:
图形
Networkx 完全用 Python 构建,在处理大数据(如数百万像素的图像)时运行缓慢。另一方面,Igraph 是用 C 语言构建的,但支持较少。文档不是那么详细,并且使用了内部可视化工具而不是 matplotlib。所以基本上
igraph
可能是一个复杂的选择,但如果你这样做,那将是性能上的巨大胜利。在实施算法之前,有一些必须知道的重要事实:igraph.add_vertices()
中处理其他内容,它将被重新索引为 0,1,2,... 并且所有索引的旧名称都保存在igraph.vs['name']
igraph.add_edges()
时不允许包含不存在的顶点索引(不同于 0,1,2,...)的边考虑到这些要求,减少图像尺寸是一个不错的选择,即将像素重命名为整数 0,1,2,... 现在我们开始:
还有我的草图说明了顶点名称的新顺序:
要求:
python-igraph
、pycairo
(用于绘图)。