Birden çok örtüşen rasterlerin mozaikleme sürecini geliştirmek için Python kullanarak Histogram Eşleştirme?


11

Birden çok örtüşen rasterlerin mozaikleme sürecini geliştirmek için Python kullanarak histogram eşleştirmesi yapmaya çalışıyorum. Kodumu şu adrese dayandırıyorum:

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

Bugüne kadar, iki bitişik rasterin üst üste binen alanını kırpmayı ve diziyi düzleştirmeyi başardım.

bu yüzden aynı uzunlukta iki adet 1 boyutlu dizim var.

Daha sonra yukarıdaki web sitesinde bulunan dayalı aşağıdaki kodu yazdım. Gösterilen kodda, gd ve bd görüntüleri için iki çok küçük veri kümesini değiştirdim.

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

Programım histogramları ve kümülatif frekans dağılımlarını başarılı bir şekilde çiziyor ... ve 'z' dönüşüm işlevini doğru bir şekilde almanın bir parçası olduğunu düşündüm .... ama sonra 'bd_hist' dağıtım işlevini kullandığımda gd veri kümesiyle eşleştirmeye çalışmak her şey armut şeklindedir.

Ben bir matematikçi değilim ve oldukça bariz bir şeyi göz ardı etmişimdir.


Histogram eşleşmesi hakkında çok şey bilmiyorum, ancak CDF'lerinizin 1'e göre tanımlaması gerekiyor mu? cdf_bd = np.cumsum(bd_hist) / float(np.sum(bd_hist))
Jeff G

Yanıtlar:



1

Vahşi bir şekerleme olarak; Kategorilerde sayım verileriniz varsa PDF'ye ihtiyacınız olduğundan emin değilim ...
Her farklı histogram için her değerin sayısını XY değerlerine dönüştürebilir ve ardından bu eşleşmeyi kontrol etmek için bir çeşit regresyon göstergesi kullanabilir misiniz? Yani, iki tamamen aynı histogram için, bir korelasyon analizi sağlar ve R, 1.0 olur.


0

bazı örnek veriler sat ile sat arasında değişebileceği için iyi olur. İşte histogramları eşitlemek için yaptığım basit bir komut dosyası:

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

Belki biraz fikir edinebilirsiniz.

Ayrıca cdf'yi sizin gibi hesaplar, ancak denediğim gibi, bant başına bant hesaplarsanız çıldırır, böylece tüm rasterleri düşünürsünüz.

Görünüşe göre renk referans dengesini ve spektral profili kaybediyorsunuz. Ayrıca, hiçbir veri pikseli saymaya gerek yoktur, pdf'yi doğru hesaplamak için toplam görüntü pikseli sayısından kaldırmanız gerekir.

Bazı testlerden sonra 3-4 bant Landsat8 tüm raster yaklaşımı kullanarak ve 16bit 8bit 0-255 aralığı dönüştürerek görsel sonuçları sevdim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.