Espacio negro en imagen GLCM

Estoy tratando de calcular algunas medidas de textura usando el GLCM descrito por Haralick (energía, homogeneidad, etc.) para una serie de fotografías aéreas de 4 bandas (R, G, B, NIR) que tengo. He intentado esto en un subconjunto, pero estoy terminando con una imagen que está casi en blanco. Mi entendimiento actual es que tiene que ver con la escala de grises y el parámetro de levels , pero no puedo entenderlo.

Mi fecha es muy grande (varios GB), así que estoy tratando de ser eficiente utilizando el módulo RIOS (lee una imagen como una matriz numpy de 400 × 400 × nbands, procesa los datos y escribe en una imagen de salida).

Mi escena de entrada se puede encontrar aquí (200 MB).

Mi imagen de salida parece (esto puede ser difícil de ver ya que los píxeles negros son muy pequeños):

salida

Mi código es:

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

Obviamente, hay algo mal aquí, ya que mi salida no es como espero. Supongo que tiene que ver con el parámetro ‘niveles’. Me han indicado una explicación aquí: Línea negra en el resultado de GLCM que explica bien el parámetro pero no puedo mejorar mi resultado.

¿Puede alguien explicarme por qué mi resultado está saliendo como se muestra y cómo puedo remediarlo?

El siguiente código calcula el GLCM correspondiente a un desplazamiento “desplazamiento de 1 píxel hacia arriba” desde la banda NIR de su imagen 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) 

Así es como se ve nir :

Banda NIR

El efecto de establecer el parámetro normed en True es que el GLCM calculado se divide por su sum total y, como resultado, los elementos de glcm tienen valores bastante pequeños. Aquí hay una muestra:

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

Para mostrar glcm como una imagen, debe volver a escalarla, por ejemplo, como esto:

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

escamoso