8

Używałem scikit-image do klasyfikowania funkcji dróg z pewnym sukcesem. Zobacz poniżej: image processed by scikit-image. Mam problem z kolejnym krokiem, który polega na klasyfikacji funkcji. Na przykład załóżmy, że te funkcje znajdują się w polu (600, 800) i (1400, 600).Wyodrębnianie atrybutów z obrazów przy użyciu obrazu Scikit

Kod używam wyodrębnić informacji jest:

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) 

Celem jest mieć tabeli w następującej formie:

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 byłaby oparta na kolorach, idealnie ramiona będą miały jeden kolor, drzewa i pędzel będą inne, itp.

Jak mogę wyodrębnić dane, których potrzebuję? (to znaczy: scikit rozbija obraz na różne komponenty, w których znam położenie każdego komponentu, a następnie mogę przekazać każdy komponent do klasyfikatora, który określi, jaki jest każdy składnik) Dzięki!

+1

Twoje pytanie wydaje się niejasne. Czy chcesz znaleźć obwiednię dla każdego obszaru funkcji? jeśli tak, czy chcesz, aby zachodziły na siebie lub nie nakładały się? Czy chcesz zmapować mapy obiektów na regularną siatkę z próbszą próbką? możesz wyjaśnić? – fireant

+0

@fireant celem końcowym, czy zrobię to na całym obrazie, czy na małym polu ograniczającym, jest identyfikacja funkcji opartych na "kolorach". Tak więc droga będzie (1), ramię (2), rów 3), drzewa (4), itp. – dassouki

+1

Ale dlaczego nie po prostu pokroisz albo obraz, albo klasyfikację? Scikit Image działa z ndarray, możesz zrobić "color_image [600: 800,1400: 1600 ,:]". Czy źle to interpretuję? – armatita

Odpowiedz

1

Jest to pierwszy raz spróbować tego pakietu .. Próbowałem z prostszej obrazu i uzyskać mniej lub bardziej odpowiednie wyniki:

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

wyjściowa:

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

Zauważ, że piksel najbardziej na prawo nie jest dokładnie tym, co mam na myśli z powodu gradientu. Ostatni segment to białe tło.

Próbowałem z Twoim obrazem, ale myślę, że będziesz musiał poprawnie dokonać segmentacji. Chciałbym użyć n_segments = 7, jeśli chcesz uzyskać 6 zdjęć + tło.

Widzę również w dokumentacji o zwartości: "Ten parametr zależy silnie od kontrastu obrazu i kształtów obiektów na obrazie.". To, czego chcesz, może być trudne do osiągnięcia.

Jeśli rysujesz sześć zdjęć na powyższym rysunku, dlaczego nie otrzymasz tych współrzędnych podczas drukowania obrazów zamiast stosowania segmentacji do wyniku końcowego?

Powiązane problemy