8

Ho utilizzato scikit-image per classificare le caratteristiche stradali con un certo successo. Vedi sotto: image processed by scikit-image. Sto avendo problemi a fare il prossimo passo che è quello di classificare le caratteristiche. Ad esempio, diciamo che queste funzionalità si trovano nella casella (600, 800) e (1400, 600).Estrazione degli attributi dalle immagini utilizzando l'immagine di Scikit

Il codice che sto usando per estrarre le informazioni sono:

from skimage import io, segmentation as seg 
color_image = io.imread(img) 
plt.rcParams['image.cmap'] = 'spectral' 
labels = seg.slic(color_image, n_segments=6, compactness=4) 

L'obiettivo è quello di avere un tavolo nella forma seguente:

Image, feature_type, starting_pixel, ending_pixel 
001 a    (600, 600),  (1300, 700) 
002 b    (600, 600),  (1100, 700) 
002 undefined  (700, 700),  (900, 800) 

feature_type sarebbe basato sui colori, idealmente le spalle sarebbero un colore, gli alberi e il pennello sarebbero un altro, ecc.

Come posso estrarre i dati di cui ho bisogno? (vale a dire che scikit rompe l'immagine in componenti diversi in cui conosco la posizione di ciascun componente, quindi posso passare ogni componente a un classificatore che identificherà l'aspetto di ciascun componente) Grazie!

+1

la tua domanda sembra vaga. Vuoi trovare il riquadro di delimitazione per ogni area caratteristica? se sì, vuoi che si sovrappongano o non si sovrappongano? Vuoi mappare le mappe delle caratteristiche su una griglia regolare sottoposta a downsampling? puoi chiarire? – fireant

+0

@fireant l'obiettivo finale se lo faccio sull'intera immagine o su un piccolo riquadro di delimitazione è identificare le caratteristiche in base ai "colori". Quindi la strada sarebbe (1), spalla (2), fosso 3), alberi (4), ecc. – dassouki

+1

Ma perché non basta tagliare l'immagine o la classificazione? Immagine di Scikit funziona con ndarray, puoi fare "color_image [600: 800,1400: 1600 ,:]". Sto interpretando male questo? – armatita

risposta

1

E 'la prima volta che provo quel pacchetto .. ho provato con un'immagine semplice e ottengo più o meno i risultati giusti:

smallimg.jpg

from skimage import io, segmentation as seg 
import matplotlib as plt 
import numpy as np 
color_image = io.imread('smallimg.jpg') 
labels = seg.slic(color_image, n_segments=4, compactness=4) 
for section in np.unique(labels): 
    rows, cols = np.where(labels == section) 
    print("Image="+str(section)) 
    print("Top-Left pixel = {},{}".format(min(rows), min(cols))) 
    print("Bottom-Right pixel = {},{}".format(max(rows), max(cols))) 
    print("---") 

uscita:

Image=0 
Top-Left pixel = 3,1 
Bottom-Right pixel = 15,18 
--- 
Image=1 
Top-Left pixel = 26,1 
Bottom-Right pixel = 34,18 
--- 
Image=2 
Top-Left pixel = 43,1 
Bottom-Right pixel = 52,16 
--- 
Image=3 
Top-Left pixel = 0,0 
Bottom-Right pixel = 59,19 
--- 

Si noti che il pixel più a destra non è esattamente ciò che intendo a causa del gradiente. L'ultimo segmento è lo sfondo bianco.

Ho provato con la tua immagine ma penso che dovrai ottenere la segmentazione giusta. Vorrei usare n_segments = 7 se vuoi ottenere le 6 immagini + lo sfondo.

Vedo anche nella documentazione sulla compattezza: "Questo parametro dipende fortemente dal contrasto dell'immagine e dalle forme degli oggetti nell'immagine.". Quindi quello che vuoi potrebbe essere difficile da raggiungere.

Se si stanno tracciando le sei immagini sull'immagine mostrata sopra, perché non si ottengono quelle coordinate quando si stampano le immagini anziché applicare la segmentazione al risultato finale?