Hiểu bộ lọc độ cong của phân tích địa hình raster QGIS?


12

Tôi đã đọc mã nguồn của một số bộ lọc raster QGis-1.7.4 tính toán độ dốc, khía cạnh và độ cong.

Có một công thức trong bộ lọc tính toán độ cong tổng thể làm tôi bối rối.

Tệp nguồn nằm trong phiên bản hiện tại của QGis, với đường dẫn sau:

qgis-1.7.4 / src / phân tích / raster / qgstotalcurvaturefilter.cpp

Mục đích của bộ lọc này là tính tổng độ cong của bề mặt trong cửa sổ chín ô. Mã chức năng như sau:

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;
}

Tôi ổn với công thức "dxx" và với biểu thức trả về. Nhưng tôi nghĩ rằng các công thức "dyy" và "dxy" bị đảo ngược: điều này làm cho tổng kết quả không đối xứng về kích thước x và y.

Tôi có thiếu một cái gì đó hay tôi nên thay thế các biểu thức dẫn xuất kép bằng cách:

  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

Bạn có thể cho tôi biết ý kiến ​​của bạn về các công thức này, nếu chúng không đúng như tôi nghĩ hoặc nếu tôi sai? Trong trường hợp cuối cùng này, bạn có biết tại sao các công thức phải không đối xứng về x và y không?


3
xin vui lòng báo cáo những vấn đề này để họ có thể được cố định hub.qgis.org/projects/quantum-gis/issues/new
Underdark

Hum, làm thế nào để đăng nhập tại liên kết này? Tất nhiên, trang web dường như không chia sẻ tài khoản với diễn đàn, nhưng tôi không thấy bất kỳ "tạo tài khoản" nào ... Cảm ơn trước câu trả lời của bạn.
Tapadi

1
việc sử dụng trang web OSGeo đăng nhập www2.osgeo.org/cgi-bin/ldap_create_user.py
Underdark

Câu trả lời:


8

Những phỏng đoán của bạn là chính xác. Kiểm tra tính đối xứng là một ý tưởng tuyệt vời: độ cong (Gaussian) là một tính chất bên trong của một bề mặt. Vì vậy, xoay lưới không nên thay đổi nó. Tuy nhiên, các phép quay giới thiệu lỗi phân tách - ngoại trừ các phép quay theo bội số 90 độ. Do đó, bất kỳ xoay như vậy nên bảo tồn độ cong.

Chúng ta có thể hiểu những gì đang xảy ra bằng cách tận dụng ý tưởng đầu tiên của phép tính vi phân: đạo hàm là giới hạn của chỉ tiêu chênh lệch. Đó là tất cả những gì chúng ta thực sự cần biết.

dxxđược coi là một xấp xỉ rời rạc cho đạo hàm riêng thứ hai theo hướng x. Phép tính gần đúng cụ thể này (trong số nhiều khả năng có thể) được tính bằng cách lấy mẫu bề mặt dọc theo một mặt cắt ngang qua ô. Xác định vị trí ô trung tâm ở hàng 2 và cột 2, được viết (2,2), mặt cắt đi qua các ô tại (1,2), (2,2) và (3,2).

Dọc theo mặt cắt này, các đạo hàm đầu tiên được xấp xỉ bởi các chỉ số chênh lệch của chúng, (* x32- * x22) / L và (* x22- * x12) / L trong đó L là khoảng cách (chung) giữa các ô (hiển nhiên là bằng cellSizeAvg). Các dẫn xuất thứ hai thu được bằng các chỉ số khác nhau của chúng, mang lại

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

Lưu ý cách chia theo L ^ 2!

Tương tự, dyyđược coi là một xấp xỉ rời rạc cho đạo hàm riêng thứ hai theo hướng y. Mặt cắt thẳng đứng, đi qua các ô tại (2.1), (2.2) và (2,3). Công thức sẽ trông giống như đối với dxxnhưng với các chỉ số được chuyển đổi. Đó sẽ là thứ ba công thức trong câu hỏi - nhưng bạn vẫn cần chia cho L ^ 2.

Đạo hàm riêng thứ hai hỗn hợp dxy, có thể được ước tính bằng cách tách hai ô khác nhau. Ví dụ, đạo hàm đầu tiên liên quan đến x tại ô (2,3) (ô giữa trên cùng, không phải ô trung tâm!) Có thể được ước tính bằng cách trừ giá trị sang trái của nó, * x13, từ giá trị ở bên phải, * x33 và chia cho khoảng cách giữa các ô đó, 2L. Đạo hàm đầu tiên liên quan đến x tại ô (2.1) (ô giữa dưới) được ước tính bởi (* x31 - * x11) / (2L). Sự khác biệt của chúng , chia cho 2L, ước tính một phần hỗn hợp, cho

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

