一枚の紙を実装しようとしているのですが、標高フィルターと呼ばれる部分で行き詰まってしまいました! この記事のその部分は次のとおりです。
MATLABでそれを書く方法を知っている人はいますか?
あなたが求めていることは、画像処理で流域変換(またはウィキペディア)と呼ばれるものに強く関連しています。
流域アプローチによれば、グレースケール画像は地形レリーフとして見られ、水で満たされています。そうすることで、水で満たされた異なる盆地が結合する方法に従って、画像の異なる領域を分離することができます。
流域が最終的な目的である場合、画像処理ツールボックスにはそのための実装があります。ここに。
原則として、あなたの問題では、 に近い局所最小値 、 が与えられ、q
最小化問題を解決しますheight(p)
p
q
height(p) = inf_{g} \int_g ||grad I (g) || dg
g
結合する曲線はどこにp
ありq
、I
あなたのイメージです。
数学的な詳細については、たとえば、この論文を検討してください。
実装の詳細については、たとえば、matlab には mex コードが必要です。
Image Processing Toolbox関数を利用して標高watershed
を計算できます。以下の図の最初の行に示されている、高さデータを表す単純な 300 行 300 列の行列の例から始めます。
height = repmat(uint8([1:100 99:-1:50 51:1:150 149:-1:100]), 300, 1);
この場合、各行には同じプロファイルがあります。を使用して流域行列を計算できますwatershed
。
basin = watershed(height)+1;
これは、下の図の 2 行目に示されています。盆地の端にあるため、デフォルト値 1 が割り当てられた頂点があることに注意してください。これらをどのように処理するかは、自分で決める必要があります。ここでは、すべてのエッジを疑似盆地にまとめるだけです。
次に、各盆地の最小値をその盆地のすべてのポイントにマッピングする最小accumarray
行列 (下の図の 3 行目に示されている)を計算するために使用できます。
minValues = accumarray(basin(:), height(:), [], @min);
minima = minValues(basin);
そして最後に、標高は次のように計算できます (結果は下の図の最後の行に示されています)。
elevation = height - minima;