【问题标题】:Creating a network undirected weighted graph from a binary image for a minimum spanning tree从二值图像创建网络无向加权图以获得最小生成树
【发布时间】:2014-02-09 21:41:11
【问题描述】:

我正在尝试在裂缝的阈值图像中的像素之间创建最小生成树。当我消除噪音时,像素并不总是接触,所以我试图将它们连接到一个图表中。

Python 2.7 我对图像进行了阈值处理,因此低于阈值的所有内容都显示为白色,其他所有内容均为黑色。我一次对一个 65x65 窗口进行阈值处理,并将任何小于 10 像素的窗口设置为白色。

import networkx as nx
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import Image
import matplotlib
from cv2 import *

img=imread("IMG_1188.jpg")
gray = cvtColor(img, COLOR_BGR2GRAY)

threshold=35

width,height = gray.shape

for j in range( 0, height,65 ):
    for i in range( 0, width,65 ):

    gray[i:i+65,j:j+65]=inRange(gray[i:i+65,j:j+65],np.array([0]), np.array([35]))

    if np.sum(gray[i:i+65,j:j+65])<(2550):

        gray[i:i+65,j:j+65]=[0]

我创建了一个字典来保存白色像素的所有 x,y 位置,并在 networkx 中创建了节点。

pos={}
k=int(0)
G =nx.Graph()
for j in range( 0, height):
    for i in range( 0, width):
        if np.array(gray[i,j])>np.array(0):
            gray[i,j]=255
            pos[k]=(int(i),int(j))
            G.add_node(pos[k])          
            k=k+1

然后我检查了每个节点之间的每个欧几里德距离,如果它低于某个像素距离(比如 40),则绘制一条边。

k=1
for j in range (0,pos.len()):

    for i in range (k,pos.len()):   

        if np.sqrt(np.square(pos[i][0]-pos[j][0])+np.square(pos[i][1]-pos[j][1]))<=40:  
            G.add_edge(pos[i],pos[j],weight=(np.sqrt(np.square(pos[i][0]-pos[j][0])+np.square(pos[i][1]-pos[j][1]))))

    k=k+1

当我运行程序时,它告诉我节点没有位置。 (我用不同的参数运行它并收到不同的错误节点)

networkx.exception.NetworkXError: Node (814, 700) has no position.

任何帮助将不胜感激。

【问题讨论】:

  • 第二个和第三个代码 sn-ps 之间是否发生了其他事情?第 2 部分中的 pos 是字典,但在第 3 部分中,pos 是具有 len() 方法的数据类型,而字典没有。
  • 我在下面找到了根本问题,我将 pos.len() 更改为 len(pos) 没有问题。感谢您的帮助!

标签: python-2.7 networkx minimum-spanning-tree


【解决方案1】:

问题是我将 40 以内的节点的 x 位置作为边缘的起点

G.add_edge(pos[i],pos[j],weight=(np.sqrt(np.square(pos[i][0]-pos[j][0])+np.square(pos[i][1]-pos[j][1]))))

相反,我需要引用实际的节点标识符(我也使用绝对值,因为它是与平方和平方根相比的一种操作)

G.add_edge(i,j,weight=(np.fabs(window1[i][0]-window1[j][0])+np.fabs(window1[i][1]-window1[j][1])))

我还发现我应该使用 K-D 树来加速我的代码,因为这个 15000 点的代码需要 50 分钟左右。

【讨论】:

    猜你喜欢
    • 2016-01-07
    • 2017-09-14
    • 2018-10-28
    • 2011-02-17
    • 2017-04-18
    • 2019-12-13
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    相关资源
    最近更新 更多