2014-02-09 45 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分鐘左右。