Текстура изображения с лыжным магом - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь получить свойства текстуры из GLCM, который я создал, используя greycomatrix из skimage.feature.Мои входные данные - это изображение с несколькими полосами, и мне нужны свойства текстуры для каждого пикселя (в результате получается изображение с размерами cols x rows x (properties *bands)), поскольку это может быть достигнуто с помощью ENVI.Но я слишком новичок в этом, чтобы справиться с greycomatrix и greycoprops.Это то, что я пробовал:

import numpy as np
from skimage import io
from skimage.feature import greycomatrix, greycoprops

array = io.imread('MYFILE.tif')
array = array.astype(np.int64)
props = ['contrast', 'dissimilarity', 'homogeneity', 'energy', 'correlation', 'ASM']
textures = np.zeros((array.shape[0], array.shape[1], array.shape[2] * len(props)), np.float32)
angles = [0, np.pi / 4, np.pi / 2, 3 * np.pi / 4]
bands = array.shape[2]
for b in range(bands):
    glcm = greycomatrix(array[:, :, b], [1], angles, np.nanmax(array) + 1,
                        symmetric=True, normed=True)
    for p, prop in enumerate(props):
        textures[:, :, b] = greycoprops(glcm, prop)

К сожалению, это дает мне матрицу 1 x 4 на prop, которая, я полагаю, равна одному значению на угол для всего изображения, но это не то, что я хочу,Мне нужно это на пиксель, как contrast для каждого отдельного пикселя, вычисленного из его соответствующего окружения.Чего мне не хватает?

1 Ответ

0 голосов
/ 15 июня 2018

Этот фрагмент должен выполнить работу:

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>

Multispectral image

Редактировать

Вы можете привести данные к типу, требуемому для greycomatrix через NumPy uint8 или scikit-images img_as_ubyte.

...