Черное пространство на изображении GLCM

Я пытаюсь рассчитать некоторые текстурные измерения, используя GLCM, описанную Хараликом (энергия, однородность и т. д.) для серии 4-х полосных (R, G, B, NIR) аэрофотоснимков, которые у меня есть. Я пробовал это на подмножестве, но в итоге получил изображение, которое в основном пустое. Насколько я понимаю, это связано с оттенками серого и параметром levels, но я не могу этого понять.

Моя дата очень велика (несколько ГБ), поэтому я пытаюсь быть эффективным, используя модуль RIOS (считывает изображение в виде массива 400400nbands numpy, обрабатывает данные и записывает в выходное изображение).

Мою сцену ввода можно найти здесь (200 МБ ).

Мое выходное изображение выглядит так (это может быть трудно увидеть, поскольку черные пиксели очень маленькие):

выход

Мой код:

#Set up input and output filenames
infiles = applier.FilenameAssociations()
infiles.image1 = "infile.tif"

outfiles = applier.FilenameAssociations()
outfiles.outimage = "outfile.tif"

controls = applier.ApplierControls()
controls.progress = cuiprogress.CUIProgressBar()
# I ultimately want to use a window here
# which RIOS easily allows you to set up.
# For a 3x3 the overlap is 1, 5x5 overlap is 2 etc
#controls.setOverlap(4)

def doFilter(info, infiles, outfiles, controls=controls):
    grayImg = img_as_ubyte(color.rgb2gray(infiles.image1[3]))
    g = greycomatrix(grayImg, distances=[1], angles=[0, np.pi/4, np.pi/2, 3*np.pi/4], symmetric=True, normed=True)
    filtered = greycoprops(g, 'energy')
    # create 3d image from 2d array
    outfiles.outimage = numpy.expand_dims(filtered, axis=0)


applier.apply(doFilter, infiles, outfiles, controls=controls)

Очевидно, что здесь что-то не так, поскольку мой вывод не такой, как я ожидаю. Я предполагаю, что это связано с параметром «уровни». Мне указали на объяснение здесь: Черная линия в результате GLCM что хорошо объясняет параметр, но я не могу улучшить свой результат.

Может ли кто-нибудь объяснить мне, почему мой результат выглядит так, как показано, и как я могу это исправить?


person Nathan Thomas    schedule 06.04.2017    source источник
comment
Ваше изображение бинарное, все интенсивности пикселей равны 0 или 255. Выполните np.unique(<your_image>), чтобы убедить себя. GLCM для такого изображения будет иметь только четыре ненулевых элемента.   -  person Tonechas    schedule 07.04.2017
comment
numpy.unique yields [ 21 22 23 24 25 26 27 28 29 30 3........ 186 187 188 189 190 191 192 193 194 195 196 197 198]   -  person Nathan Thomas    schedule 07.04.2017
comment
Я запустил этот код: import numpy as np from skimage import io x = io.imread('https://i.stack.imgur.com/EyCI1.png') np.unique(x) и получил: array([ 0, 255], dtype=uint8)   -  person Tonechas    schedule 07.04.2017
comment
ах, мой плохой, это скриншот моего вывода. Я добавлю свои реальные данные в   -  person Nathan Thomas    schedule 07.04.2017


Ответы (1)


Приведенный ниже код вычисляет GLCM, соответствующий смещению «смещение на 1 пиксель вверх» от диапазона NIR вашего изображения tif:

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

x = io.imread('m_2909112_se_15_1_20150826.tif')
nir = x[:, :, 3]

glcm = greycomatrix(nir, [1], [np.pi/2], levels=256, normed=True, symmetric=True)

Вот так выглядит nir:

диапазон NIR

Результатом установки параметра normed в True является то, что вычисленная GLCM делится на его общую сумму, и в результате элементы glcm имеют довольно малые значения. Вот пример:

In [48]: np.set_printoptions(precision=3)

In [49]: glcm[:5, :5, 0, 0]
Out[49]: 
array([[  0.000e+00,   0.000e+00,   0.000e+00,   0.000e+00,   0.000e+00],
       [  0.000e+00,   2.725e-03,   6.940e-05,   3.725e-05,   2.426e-05],
       [  0.000e+00,   6.940e-05,   1.709e-04,   4.103e-05,   2.216e-05],
       [  0.000e+00,   3.725e-05,   4.103e-05,   4.311e-04,   4.222e-05],
       [  0.000e+00,   2.426e-05,   2.216e-05,   4.222e-05,   5.972e-05]])

Чтобы отобразить glcm как изображение, вам нужно масштабировать его, например, так:

from skimage.exposure import rescale_intensity
scaled = rescale_intensity(glcm[:,:,0,0])
io.imshow(scaled)

масштабированный

person Tonechas    schedule 06.04.2017
comment
Я реализовал то, что вы предлагаете, но мой результат тот же. Я немного больше изучил результаты, используя операторы печати. данные считываются блоками, как я ожидаю, например: [174 169 176 179 200 203 200 183 175 192 186 180 183 181 187 178 170 177 171 ...... 173 166 155 148 166 162 138 115 346 146 172 170 172 173 173 180 181 173 171 171], но результаты грейкоматрицы часто бывают пустыми, например [0 0 0 0], и лишь некоторые из них заполнены, например [0 1 0 1]. По сути, это передача пустых массивов команде greycoprops. - person Nathan Thomas; 07.04.2017