Istogramma che combina usando Python per migliorare il processo di mosaico di più raster sovrapposti?


11

Sto cercando di eseguire la corrispondenza dell'istogramma utilizzando Python per migliorare il processo di mosaico di più raster sovrapposti. Sto basando il mio codice su quello trovato su:

http://www.idlcoyote.com/ip_tips/histomatch.html

Ad oggi, sono riuscito a tagliare l'area di sovrapposizione di due raster adiacenti e ad appiattire l'array.

quindi ho due matrici 1 dimensionali della stessa lunghezza.

Ho quindi scritto il seguente codice basato su quello trovato sul sito Web sopra. Nel codice mostrato ho sostituito due set di dati molto piccoli per le immagini gd e bd.

import matplotlib.pyplot as plt
from scipy.interpolate import interp1d

bins = range(0,100, 10)

gd_hist = [1,2,3,4,5,4,3,2,1]

bd_hist = [2,4,6,8,10,8,6,4,2]

nPixels = len(gd_hist)

# here we are creating the cumulative distribution frequency for the bad image
cdf_bd = []
for k in range(0, len(bins)-1):
    b = sum(bd_hist[:k]) 
    cdf_bd.append(float(b)/nPixels)

# here we are creating the cumulative distribution frequency for the good image
cdf_gd = []
for l in range(0, len(bins)-1):
    g = sum(gd_hist[:l])
    cdf_gd.append(float(g)/nPixels) 


# we plot a histogram of the number of 
plt.plot(bins[1:], gd_hist, 'g')
plt.plot(bins[1:], bd_hist, 'r--')
plt.show()        

# we plot the cumulative distribution frequencies of both images
plt.plot(bins[1:], cdf_gd, 'g')
plt.plot(bins[1:], cdf_bd, 'r--')
plt.show()

z = []
# loop through the bins
for m in range(0, len(bins)-1):

    p = [cdf_bd.index(b) for b in cdf_bd if b < cdf_gd[m]] 
    if len(p) == 0:
        z.append(0)
    else:
        # if p is not empty, find the last value in the list p
        lastval = p[len(p)-1]

        # find the bin value at index 'lastval'
        z.append(bins[lastval])

plt.plot(bins[1:], z, 'g')
plt.show()

# look into the 'bounds_error'
fi = interp1d(bins[1:], z, bounds_error=False, kind='cubic')  
plt.plot(bins[1:], gd_hist, 'g')
plt.show
plt.plot(bins[1:], fi(bd_hist), 'r--')
plt.show()

Il mio programma traccia con successo gli istogrammi e le distribuzioni di frequenza cumulativa ... e ho pensato di avere la parte di ottenere la funzione di trasformazione 'z' corretta .... ma poi quando uso la funzione di distribuzione 'fi' su 'bd_hist' per provare ad abbinarlo all'insieme di dati gd tutto va a forma di pera.

Non sono un matematico ed è molto probabile che abbia trascurato qualcosa di abbastanza ovvio.


Non so molto sulla corrispondenza dell'istogramma ma i tuoi CDF devono sommare a 1 (per definizione)? cdf_bd = np.cumsum(bd_hist) / float(np.sum(bd_hist))
Jeff G,

Risposte:



1

Come un fondente selvaggio; Non sono sicuro che tu abbia bisogno di un PDF se hai i dati di conteggio in categorie ...
Potresti convertire i conteggi di ciascun valore per ciascun istogramma diverso in valori XY e quindi utilizzare una sorta di indicatore di regressione per verificare quella corrispondenza? Vale a dire, per due istogrammi perfettamente identici, fornirebbe un'analisi di correlazione e un quadrato R di 1,0.


0

alcuni dati di esempio sarebbero utili in quanto possono variare da sat a sat. ecco un semplice script che ho fatto nel tentativo di equalizzare gli istogrammi:

https://github.com/rupestre-campos/histogram_equalize

Forse puoi avere qualche idea.

Calcola anche il cdf come fai tu, ma come ho provato diventerà pazzo se calcoli banda per banda, quindi hai preso in considerazione l'intero raster.

Sembra che tu abbia perso l'equilibrio di riferimento del colore e il profilo spettrale. Inoltre è necessario non contare nessun pixel di dati, quindi rimuovere dal numero totale di pixel dell'immagine per calcolare il pdf corretto.

Dopo alcuni test mi sono piaciuti i risultati visivi usando l'intero approccio raster a Landsat8 a 3-4 bande e convertendo da 16 a 8 bit nell'intervallo 0-255.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.