Как создать собственный skimage.future.graph.rag, который предоставляется в качестве входных данных для cut_normalized и ncut? - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь создать пользовательский граф смежности с помощью RAG, но во всех примерах создание графика только с использованием rag = graph.rag_mean_color(img, labels)

Я не хочу использовать эту функцию и хочу определить веса с помощью моего пользовательскогомеры.Поэтому я написал следующий код

labels1 = segmentation.slic(img_i.reshape(img.shape[0],img.shape[1]), compactness=30, n_segments=200)
out1 = color.label2rgb(labels1, img_i.reshape(img.shape[0],img.shape[1]), kind='avg')
plt.axis('off')
plt.imshow(out1)
print(labels1.shape)

enter image description here

...

 g_seg = graph.rag.RAG() 
    for ix in range(0,img.shape[0]):
        for iy in range(0,img.shape[1]):
            idx = ix*img.shape[1] + iy
            g_seg.add_node(idx,labels=[labels_slic[idx]]) 
    win_rad = 7 
    for i in range(0,img.shape[0]):
        for j in range(0,img.shape[1]):
            for ii in range(-int(win_rad),int(win_rad)):
                for jj in range(-int(win_rad),int(win_rad)):
                    if i+ii>0 and i+ii<img.shape[0] and j+jj>0 and j+jj<img.shape[1]: 
                        idx = i*img.shape[1] + j
                        idc = (i+ii)*img.shape[1] + (j+jj)
                        w_tx = g_tx[idx][idc]['weight']
                        w_ic = g_ic[idx][idc]['weight']
                        g_seg.add_edge(idx, idc, weight=(w_tx*w_ic))

Но при использовании этого графика для нормализованного разрезаЯ получаю неправильный вывод

labels3 = graph.cut_normalized(labels1, g_seg,5.0,10)

enter image description here

Итак, я понимаю, что при создании графика я разрушаю особую структуру изображения, потому что я взялузлы - 1D массив, отбрасывающий их 2D координаты. Так что мне нужна помощь в понимании того, как я могу создать график, который сохраняет 2D-структуру изображения без изменений и дает результаты, которые мы получаем при rag = graph.rag_mean_color(img, labels)

1 Ответ

0 голосов
/ 10 марта 2019

Вы можете создать свою собственную версию RAG с вашими собственными весами между соседними узлами, например:

from skimage.future.graph import RAG
import numpy as np

def rag(image, labels):
   #initialize the RAG
   graph = RAG(labels, connectivity=2)

   #lets say we want for each node on the graph a label, a pixel count and a total color 
   for n in graph:
       graph.node[n].update({'labels': [n],'pixel count': 0,
                             'total color': np.array([0, 0, 0],
                             dtype=np.double)})
   #give them values
   for index in np.ndindex(labels.shape):
       current = labels[index]
       graph.node[current]['pixel count'] += 1
       graph.node[current]['total color'] += image[index]

   #calculate your own weights here
   for x, y, d in graph.edges(data=True):
       my_weight = "do whatever"
       d['weight'] = my_weight

   return graph
  • image: ваше входное изображение
  • метки: метки длякаждый пиксель изображения

Вы также должны проверить исходный код graph.rag_mean_color. Приведенный выше код основан на этом. rag_mean_color исходный код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...