2014-02-09 3 views
0

임계 값이 지정된 균열 이미지의 픽셀 사이에 최소 스패닝 트리를 만들려고합니다. 노이즈를 제거 할 때 픽셀이 항상 만지는 것은 아니므로 그래프에 연결하려고합니다.최소 스패닝 트리의 이진 이미지에서 네트워크 가중치가있는 그래프 만들기

파이썬 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. 

어떤 도움을 주시면 감사하겠습니다. 문제는 제가

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])))) 

대신 I 실제 노드 식별자를 참조 할 필요 에지의 시작 40 내에 있었던 노드의 x 위치를 참조 하였다

+0

두 번째 코드 조각과 세 번째 코드 조각 사이에 다른 점이 있습니까? 두 번째'pos'는 사전이지만, 세 번째 부분에서 pos는 가지고 있지 않은'len()'메소드가있는 데이터 유형입니다. – Bonlenfum

+0

아래의 근본 문제를 발견하고 문제없이 pos.len()을 len (pos)으로 변경했습니다. 당신의 도움을 주셔서 감사합니다! – user3290696

답변

0

(I은 또한 이후의 절대 값을 사용 또한 나는 15000 개 포인트에 대해이 코드로, 내 코드를 가속화하는 KD 트리를 사용한다는 것을 발견했다 제곱과 제곱근 대 한 작업을)

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

50 분 정도 걸렸다이다.

관련 문제