Apakah ada cara untuk memeriksa untuk melihat apakah ada 2 layer raster yang diberikan memiliki konten yang identik ?
Kami memiliki masalah pada volume penyimpanan bersama perusahaan kami: sekarang sangat besar sehingga diperlukan lebih dari 3 hari untuk melakukan pencadangan penuh. Penyelidikan awal mengungkapkan salah satu biang kerok memakan ruang terbesar adalah raster on / off yang benar-benar harus disimpan sebagai lapisan 1-bit dengan kompresi CCITT.
Gambar sampel ini saat ini 2bit (jadi 3 nilai yang mungkin) dan disimpan sebagai LZW kompresi file, 11 MB dalam sistem file. Setelah mengonversi ke 1bit (jadi 2 nilai yang memungkinkan) dan menerapkan kompresi CCITT Group 4, kami mendapatkannya menjadi 1,3 MB, hampir seluruh urutan besarnya penghematan.
(Ini sebenarnya adalah warga negara yang berperilaku sangat baik, ada yang lain disimpan sebagai float 32bit!)
Ini berita fantastis! Namun ada hampir 7.000 gambar untuk menerapkan ini juga. Akan mudah untuk menulis naskah untuk mengompres mereka:
for old_img in [list of images]:
convert_to_1bit_and_compress(old_img)
remove(old_img)
replace_with_new(old_img, new_img)
... tetapi tidak ada tes penting: apakah konten versi yang baru dikompresi-identik?
if raster_diff(old_img, new_img) == "Identical":
remove(old_img)
rename(new_img, old_img)
Apakah ada alat atau metode yang dapat (otomatis) membuktikan konten Gambar-A bernilai identik dengan konten Gambar-B?
Saya memiliki akses ke ArcGIS 10.2 dan QGIS, tetapi saya juga terbuka untuk hampir semua hal selain yang dapat meniadakan kebutuhan untuk memeriksa semua gambar ini secara manual untuk memastikan kebenaran sebelum menimpa. Akan mengerikan untuk secara keliru mengkonversi dan menimpa gambar yang benar - benar memiliki lebih dari nilai on / off di dalamnya. Sebagian besar biaya ribuan dolar untuk mengumpulkan dan menghasilkan.
pembaruan: Pelanggar terbesar adalah float 32bit yang berkisar hingga 100.000px ke satu sisi, jadi ~ 30GB terkompresi.
sumber
raster_diff(old_img, new_img) == "Identical"
adalah dengan mengecek bahwa zonal max dari nilai absolut dari selisihnya sama dengan 0, di mana zona tersebut diambil dari seluruh luas kisi. Apakah ini semacam solusi yang Anda cari? (Jika demikian, perlu disempurnakan untuk memeriksa apakah nilai-nilai NoData konsisten juga.)NoData
penanganan yang benar tetap dalam percakapan.len(numpy.unique(yourraster)) == 2
, maka Anda tahu bahwa ia memiliki 2 nilai unik dan Anda dapat melakukannya dengan aman.numpy.unique
akan menjadi lebih mahal secara komputasi (baik dari segi waktu dan ruang) daripada kebanyakan cara lain untuk memeriksa bahwa perbedaannya adalah konstan. Ketika dihadapkan dengan perbedaan antara dua raster floating point yang sangat besar yang menunjukkan banyak perbedaan (seperti membandingkan yang asli dengan versi kompresi yang lossy) kemungkinan akan macet selamanya atau gagal sepenuhnya.gdalcompare.py
menunjukkan janji besar ( lihat jawaban )Jawaban:
Coba konversi raster Anda ke array numpy dan kemudian periksa untuk melihat apakah mereka memiliki bentuk dan elemen yang sama dengan array_equal . Jika sama, hasilnya harus
True
:ArcGIS:
GDAL:
sumber
NoData
penanganannya,RasterToNumPyArray
menetapkan secara default nilai NoData input raster ke array. Pengguna dapat menentukan nilai yang berbeda, meskipun itu tidak berlaku dalam kasus Matt. Mengenai kecepatan, butuh 4,5 detik untuk skrip untuk membandingkan 2 raster 4-bit dengan 6210 kolom dan 7650 baris (sejauh DOQQ). Saya belum membandingkan metode ini dengan ringkasan zona apa pun.Anda dapat mencoba skrip gdalcompare.py http://www.gdal.org/gdalcompare.html . Kode sumber skrip ada di http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/python/scripts/gdalcompare.py dan karena ini adalah skrip python seharusnya mudah untuk menghapus yang tidak perlu menguji dan menambahkan yang baru sesuai dengan kebutuhan Anda saat ini. Script tampaknya melakukan perbandingan piksel dengan piksel dengan membaca data gambar dari dua gambar band demi band dan itu mungkin metode yang cukup cepat dan dapat digunakan kembali.
sumber
Saya menyarankan agar Anda membangun tabel atribut raster untuk setiap gambar, lalu Anda dapat membandingkan tabel. Ini bukan pemeriksaan lengkap (seperti menghitung perbedaan antara keduanya), tetapi probabilitas bahwa gambar Anda berbeda dengan nilai histogram yang sama sangat kecil. Juga memberi Anda jumlah nilai unik tanpa NoData (dari jumlah baris dalam tabel). Jika jumlah total Anda kurang dari ukuran gambar, Anda tahu bahwa Anda memiliki piksel NoData.
sumber
Solusi paling sederhana yang saya temukan adalah menghitung beberapa statistik ringkasan pada raster, dan membandingkannya. Saya biasanya menggunakan standar deviasi dan rata-rata, yang kuat untuk sebagian besar perubahan, meskipun dimungkinkan untuk mengelabui mereka dengan secara sengaja memanipulasi data.
sumber
Cara termudah adalah dengan mengurangi satu raster dari yang lain, jika hasilnya 0, maka kedua gambar itu sama. Anda juga dapat melihat histogram atau plot berdasarkan warna hasilnya.
sumber