Этот фрагмент должен выполнить работу:
import numpy as np
from skimage import io, util
from skimage.feature.texture import greycomatrix, greycoprops
img = io.imread('fourbandimg.tif')
rows, cols, bands = img.shape
radius = 5
side = 2*radius + 1
distances = [1]
angles = [0, np.pi/2]
props = ['contrast', 'dissimilarity', 'homogeneity']
dim = len(distances)*len(angles)*len(props)*bands
padded = np.pad(img, radius, mode='reflect')
windows = [util.view_as_windows(padded[:, :, band].copy(), (side, side))
for band in range(bands)]
feats = np.zeros(shape=(rows, cols, dim))
for row in range(rows):
for col in range(cols):
pixel_feats = []
for band in range(bands):
glcm = greycomatrix(windows[band][row, col, :, :],
distances=distances,
angles=angles)
pixel_feats.extend([greycoprops(glcm, prop).ravel()
for prop in props])
feats[row, col, :] = np.concatenate(pixel_feats)
Образец изображения имеет 128 строк, 128 столбцов и 4 полосы (нажмите здесь , чтобы загрузить).В каждом пикселе изображения квадратная локальная окрестность размером 11 используется для вычисления матриц шкалы яркости, соответствующих пикселю справа и пикселю выше для каждой полосы.Затем для этих матриц вычисляются контраст , различие и однородность .Таким образом, у нас есть 4 полосы, 1 расстояние, 2 угла и 3 свойства.Следовательно, для каждого пикселя вектор признаков имеет 4 × 1 × 2 × 3 = 24 компонента.
Обратите внимание, что для сохранения количества строк и столбцов изображение было дополнено с использованием самого изображения, отраженного по краю.массива.Если этот подход не соответствует вашим потребностям, вы можете просто проигнорировать внешнюю рамку изображения.
В качестве заключительного замечания, запуск кода может занять некоторое время.
Демонстрация
In [193]: img.shape
Out[193]: (128, 128, 4)
In [194]: feats.shape
Out[194]: (128, 128, 24)
In [195]: feats[64, 64, :]
Out[195]:
array([ 1.51690000e+04, 9.50100000e+03, 1.02300000e+03,
8.53000000e+02, 1.25203577e+01, 9.38930575e+00,
2.54300000e+03, 1.47800000e+03, 3.89000000e+02,
3.10000000e+02, 2.95064854e+01, 3.38267222e+01,
2.18970000e+04, 1.71690000e+04, 1.21900000e+03,
1.06700000e+03, 1.09729371e+01, 1.11741654e+01,
2.54300000e+03, 1.47800000e+03, 3.89000000e+02,
3.10000000e+02, 2.95064854e+01, 3.38267222e+01])
In [196]: io.imshow(img)
Out[196]: <matplotlib.image.AxesImage at 0x2a74bc728d0>
Редактировать
Вы можете привести данные к типу, требуемому для greycomatrix
через NumPy uint8
или scikit-images img_as_ubyte
.