2016-11-20 9 views
1

Я использую SLIC-реализацию skimage для сегментирования изображений в суперпикселях. Я хотел бы использовать GLCM для извлечения дополнительных функций из этих суперпикселей для проблемы классификации. Эти суперпиксели не прямоугольные. В MATLAB вы можете установить пиксели в NaN, и они будут игнорироваться алгоритмом (link). Я мог бы использовать это, чтобы создать ограничивающие прямоугольники вокруг суперпикселей, а затем просто установить неиспользуемые пиксели в NaN.Python: взятие GLCM непрямоугольной области

Функция greycomatrix в skimage не работает полностью так же, как и реализация MATLAB. При настройке пикселей на NaN функция не работает на assert, чтобы проверить, все ли значения больше 0.

Доступна ли реализация Python, которая может работать с непрямоугольными ROI?

ответ

2

Этот вопрос вы должны пройти целочисленный массив в greycomatrix, но np.nan имеет тип float (обратите внимание на this thread для деталей). В результате вы не можете кодировать пиксели за пределами ROI как NaN.

Приближенный обходной путь для работы с непрямоугольной ROI была бы установка пиксели за пределами ROI, чтобы 0 и с помощью функции haralick из mahotas библиотеки. Эта функция возвращает 13 характеристик Haralick, извлеченных из четырех разных GLCM, соответствующих четырем двумерным ориентациям и конкретному значению параметра расстояния.

Из документации:

ignore_zeros может быть использовано, чтобы иметь функцию игнорировать любые нулевые многозначный пиксели (в качестве фона).

В заключение, необходимо маскировать те пиксели, которые выходят за пределы ROI, и установите ignore_zeros в True в вызове haralick.


DEMO

Для начала давайте создадим некоторый макет данных:

In [213]: import numpy as np 

In [214]: shape = (3, 4) 

In [215]: levels = 8 

In [216]: np.random.seed(2017) 

In [217]: x = np.random.randint(0, levels, size=shape) 

In [218]: x 
Out[218]: 
array([[3, 1, 6, 5], 
     [2, 0, 2, 2], 
     [3, 7, 7, 7]]) 

Затем мы должны удалить все нули из изображения, как при таком подходе интенсивность равна нулю уровень зарезервирован для пикселей вне ROI. Стоит отметить, что интенсивности слияния 0 и 1 в одну интенсивность 1 вводят неточности в результатах.

In [219]: x[x == 0] = 1 

In [220]: x 
Out[220]: 
array([[3, 1, 6, 5], 
     [2, 1, 2, 2], 
     [3, 7, 7, 7]]) 

Следующий этап состоит в определении маски для пикселей за пределами ROI (в данном примере игрушек, четыре угла изображения) и установив эти пиксели в 0.

In [221]: non_roi = np.zeros(shape=shape, dtype=np.bool) 

In [222]: non_roi[np.ix_([0, -1], [0, -1])] = True 

In [223]: non_roi 
Out[223]: 
array([[ True, False, False, True], 
     [False, False, False, False], 
     [ True, False, False, True]], dtype=bool) 

In [224]: x[non_roi] = 0 

In [225]: x 
Out[225]: 
array([[0, 1, 6, 0], 
     [2, 1, 2, 2], 
     [0, 7, 7, 0]]) 

Теперь мы можем выполнить функцию извлечения из КРНБА-й лет непрямоугольной ROI:

In [226]: import mahotas.features.texture as mht 

In [227]: features = mht.haralick(x, ignore_zeros=True) 

In [228]: features.size 
Out[228]: 52 

In [229]: features.ravel() 
Out[229]: array([ 0.18  , 5.4  , 0.5254833 , ..., 0.81127812, 
     -0.68810414, 0.96300727]) 

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

In [230]: mht.cooccurence(x, 0) 
Out[230]: 
array([[0, 1, 0, ..., 0, 1, 2], 
     [1, 0, 2, ..., 0, 1, 0], 
     [0, 2, 2, ..., 0, 0, 0], 
     ..., 
     [0, 0, 0, ..., 0, 0, 0], 
     [1, 1, 0, ..., 0, 0, 0], 
     [2, 0, 0, ..., 0, 0, 2]]) 

 Смежные вопросы

  • Нет связанных вопросов^_^