QGISラスター地形分析の曲率フィルターを理解していますか?


12

勾配、アスペクト、曲率を計算するいくつかのQGis-1.7.4ラスターフィルターのソースコードを読みました。

合計曲率を計算するフィルターには、私を困惑させる式があります。

ソースファイルは現在のバージョンのQGisにあり、次のパスがあります。

qgis-1.7.4 / src / analysis / raster / qgstotalcurvaturefilter.cpp

このフィルターの目的は、9セルのウィンドウで表面の曲率を計算することです。機能コードは次のとおりです。

float QgsTotalCurvatureFilter::processNineCellWindow( 
   float* x11, float* x21, float* x31, 
   float* x12, float* x22, float* x32, 
   float* x13, float* x23, float* x33 ) {

  ... some code deleted ...

  double dxx = ( *x32 - 2 * *x22 + *x12 ) / ( 1 );
  double dyy = ( -*x11 + *x31 + *x13 - *x33 ) / ( 4 * cellSizeAvg*cellSizeAvg );
  double dxy = ( *x21 - 2 * *x22 + *x23 ) / ( 1 );

  return dxx*dxx + 2*dxy*dxy + dyy*dyy;
}

「dxx」式とreturn式で大丈夫です。しかし、「dyy」と「dxy」の式は逆になっていると思います。これにより、x次元とy次元に関して合計結果が非対称になります。

何かが足りないのか、二重微分表現を次のように置き換える必要がありますか?

  double dxx = ( *x32 - 2 * *x22 + *x12 ) / ( 1 ); // unchanged
  // inversion of the two following:
  double dxy = ( -*x11 + *x31 + *x13 - *x33 ) / ( 4 * cellSizeAvg*cellSizeAvg );
  double dyy = ( *x21 - 2 * *x22 + *x23 ) / ( 1 );
  return dxx*dxx + 2*dxy*dxy + dyy*dyy; // unchanged

私が思ったように間違っていたり、間違っている場合、これらの式についてあなたの意見を教えてください。この最後のケースでは、xとyに関して式が非対称でなければならない理由を知っていますか?


3
彼らは固定することができますので、これらの問題を報告してくださいhub.qgis.org/projects/quantum-gis/issues/new
アンダーダーク

このリンクからログインするにはどうすればいいですか?もちろん、このサイトはフォーラムとアカウントを共有していないようですが、「アカウントの作成」は表示されません...回答ありがとうございます。
タパディ

1
ログインOSGEOサイトの使用www2.osgeo.org/cgi-bin/ldap_create_user.py
アンダーダーク

回答:


8

あなたの推測は正しいです。 対称性の確認は優れたアイデアです。(ガウス)曲率は表面の固有の特性です。したがって、グリッドを回転しても変更されません。ただし、回転により、90度の倍数の回転を除き、離散化エラーが発生します。したがって、このような回転は曲率を保持する必要があります。

微分計算の最初のアイデアを活用することで、何が起こっているのかを理解できます。微分は差分商の限界です。本当に知る必要があるのはそれだけです。

dxxは、x方向の2次偏微分の離散近似であると想定されています。この特定の近似値(多くの可能性のうち)は、セルを通る水平トランセクトに沿って表面をサンプリングすることによって計算されます。(2,2)と書かれた行2と列2の中央のセルを探し、トランセクトは(1,2)、(2,2)、および(3,2)のセルを通過します。

このトランセクトに沿って、一次導関数はそれらの差の商、(* x32- * x22)/ Lおよび(* x22- * x12)/ Lによって近似されます。ここで、Lはセル間の(共通の)距離です(明らかにに等しいcellSizeAvg)。二次導関数は、これらの差の商によって得られ、

dxx = ((*x32-*x22)/L - (*x22-*x12)/L)/L
    = (*x32 - 2 * *x22 + *x12) / L^2.

L ^ 2による除算に注目してください!

同様に、dyyは、y方向の2次偏微分の離散近似であると想定されています。トランセクトは垂直で、(2,1)、(2,2)、および(2,3)のセルを通過します。数式はdxx、下付き文字が入れ替わったものと同じになります。これが質問の3番目の式になりますが、それでもL ^ 2で割る必要があります。

