2014-02-09 51 views
0

我试图在阈值图像的裂缝中的像素之间创建最小生成树。当我去除噪点时,像素并不总是接触,所以我试图用图形连接它们。从最小生成树的二值图像创建网络无向加权图

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] 

我创建了一个dict来保存网络x中所有白色像素的x,y pos和创建的节点。

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. 

任何帮助,将不胜感激。

+0

第二个和第三个代码段之间是否还有其他事情发生?在第二个'pos'是一个字典,但在第三部分中,pos是一个带有'len()'方法的数据类型,它们没有字典。 – Bonlenfum

+0

我发现了下面的根问题,并将pos.len()更改为len(pos),没有问题。谢谢你的帮助! – user3290696

回答

0

问题是我被引用该是内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])))) 

相反,我需要引用的实际节点标识符的开始节点的x位置(I还因为它使用绝对值是一个操作VS平方和的平方根)

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

而且我发现,我应该使用KD树来加快我的代码,因为这代码15000点花50分钟左右。