Jadikan area nodata dari ikhtisar orthophoto yang di-resample menjadi putih?

9

Saya memiliki satu set gambar ortofoto yang masing-masing diisi penuh dengan data, tetapi ketika ditempatkan bersama cakupan tidak membentuk persegi panjang sehingga ada area nodata.

Di MapGuide, saya harus dapat menampilkan area nodata ini sebagai putih sehingga pengguna saya tidak perlu membuang tinta hitam saat mencetak.

Pada skala besar, di mana saya menampilkan gambar resolusi penuh asli secara langsung, ini tidak masalah. Saya hanya mengatur warna latar belakang peta saya menjadi putih, dan area di mana tidak ada ortofoto yang menampilkan latar belakang.

Untuk kinerja, saya harus dapat menggabungkan semua gambar sumber ini menjadi gambar tinjauan komposit komposit untuk ditampilkan pada skala yang lebih kecil di mana lebih banyak ortofoto dapat dilihat sekaligus.

Saya telah mencoba menggunakan GDAL untuk menggabungkan dan mengubah sampel ikhtisar, tetapi secara default tampaknya membuat ubin GeoTIFF komposit yang di-resampled dengan warna hitam di area nodata, dan MapGuide tidak mengizinkan saya untuk mengatur hitam sebagai transparan pada raster warna.

Apakah ada cara bagi saya untuk secara efisien mendapatkan apa yang saya inginkan?

Saya telah memberikan jawaban yang akhirnya saya gunakan dengan GDAL, tetapi akan senang melihat solusi menggunakan utilitas pemrosesan gambar lainnya dan aplikasi GIS, baik open source maupun proprietary.

JasonBirch
sumber

Jawaban:

15

Cara termudah bagi saya untuk mengatasi masalah ini adalah dengan menggunakan Format Virtual GDAL . Format ini memungkinkan saya untuk memperlakukan seluruh rangkaian gambar sebagai objek gambar tunggal, dan mengubahnya dalam tiga langkah yang relatif sederhana.

Membuat Dataset Virtual

