Mengurangi tingkat pemrosesan raster di ArcPy atau ArcGIS Desktop?

8

Saya perlu mengurangi tingkat pemrosesan raster saya dengan semacam prosedur otomatis dengan python. Saat ini batas-batas dataset yang saya gunakan memiliki anomali (karena klasifikasi garis pemindaian landsat).

ScanLines Classified

Saya ingin mengurangi tingkat pemrosesan raster sehingga ketika saya mengambil informasi di atas dengan fungsi SetNull perbatasan tidak diproses. Sesuatu seperti Daerah

Sekarang ini dapat dengan mudah dilakukan dengan ekstrak dengan fungsi mask (yaitu gambar2) walaupun itu akan membutuhkan pemilihan manual dari daerah masking. Apakah ada menthod yang dapat saya gunakan untuk menghitung luas wilayah (mengabaikan nilai nodata) minus lebar perbatasan dalam arah x dan y dari setiap baris / kolom dan kemudian memanfaatkan arcpy.env.extentdalam Python?

BJEBN
sumber
Bisakah Anda mendapatkan sejauh seluruh raster dan kemudian mengurangi jarak standar dari setiap sisi? Atau apakah itu terlalu sederhana?
Radar
Itu akan bekerja dengan asumsi bahwa luasnya berasal dari daerah-daerah dengan nilai daripada seluruh wilayah (yaitu nilai nodata)
BJEBN
1
Saya mengalami sedikit kesulitan memahami apa yang merupakan "perbatasan". Apakah Anda ingin secara otomatis mendeteksi anomali pemindaian dan kemudian memotongnya? Jika demikian, apakah Anda mencari metode yang memungkinkan Anda mendeteksi anomali ini?
Radar
Perbatasan adalah area nilai raster yang mengandung - mungkin gambar kedua di atas sedikit membingungkan karena saya melihat sekarang bahwa mereka adalah nilai-nilai terluar (harus memiliki lapisan tambahan aktif ketika saya mengambil layar ambil). Area padat di atas adalah perbatasan raster - kotak merah adalah tingkat raster yang diinginkan sedangkan luas raster saat ini adalah seluruh gambar (termasuk nilai * nodata putih)
BJEBN

Jawaban:

9

Alur kerja ini pertama-tama berkaitan dengan sampah yang mengambang di tepinya dan kemudian menyelesaikan masalahnya.

  1. Buat indikator biner dari area "perbatasan", yang saya ambil untuk menyertakan semua sel NoData di sekitarnya. Lebih mudah menggunakan nilai apa pun untuk menunjukkan batas dan NoData untuk yang lainnya, seperti pada SetNull(Not(IsNull('X')), 1):

    Berbatasan

  2. Regiongroup hasilnya dan pilih komponen perbatasan. (Ini biasanya dapat diotomatisasi dengan memilih komponen dengan nilai [Hitung] terbesar.) Gambar akan terlihat hampir sama; hanya beberapa piksel yang tersesat di tengah yang dikecualikan di sini - tetapi harus dikecualikan untuk langkah selanjutnya agar berfungsi.

    (Pendekatan alternatif adalah dengan menggunakan operasi morfologis pertama untuk mengecilkan perbatasan dan kemudian memperluas kembali: ini menghapus bit yang terisolasi di tengah.)

  3. Hitung grid jarak Euclidean dengan komponen batas.

    Jarak

  4. Tutup semua jarak kecil di gambar asli, seperti di SetNull(([Distance to Border component] < 30),X ):

    Hasil

(Gambar akhir menunjukkan batas asli dalam lapisan hijau, untuk referensi, pada hasilnya.)

whuber
sumber