0

2次元配列で極大値を見つけようとしています。固定ウィンドウサイズでこれを行うことができます。ただし、window size=x*0.1+2 などの関数を使用して、各セルの値に基づいて可変ウィンドウ サイズを使用したいと考えています。このアプローチは、 2004 年の Popescu と Wynneによる論文からメソッドを取得した in R パッケージForestToolsで見つけました。したがって、基本的に、セルの値が 10 の場合、極大値はウィンドウ サイズ 3 (10*0.1+2=3) で検索する必要があり、値が 20 の場合、ウィンドウ サイズは 4 (20*0.1+ 2=4)

現時点では、Scikit パッケージの関数 peak_local_max を使用して Python で同じことをしようとしていますが、これには変数ウィンドウのオプションがないようです。scipy.signal などの他の python パッケージ/関数を探しましたが、これまでのところ成功していません。理想的には、Python は非常に高速であるため、Python 内にとどまりたいと考えています。言語として、私は Python と R しか知りません。

これまでのコード:

chm_file = "my_chm.tif"
chm_dataset = gdal.Open(my_chm)
chm_raster = chm_dataset.GetRasterBand(1)
cols_chm = chm_dataset.RasterXSize
rows_chm = chm_dataset.RasterYSize
chm_array = chm_raster.ReadAsArray(0,0,cols_chm,rows_chm).astype(np.float)
local_maxi = peak_local_max(chm_array,indices=False, footprint=np.ones((10, 10)))

私のコードは、ラスターを配列として読み取り、極大値を見つけます。この場合、パラメーターのフットプリントによって検索ウィンドウが表示されます。関数 peak_local_max には、サイズとフットプリントというウィンドウ サイズを定義できる 2 つのパラメーターがあります。私はそこに次のような単純な関数を当てはめようとしました:

def varvalue(x):
y = x*0.1+2
return y

ただし、セルの値をこの関数に渡す方法がわかりません。これが可能かどうかさえ疑問です。他の機能/パッケージの使用を検討しましたが、これまでのところ結果はありません。私が見つけたほとんどの Python 関連の回答は 1 次元のデータ セットに基づいており、GIS の回答は QGIS または Arcmap を使用しています。

追加情報: 木のてっぺんを見つけるためにこれを行っています。短い距離で 2 本の背の高い木を見つける可能性は低いため、大きな木には大きな窓が必要なのは理にかなっています。そのため、データがラスターとして読み込まれ、配列に変換されます。さまざまなフットプリントで遊ぶと、さまざまな結果が得られます。固定ウィンドウ サイズでは、樹木の量が過大または過小評価されます。このチュートリアルを参考にしました。

4

0 に答える 0