繁体   English   中英

在python中从图像创建大型邻接矩阵

[英]Creating large adjacency matrix from image in python

我想从 python 中的图像(这么多顶点......以> 10 ^ 5个顶点的顺序)创建一个大的加权邻接矩阵。 相邻像素之间的权重是颜色渐变(我负责)。 通过迭代像素来完成它非常慢......它需要超过 4 分钟。 :-( 是否有任何图书馆可以在合理的时间内很好地做到这一点?

以下是我运行非常缓慢的代码:

def indToCoord(ind, w, h):
    x = ind % w
    y = (ind - x)/h
    return (x,y)

def isAdj(p1, p2, im):
    adj = []
    w, h = im.size
    x1, y1 = p1
    x2, y2 = p2
    if (x1, y1) == (x2, y2):
        return 0
    elif abs(x1 - x2) > 1:
        return 0
    elif abs(y1 - y2) > 1:
        return 0
    elif abs(x1 - x2) + abs(y1 - y2) >= 2:
        return 0

    return util.colorGradient(im, p1, p2)

def adjForPixel(pixels, p1, im):
    return [isAdj(p1,p2,im) for p2 in pixels]

# The following is the function I use to create an Adjacency Matrix from an image
def getAdjMatrix(im):
    width, height = im.size 
    pixels = [(x,y) for x in xrange(width) for y in xrange(height)]

    pixelAdjMatr = [adjForPixel(pixels, p, im) for p in pixels]
    return pixelAdjMatr

adj_matrix = getAdjMatrix(im)

谢谢!

Python模块/库NetworkX具有邻接矩阵实现。 它返回一个scipy矩阵

https://networkx.github.io/documentation/latest/reference/generated/networkx.linalg.graphmatrix.adjacency_matrix.html

import networkx as nx
import scipy as sp
g = nx.Graph([(1,1)])
a = nx.adjacency_matrix(g)
print a, type(a)

回报

(0, 0)  1 <class 'scipy.sparse.csr.csr_matrix'>

img_to_graph可以解决问题。 这创建了一个所谓的“连接矩阵”。 邻接矩阵是一个无处不在的重要术语, sklearn在这里的离开并不令人敬畏。

但是这个函数可以解决问题。 我发现networkx函数只对图形有用。 为了将图像从numpy数组转换为networkx图,您几乎可以减少为循环写入进行解释。 这是因为networkx库确实提供了优化的numpy->graph函数,但该函数假定numpy数组已经是一个邻接矩阵

对于任何合理大小的图像,这是一个已编译的-O3 --simd --omp仅循环方案,甚至可能受益于某些缓存优化策略(排除 python3 的numba即时编译器)。

这使得networkx回答了另一个问题。 我会继续在那里使用sklearn函数:

sklearn.feature_extraction.image.img_to_graph(your_img)  
# returns scipy.sparse.coo.coo_matrix

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM