8

Ich habe scikit-image verwendet, um Road-Features mit einigem Erfolg zu klassifizieren. Siehe unten: image processed by scikit-image. Ich habe Schwierigkeiten, den nächsten Schritt zu tun, um die Features zu klassifizieren. Nehmen wir an, diese Features befinden sich in der Box (600, 800) und (1400, 600). idealAttribute aus Bildern extrahieren mit Scikit-Image

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 auf Farben beruhen würde,:

Der Code, den ich die Informationen zu extrahieren bin mit ist:

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) 

Ziel ist eine Tabelle, in der folgenden Form zu haben, Schultern wären eine Farbe, Bäume und Pinsel wären andere, usw.

Wie kann ich die Daten extrahieren, die ich brauche? (d. h. have scikit zerbrich das Bild in verschiedene Komponenten, wo ich den Ort jeder Komponente kenne. Ich kann dann jede Komponente an einen Klassifizierer übergeben, der die einzelnen Komponenten identifiziert) Danke!

+1

Ihre Frage scheint vage. Möchten Sie die Begrenzungsbox für jeden Funktionsbereich finden? Wenn ja, möchten Sie, dass sie sich überschneiden oder nicht überlappen? Möchten Sie die Feature-Maps auf einem heruntergerechneten regulären Raster zuordnen? könntest Du das erläutern? – fireant

+0

@fireant das Endziel, ob ich es auf das ganze Bild oder auf eine kleine Bounding-Box macht, ist die Merkmale auf der Grundlage der "Farben" zu identifizieren. Also Straße wäre (1), Schulter (2), Graben 3), Bäume (4), etc .. – dassouki

+1

Aber warum schneiden Sie nicht nur das Bild oder die Klassifizierung? Scikit Image funktioniert mit ndarray, du kannst "color_image [600: 800,1400: 1600 ,:]" machen. Ich interpretiere ich das schlecht? – armatita

Antwort

1

Es ist das erste Mal, dass ich das Paket versuchen .. ich mit einem einfacheren Bild versucht, und ich mehr oder weniger die richtigen Ergebnisse erhalten:

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("---") 

Ausgang:

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

Beachten Sie, dass die am weitesten rechts liegenden Pixel nicht genau das ist, was ich wegen der Steigung meine. Das letzte Segment ist der weiße Hintergrund.

Ich habe versucht mit Ihrem Bild, aber ich denke, Sie müssen die Segmentierung richtig machen. Ich würde n_segments = 7 verwenden, wenn Sie die 6 Bilder + Hintergrund erhalten möchten.

Ich sehe auch in der Dokumentation über die Kompaktheit: "Dieser Parameter hängt stark vom Bildkontrast und von den Formen der Objekte im Bild.". Was Sie wollen, könnte schwierig sein.

Wenn Sie die sechs Bilder auf dem Bild darstellen, das Sie oben zeigen, warum erhalten Sie diese Koordinaten nicht, wenn Sie die Bilder plotten, anstatt Segmentierung auf das Endergebnis anzuwenden?