Tôi không thực sự chắc chắn ý nghĩa của độ cong "tổng" là gì, nhưng có lẽ nó được dự định là độ cong Gaussian (là sản phẩm của độ cong chính). Theo Meek & Walton 2000 , phương trình 2.4, độ cong Gaussian thu được bằng cách chia dxx * dyy - dxy ^ 2 (chú ý dấu trừ! - đây là một yếu tố quyết định ) theo bình phương của độ dốc của bề mặt. Do đó, giá trị trả về được trích dẫn trong câu hỏi không hoàn toàn là độ cong, nhưng nó trông giống như một biểu thức một phần lộn xộn cho độ cong Gaussian.

Sau đó, chúng tôi tìm thấy sáu lỗi trong mã , hầu hết trong số đó là nghiêm trọng:

  1. dxx cần được chia cho L ^ 2, không phải 1.

  2. dyy cần được chia cho L ^ 2, không phải 1.

  3. Dấu hiệu của dxy là không chính xác. (Tuy nhiên, điều này không ảnh hưởng đến công thức độ cong.)

  4. Các công thức cho dyy và dxy được trộn lẫn, như bạn lưu ý.

  5. Một dấu âm bị thiếu trong một thuật ngữ trong giá trị trả về.

  6. Nó không thực sự tính toán độ cong, mà chỉ tính tử số của biểu thức hợp lý cho độ cong.


Như một kiểm tra rất đơn giản, hãy xác minh rằng công thức đã sửa đổi trả về các giá trị hợp lý cho các vị trí nằm ngang trên các bề mặt bậc hai. Lấy vị trí như vậy làm gốc của hệ tọa độ và lấy độ cao của nó ở độ cao bằng không, tất cả các bề mặt như vậy có phương trình của dạng

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

cho hằng số a, b và c. Với hình vuông trung tâm tại tọa độ (0,0), một bên trái có tọa độ (-L, 0), v.v ... Chín độ cao là

*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

Từ đâu, theo công thức sửa đổi,

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.

Độ cong được ước tính là 2a * 2c - (2b) ^ 2 = 4 (ac - b ^ 2). (Mẫu số trong công thức Meek & Walton là một trong trường hợp này.) Điều này có ý nghĩa không? Hãy thử một số giá trị đơn giản của a, b và c:

  • a = c = 1, b = 0. Đây là một hình parabol tròn; độ cong Gaussian của nó phải là dương. Giá trị của 4 (ac-b ^ 2) thực sự là dương (bằng 4).

  • a = c = 0, b = 1. Đây là một hyperboloid của một tấm - yên xe - ví dụ tiêu chuẩn của một bề mặt của độ cong âm . Chắc chắn, 4 (ac-b ^ 2) = -4.

  • a = 1, b = 0, c = -1. Đây là một phương trình khác của hyperboloid của một tờ (xoay 45 độ). Một lần nữa, 4 (ac-b ^ 2) = -4.

  • a = 1, b = 0, c = 0. Đây là một mặt phẳng được gấp lại thành hình parabol. Bây giờ, 4 (ac-b ^ 2) = 0: độ cong Gaussian bằng 0 phát hiện chính xác độ phẳng của bề mặt này.

Nếu bạn thử mã trong câu hỏi trên các ví dụ này, bạn sẽ thấy nó luôn nhận được một giá trị sai.


Nó luôn luôn thú vị để đọc công phu rõ ràng của bạn vào buổi sáng.
Tomek

@Tomek Bây giờ một nhận xét ngoại giao (= khéo léo và rất mơ hồ)! :-)
whuber

1
Cảm ơn bạn rất nhiều cho một câu trả lời đầy đủ như vậy! Tôi sẽ báo cáo các lỗi công thức vì bây giờ tôi đảm bảo rằng có một cái gì đó để báo cáo. :)
Tapadi

@whuber: Tôi có thể xác nhận câu trả lời của Tomek rằng thật thú vị khi đọc bình luận của bạn trên diễn đàn này và tôi luôn học được điều gì đó mới từ họ !! Cảm ơn bạn đã chia sẻ kiến ​​thức vô giá của bạn miễn phí với chúng tôi !! Bạn có phiền không nếu tôi chỉ hỏi thêm một câu hỏi: Trong bất kỳ ứng dụng GIS nào, khi phân tích độ cong của địa hình (raster) được thực hiện, nó luôn luôn là độ cong Gaussian ? Không bao giờ độ cong trung bình ?
marco
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.