2017-04-06 4 views
2

J'essaie de calculer quelques mesures de texture en utilisant le GLCM décrit par Haralick (énergie, homogénéité, etc.) pour une série de photos aériennes à 4 bandes (R, G, B, NIR) que je avoir. J'ai essayé ceci sur un sous-ensemble mais finis avec une image qui est la plupart du temps vide. Ma compréhension actuelle est que cela a à voir avec le greyscaling et le paramètre levels mais je ne peux pas le comprendre.Espace noir dans l'image GLCM

Ma date est très importante (plusieurs Go), donc je suis en train d'être efficace en utilisant le module RIOS (lit une image en tant 400 nbands tableau numpy, traite les données et écrit à une sortie image).

Ma scène d'entrée peut être trouvée here (200 MB).

Mon image de sortie ressemble (cela peut être difficile de voir que les pixels noirs sont très petites):

output

Mon code est:

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

Manifestement, il y a quelque chose de mal ici comme ma sortie n'est pas comme je l'attends. Je suppose que c'est à voir avec le paramètre 'levels'. On m'a montré une explication ici: Black line in GLCM result qui explique bien le paramètre mais je suis incapable d'améliorer mon résultat. Est-ce que quelqu'un peut m'expliquer pourquoi mon résultat sort comme indiqué et comment je peux y remédier?

+0

Votre image est binaire, toutes les intensités de pixels sont soit '0' ou' 255'. Exécutez 'np.unique ()' pour vous convaincre. Le GLCM pour une telle image aurait seulement quatre entrées non nulles. – Tonechas

+0

numpy.unique rendements [21 22 23 24 25 26 27 28 29 30 3 ......... 186 187 188 189 190 191 192 193 194 195 196 197 198] –

+0

J'ai couru ce code: 'import numpy comme np' 'de l'importation de skimage io' ' x = io.imread ('https://i.stack.imgur.com/EyCI1.png') '' np.unique (x) ' et obtenu : 'array ([0, 255], dtype = uint8)' – Tonechas

Répondre

2

Le code ci-dessous calcule le GLCM correspondant à un décalage "1 pixel décalé vers le haut" de la bande proche infrarouge de votre image 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) 

Voici comment nir regarde:

NIR band

L'effet de la définition du paramètre normed à True est que le GLCM calculé est divisé par sa somme totale, et par conséquent les éléments de glcm ont plutôt petites valeurs. Voici un exemple:

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

Pour afficher glcm comme une image que vous devez redimensionner, par exemple comme ceci:

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

scaled

+0

J'ai mis en place ce que vous suggérez mais mon résultat est le même. J'ai regardé les sorties un peu plus en utilisant des instructions d'impression.les données sont lues en blocs comme je l'espère, comme: [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 146 163 172 170 172 173 173 180 181 173 171 171] mais les résultats du greycomatrix sont souvent vides, comme [0 0 0 0] avec seulement quelques-uns qui sont peuplés, comme [0 1 0 1]. Cela consiste essentiellement à passer des tableaux vides à la commande greycoprops. –