Pythonを使用して複数の重なり合うラスターのモザイク化プロセスを改善するヒストグラムマッチング?


11

Pythonを使用してヒストグラムマッチングを実行し、複数の重複するラスターのモザイク化プロセスを改善しようとしています。私は次の場所にあるコードに基づいています:

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

これまで、隣接する2つのラスターの重複領域をクリップし、配列を平坦化することができました。

したがって、同じ長さの2つの1次元配列があります。

次に、上記のWebサイトで見つかったコードに基づいて、次のコードを作成しました。示されているコードでは、gdとbdの画像を2つの非常に小さなデータセットに置き換えています。

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

私のプログラムは、ヒストグラムと累積度数分布を正常にプロットします...そして、変換関数 'z'を正しくする部分があると思っていました...それをgdデータセットに一致させようとすると、それはすべてナシ形になります。

私は数学者ではなく、かなり明白なものを見落としている可能性が高いです。


ヒストグラムマッチングについてあまり知りませんが、CDFの合計を1にする必要がありますか(定義上)? cdf_bd = np.cumsum(bd_hist) / float(np.sum(bd_hist))
ジェフG

回答:


2

推奨される実装についてコメントすることはできませんが、GRASS GIS 7(ここではアドオン)で行われたヒストグラムマッチングの既存の実装を確認することをお勧めします。

https://trac.osgeo.org/grass/browser/grass-addons/grass7/imagery/i.histo.match

マニュアルと例については、

http://grass.osgeo.org/grass70/manuals/addons/i.histo.match.html

コードはGPL2 +ライセンスの下で公開されています。


1

野生のファッジとして; カテゴリにカウントデータがある場合、PDFが必要かどうかわかりません...
各ヒストグラムの各値のカウントをXY値に変換してから、何らかの回帰インジケーターを使用してその一致を確認できますか?つまり、2つの完全に同一のヒストグラムの場合、相関分析は1.0の2乗Rを提供します。


0

一部のサンプルデータは、satからsatに変化する可能性があるため、便利です。これは、ヒストグラムをイコライズするために作成した1つの簡単なスクリプトです。

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

たぶん、あなたは洞察を得ることができます。

また、あなたと同じようにcdfを計算しますが、私が試みたように、バンドごとのバンドを計算すると狂気になりますので、ラスター全体を考慮する必要があります。

カラーリファレンスバランスとスペクトルプロファイルを失うように見えます。また、データピクセルをカウントしない必要があり、pdfを正確に計算するために、合計画像ピクセル数から削除する必要があります。

いくつかのテストの後、3〜4バンドのLandsat8への全ラスターアプローチを使用し、16ビットから8ビットの0〜255の範囲に変換する視覚的な結果が気に入った。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.