8

Я использовал scikit-image, чтобы с легкостью классифицировать дорожные функции. См. Ниже: image processed by scikit-image. У меня возникли проблемы с следующим шагом, который заключается в классификации функций. Например, предположим, что эти функции расположены в коробке (600, 800) и (1400, 600).Извлечение атрибутов из изображений с использованием Scikit-image

код я использую для извлечения информации является:

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) 

Цель состоит в том, чтобы иметь таблицу в следующем виде:

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 бы на основе цветов, идеально плечи будут одного цвета, деревья и щетка будут другими и т. д.

Как я могу извлечь нужные данные? (то есть: scikit разбивает изображение на разные компоненты, где я знаю местоположение каждого компонента. Затем я могу передать каждый компонент в классификатор, который определит, каков каждый компонент) Спасибо!

+1

ваш вопрос кажется неопределенным. Вы хотите найти ограничительную рамку для каждой области функций? если да, хотите ли вы, чтобы они перекрывались или не перекрывались? Вы хотите отобразить карты функций в стандартную сетку с пониженной выборкой? вы можете уточнить? – fireant

+0

@fireant конечная цель, могу ли я сделать это на целом изображении или на маленькой ограничивающей рамке, чтобы идентифицировать функции, основанные на «цветах». Таким образом, дорога была бы (1), плечом (2), канавой 3), деревьями (4) и т. Д. – dassouki

+1

Но почему бы вам просто не нарезать изображение или классификацию? Scikit Image работает с ndarray, вы можете сделать «color_image [600: 800,1400: 1600 ,:]». Я интерпретирую это плохо? – armatita

ответ

1

Это первый раз, когда я пытаюсь этот пакет .. я попытался с более простым изображением, и я получаю более или менее правильные результаты:

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

Выход:

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

Обратите внимание, что самый правый пиксель не совсем то, что я имею в виду из-за градиента. Последний сегмент - белый фон.

Я пробовал с вашим изображением, но я думаю, вам нужно будет получить сегментацию вправо. Я бы использовал n_segments = 7, если вы хотите получить 6 изображений + фон.

Я также вижу в документации о компактности: «Этот параметр сильно зависит от контраста изображения и от форм объектов на изображении». То, чего вы хотите, может быть трудно достичь.

Если вы рисуете шесть изображений на изображении, который вы показываете выше, почему бы вам не получить эти координаты, когда вы рисуете изображения вместо того, чтобы применять сегментацию к конечному результату?