GDAL (termasuk GISInternals Windows binari Tamas Szekeres ' dan versi terbaru OSGeo4W ) termasuk utilitas yang disebut gdalbuildvrt yang dapat digunakan untuk membangun dataset virtual awal.

Salah satu cara sederhana untuk menggunakan ini adalah menambahkan semua gambar Anda ke file teks, dan kemudian menggunakan file teks itu sebagai input ke gdalbuildvrt. Berikut ini sebuah contoh (Anda harus mengembalikan perintah kedua pada satu baris):

dir /b *.tif > my_images.txt
gdalbuildvrt 
  -hidenodata 
  -vrtnodata "255 255 255" 
  -resolution highest 
  -input_file_list my_images.txt 
  my_image.vrt

Ini akan memberi Anda file XML yang dapat Anda perlakukan sebagai gambar tunggal untuk semua operasi GDAL. Ini juga secara internal mewakili nodata sebagai putih, tetapi menyembunyikan definisi nodata dari alat yang membacanya.

Membuat Ikhtisar yang Di-Resampled

Selanjutnya, Anda akan melakukan resampling dan output dari gambar ikhtisar. Anda dapat melakukan ini dengan gdal_translate atau gdalwarp . Untuk salah satu dari ini, ingat bahwa ukuran yang dihasilkan adalah width * height * 3(jumlah band 8 bit) Bytes. Jika ini akan lebih besar dari 4GB, Anda akan ingin melihat opsi GeoTIFF untuk sintaks untuk menentukan BigTIFF sebagai output Anda (-co "BIGTIFF = YA").

Untuk gdal_translate, Anda perlu menentukan dimensi gambar virtual menggunakan perintah gdalinfo yang praktis . Ambil dimensi ini dan bagi masing-masing dengan beberapa faktor yang konsisten untuk menentukan lebar dan tinggi output file Anda dalam piksel.

Perintahnya akan terlihat seperti (pada satu baris):

gdal_translate
  -outsize 53120 14000
  -co "TILED=YES"
  -co "PROFILE=GEOTIFF"
  -co "BLOCKXSIZE=256"
  -co "BLOCKYSIZE=256"
  my_image.vrt
  my_image.tif

Untuk gdalwarp, Anda harus mengetahui pixelsize yang dihasilkan; dalam hal ini saya menggunakan 0,5 meter. Anda juga ingin melakukan panggilan dengan metode resampling. Saya lebih suka cubicspline untuk ikhtisar orthophoto. Ini lebih lembut, tetapi Anda tidak akan menggunakan ini ke resolusi penuh dan dalam pengalaman saya itu menciptakan gambar yang lebih kompresibel jika Anda menggunakan sesuatu seperti JPEG atau ECW.

gdalwarp 
  -r cubicspline 
  -of GTiff 
  -dstnodata "255 255 255" 
  -tr 0.5 0.5 
  -co "PROFILE=GEOTIFF" 
  -co "BIGTIFF=YES" 
  -co "TILED=YES" 
  -co "BLOCKXSIZE=256"
  -co "BLOCKYSIZE=256"
  my_image.vrt 
  my_image.tif

Anda mungkin juga ingin mempertimbangkan untuk menggunakan opsi kompresi JPEG untuk ikhtisar GeoTIFF yang di-resampled ini; itu menyusut file output jauh dengan ( menurut Frank ) hanya penalti kinerja marjinal.

  -co "COMPRESS=JPEG" 
  -co "JPEG_QUALITY=80" 
  -co "PHOTOMETRIC=YCBCR"

Ikhtisar

Anda juga ingin menjalankan perintah gdaladdo yang praktis di atas gambar yang dihasilkan untuk membangun "piramida" internal, sehingga permintaan untuk resolusi yang lebih rendah daripada dimensi gambar penuh dapat dipenuhi dengan subset data. Peningkatan kinerja lebih dari layak ruang disk dalam banyak kasus. Anda ingin bermain-main dengan level yang Anda gunakan di sini; untuk gambar yang sangat besar Anda mungkin bisa menjatuhkan beberapa. Perintah gdaladdo terlihat seperti ini:

gdaladdo 
  -r average 
  my_image.tif 
  2 4 8 16 32 64 128 256

Saya akan menyarankan bereksperimen dengan level-level ini untuk kinerja yang optimal. Anda mungkin menemukan bahwa interval resampling yang berbeda lebih baik untuk aplikasi Anda atau, berdasarkan ukuran gambar Anda, bahwa Anda dapat menjatuhkan beberapa angka yang lebih tinggi (atau yang lebih banyak diperlukan)

Juga, jika Anda membuat tinjauan eksternal (menggunakan opsi -ro) pertimbangkan untuk menambahkan garis konfigurasi kompresi JPEG:

  --config COMPRESS_OVERVIEW JPEG 
  --config PHOTOMETRIC_OVERVIEW YCBCR 
  --config INTERLEAVE_OVERVIEW BAND 

(Saya percaya ini diwarisi dari induk GeoTIFF untuk ikhtisar tertanam)

Catatan

Ketika dihadapkan dengan masalah ini, saya bertanya di saluran #gdal di freenode.irc.net. Ini adalah sumber yang luar biasa, dan saya benar-benar berhutang budi kepada Howard Butler, Frank Warmerdam, dan Even Rouault karena membantu saya mengatasi hal ini.

JasonBirch
sumber
Terima kasih telah melengkapi, untuk meluangkan waktu, dan saya yakin sudah waktunya, untuk mencakup seluruh alur kerja dan bukan hanya bagian spesifik yang menjawab pertanyaan.
matt wilkie
1
akan menarik untuk melihat apakah gdalsetnull.py bekerja di VRT, lalu "edit file VRT dalam editor teks, menambahkan entitas <NoDataValue />" tidak diperlukan.
matt wilkie
1
@matt wilkie, itu pasti sedikit pekerjaan menulis ulang dan memformat untuk situs ini, tapi saya juga membahas ini sebelumnya sebagai bagian dari alur kerja yang lebih besar di blog saya: jasonbirch.com/nodes/2009/08/11/290/fwtools- ftw-gdal Saran itu pasti patut dicoba!
JasonBirch
windows cmd note umum: gunakan tanda sisipan ^untuk baris yang akan bergabung ketika dieksekusi (misalnya tambahkan ^ke akhir setiap baris kode contoh di atas untuk menjaga keterbacaan dan run-kemampuan). Peringatan penting: jangan pernah mengakhiri file atau baris perintah dengan tanda sisipan kecuali jika Anda ingin meminta konsumsi semua memori
matt wilkie
3

Ya, tetapi melalui coba-coba saya dapat menentukan bahwa -vrtnodata 255 memiliki efek menandai semua yang putih sebagai nodata, bukan hanya dari peta, yang kemudian diperlakukan gdal2tiles dengan transparansi alpha sesuai dengan bendera -a.

Jadi Anda berakhir dengan beberapa gambar sumber Anda diatur ke transparan, dalam kasus saya bagian putih dari jalan putus-putus. Ini bukan terminal tetapi tentu akan menyenangkan untuk dapat menentukan untuk gdal2tiles warna "no src image", baik sebagai hasil dari void asli di vrt, atau sebagai hasil dari warp. Untuk set saya warna biru pucat akan menjadi hal.

Setelah lebih banyak coba-coba, tampaknya hidenodata adalah kuncinya. Saya tidak tahu mengapa alat-alat ini sangat minim didokumentasikan. Inilah yang bekerja untuk saya, Gal 1.8.

gdalbuildvrt test.vrt -vrtnodata "209 231 245" -hidenodata BX*.tif BY*.tif
gdal2tiles -p raster -s nztm.prj test.vrt out
Peter
sumber
juga melihat utilitas gdal nearblack gdal.org/programs/nearblack.html , yang hanya memperlakukan piksel di sekitar tepi gambar dan mengabaikan bagian tengah
matt wilkie
0

Saya tidak terlalu terbiasa dengan GDAL, tapi saya rasa metode atau perintah tersedia di mana Anda dapat mengatur piksel nilai tertentu dengan nilai lain?

Tidak ada hubungannya dengan itu, tetapi dalam SQL sederhana seperti (hanya untuk menggambarkan - ini jauh lebih pseudo-code):

UPDATE SET raster pixel = 255 WHERE pixel = NoData;

Saya ingin tahu jawabannya!

George Silva
sumber
GDAL mencakup beberapa metode untuk mengganti warna dengan warna lain selama pemrosesan dengan cara yang mirip dengan pseudocode Anda, dan utilitas mandiri yang disebut nearblack yang memungkinkan Anda untuk membersihkan tepi gambar yang mengandung artefak kompresi dan mengubahnya menjadi putih jika diinginkan. Tak satu pun dari ini bekerja dengan baik dengan volume data yang saya kerjakan saat itu.
JasonBirch