Mengatur NoData untuk raster multiband?

10

Saya memiliki orthoimage RGB yang memiliki area hitam, bukan NoData, seperti yang digambarkan di sini: masukkan deskripsi gambar di sini

Ketika saya menggunakan alat SetNull, itu menghapus area hitam, namun kemudian mengubahnya menjadi ortoimage abu-abu, yang bukan itu yang saya inginkan.

masukkan deskripsi gambar di sini

Saya tahu bahwa ada jalan keluar dengan menggunakan alat Klip (Data Management) untuk klip raster untuk dirinya sendiri dan di sana Anda dapat mengatur nilai NoData menjadi nilai sel-sel hitam (0). Namun, saya membuat lokakarya untuk siswa dan saya ingin menggunakan metode yang kurang intuitif.

Tentu saja ada opsi untuk menjalankan alat NoData pada setiap band secara individual dan kemudian menggabungkan ketiga band bersama-sama, namun saya perlu memiliki kondisi di mana band1, band2, dan band3 semua sama dengan 0 untuk menetapkan bahwa sebagai NoData. Mampu melakukan ini di ModelBuilder akan ideal, tetapi skrip itu menggunakan ArcPy juga akan bagus.

Saya menggunakan ArcGIS 10.2 Desktop dengan Lisensi Lanjut.

Alex McVittie
sumber
Anda mengatakan Anda menggunakan "ArcGIS 10.2 Pro" tetapi aplikasi ArcGIS Pro hanya dirilis dengan ArcGIS 10.3 untuk Desktop. Bisakah Anda mengedit pertanyaan Anda untuk memperjelas apa yang Anda gunakan?
PolyGeo
Permintaan maaf saya. Saya menggunakan ArcGIS 10.2 untuk Desktop dengan lisensi Advanced.
Alex McVittie
Terima kasih telah mengajukan pertanyaan ini. Saya memiliki klien yang kembali kepada saya sepanjang waktu berpikir ada yang salah dengan citra mereka.
Wes

Jawaban:

12

Yang ingin Anda lakukan adalah Mengatur Properti Raster dalam skrip atau mengubahnya secara manual di ArcCatalog. Ini tidak akan membuat raster baru atau bahkan butuh waktu lama.

Dengan python agak sulit:

import sys, os, arcpy

InFolder = sys.argv[1]
arcpy.env.workspace = InFolder

for Ras in arcpy.ListRasters():
    arcpy.AddMessage("Processing " + Ras)
    arcpy.SetRasterProperties_management(Ras,nodata="1 0;2 0;3 0")

Karena nodata berada jauh di daftar, saya merasa lebih mudah untuk menentukannya; parameternya adalah Nilai Band; Nilai Band; ... sampai semua band diatasi. Jika Anda cenderung memiliki lebih banyak band (atau kurang) di folder yang sama maka Anda harus menggunakan arcpy. Deskripsi dan properti bandCount untuk menetapkan nol untuk jumlah band yang benar:

import sys, os, arcpy

InFolder = sys.argv[1]
arcpy.env.workspace = InFolder

for Ras in arcpy.ListRasters():
    arcpy.AddMessage("Processing " + Ras)
    desc = arcpy.Describe(Ras)
    if desc.bandCount == 3:
        arcpy.SetRasterProperties_management(Ras,nodata="1 0;2 0;3 0")
    elif desc.bandCount == 4:
        arcpy.SetRasterProperties_management(Ras,nodata="1 0;2 0;3 0;4 0")
    elif desc.bandCount == 1:
        arcpy.SetRasterProperties_management(Ras,nodata="1 0")

Di ArcCatalog, klik kanan pada layer dan pergi ke properti: masukkan deskripsi gambar di sini

tekan tombol edit:

masukkan deskripsi gambar di sini

Masukkan nilai lalu tekan OK untuk mengabaikan editor NoData dan OK untuk memberlakukan perubahan.

Sekarang raster tidak akan menampilkan apa pun di ArcMap di mana nilai sel 0,0,0.

Michael Stimson
sumber
3

Jika Anda pergi ke properti raster, dan jika simbologinya diatur sebagai komposit RGB (yang tampaknya), Anda dapat memeriksa kotak Display Background Values ​​(RGB) dan mengatur apa pun yang Anda suka sebagai latar belakang kosong. Jadi atur 0 0 0 sebagai nilai latar belakang dan Anda harus berada dalam bisnis.

mr.adam
sumber
2

Saya pikir cara termudah untuk mencapai ini adalah dengan membuat raster kondisi nol terlebih dahulu, kemudian gunakan raster itu untuk menetapkan nilai NoData ke setiap band secara terpisah.

Coba jalankan fungsi Con untuk membuat raster kondisi nol.

nullCondition = Con(((band1 == 0) & (band2 == 0) & (band3 == 0)), 1, 0)

Kemudian gunakan raster kondisi nol untuk menetapkan nilai NoData ke setiap band dengan fungsi Null yang ditetapkan . Anda harus dapat melakukan ini dengan model builder atau python.

Ben Gosack
sumber
2

Saya percaya bahwa Anda dapat menggunakan prosedur berbeda pohon yang harus bekerja secara teoritis. Calculaster raster di mana Anda dapat menggunakan ekspresi ini. SETNULL([raster] == value, [raster]) Klasifikasi ulang di mana Anda hanya perlu mengklasifikasi ulang nilai yang Anda inginkan. Dan menggunakan ArcPy Anda dapat menggunakan skrip ini yang saya temukan di sini https://gis.stackexchange.com/a/24578/47790

import arcpy
from arcpy import env
from arcpy.sa import *
env.workspace = "C:/sapyexamples/data"
outSetNull = SetNull("elevation", "elevation", "VALUE = 9999")
outSetNull.save("C:/sapyexamples/output/outsetnull")
Diogo Matos
sumber