混合された2次偏微分はdxy2つのセルの差を取ることで推定できます。たとえば、セル(2,3)のxに関する1次導関数(中央のセルではなく、上の中央のセル!)は、右側の値*から左側の値* x13を引くことで推定できます。 x33、およびそれらのセル間の距離で割る、2L。セル(2,1)(一番下の中央のセル)のxに関する1次導関数は、(* x31-* x11)/(2L)で推定されます。 それらのを2L割ると、混合部分が推定され、

dxy = ((*x33 - *x13)/(2L) - (*x31 - *x11)/(2L))/(2L)
    = (*x33 - *x13 - *x31 + *x11) / (4 L^2).

「総」曲率が何を意味するのかは本当にわかりませんが、おそらくガウス曲率(主曲率の積)を意図したものです。Meek&Walton 2000の式2.4によると、ガウス曲率は、dxx * dyy-dxy ^ 2(マイナス記号に注意してください。これは行列式です)を表面の勾配のノルムの2乗で除算することによって得られます。したがって、質問で引用された戻り値は曲率ではありませんが、ガウス曲率のめちゃくちゃな部分式のように見えます。

その結果、コード内に6つのエラーが見つかりました。それらのほとんどは重大です。

  1. dxxは1ではなくL ^ 2で割る必要があります。

  2. dyyは1ではなくL ^ 2で割る必要があります。

  3. dxyの符号が正しくありません。(ただし、これは曲率公式には影響しません。)

  4. ご指摘のとおり、dyyとdxyの式は混同されています。

  5. 戻り値の項に負符号がありません。

  6. 実際に曲率を計算するのではなく、曲率の有理式の分子のみを計算します。


非常に簡単なチェックとして、修正された数式が2次曲面上の水平位置に対して妥当な値を返すことを確認しましょう。そのような位置を座標系の原点とし、その標高をゼロの高さにすると、そのような表面はすべて次の形式の方程式を持ちます。

elevation = a*x^2 + 2b*x*y + c*y^2.

定数a、b、およびc。座標(0,0)にある中央の正方形では、左側の座標には座標(-L、0)などがあります。9つの標高は

*x13 *x23 *x33     (a-2b+c)L^2, (c)L^2, (a+2b+c)L^2
*x12 *x22 *x32  =  (a)L^2,      0,      (a)L^2
*x11 *x21 *x31     (a+2b+c)L^2, (c)L^2, (a-2b+c)L^2

修正された式により、

dxx = (a*L^2 - 2*0 + a*L^2) / L^2
    = 2a;

dxy = ((a+2b+c)L^2 - (a-2b+c)L^2 - (a-2b+c)L^2 + (a+2b+c)L^2)/(4L^2)
    = 2b;

dyy = ... [computed as in dxx] ... = 2c.

曲率は2a * 2c-(2b)^ 2 = 4(ac-b ^ 2)と推定されます。(この場合、Meek&Walton式の分母は1つです。)これは理にかなっていますか?a、b、およびcのいくつかの単純な値を試してください。

  • a = c = 1、b =0。これは円形放物面です。そのガウス曲率は正でなければなりません。4(ac-b ^ 2)の値は実際に正(4に等しい)です。

  • a = c = 0、b =1。これは、1枚のシートの双曲面、つまりサドルです。これは、負の曲率のサーフェスの標準的な例です。案の定、4(ac-b ^ 2)= -4。

  • a = 1、b = 0、c = -1 これは、1つのシートの双曲面の別の方程式です(45度回転)。もう一度、4(ac-b ^ 2)= -4。

  • a = 1、b = 0、c =0。これは放物線形状に折り畳まれた平面です。これで、4(ac-b ^ 2)= 0:ゼロのガウス曲率がこの表面の平面度を正しく検出します。

これらの例の質問のコードを試してみると、常に誤った値を取得していることがわかります。


午前中にあなたの明示的な精緻化を読むことは常に興味深いです。
トメック

@Tomek今そこに外交(=如才ないと非常に曖昧な)コメントです!:-)
whuber

1
このような完全な答えをありがとうございました!報告するものがあることを確認したので、数式エラーを報告します。:)
タパディ

@whuber:このフォーラムであなたのコメントを読むことは常に面白いというTomekの返事を確認することができ、私はいつも彼らから何か新しいことを学びます!! 貴重な知識を無料で共有していただきありがとうございます!! もう1つ質問がありますか。GISアプリケーションで、地形(ラスター)の曲率分析が実行されるとき、それは常にガウス曲率です。決して平均曲率?
マルコ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.