Schwarzer Platz im GLCM-Bild

Ich versuche, einige strukturelle Maßnahmen mit dem von Haralick (Energie, Homogenität usw.) beschriebenen GLCM für eine Serie von 4 Band (R, G, B, NIR) Luftbilder zu berechnen, die ich habe. Ich habe das auf einer Untermenge ausprobiert, aber am Ende mit einem Bild, das meistens leer ist. Mein gegenwärtiges Verständnis ist, dass es mit dem Graustufen und dem levels Parameter zu tun hat, aber ich kann es nicht herausfinden.

Mein Date ist sehr groß (mehrere GB), also versuche ich, mit dem Modul RIOS effizient zu sein (liest ein Bild als 400 × 400 × nbands numpy Array, verarbeitet die Daten und schreibt auf ein Ausgabebild).

Meine Eingabeszene finden Sie hier (200 MB).

Mein Ausgabebild sieht aus (das kann schwer zu sehen sein, da die schwarzen Pixel sehr klein sind):

Ausgabe

Mein Code ist:

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

Offensichtlich gibt es hier etwas falsch, da meine Ausgabe nicht so ist, wie ich es erwarte. Meine Vermutung, dass es mit dem 'level' Parameter zu tun hat. Ich habe auf eine Erklärung hier hingewiesen: Black Line in GLCM Ergebnis, die den Parameter gut erklärt, aber ich bin nicht in der Lage, mein Ergebnis zu verbessern.

Kann mir jemand erklären, warum mein Ergebnis herauskommt wie gezeigt und wie kann ich es beheben?

One Solution collect form web for “Schwarzer Platz im GLCM-Bild”

Der untenstehende Code berechnet die GLCM entsprechend einem Offset "1-Pixel-Offset nach oben" aus dem NIR-Band Ihres tif-Bildes:

 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) 

So sieht nir aus:

NIR-Band

Der Effekt, den Parameter auf True ist, dass das berechnete GLCM durch seine Gesamtsumme geteilt wird, und als Ergebnis haben die Elemente von glcm eher kleine Werte. Hier ist ein Beispiel:

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

Um glcm als ein Bild anzuzeigen, glcm du es neu glcm , zum Beispiel so:

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

Skaliert

Python ist die beste Programmiersprache der Welt.