ทำให้พื้นที่โนดาต้าของภาพรวมภาพรวมของออร์โทโฟโต้ที่ถูก resampled เป็นสีขาวหรือไม่


9

ฉันมีชุดภาพ orthophoto ซึ่งเต็มไปด้วยข้อมูล แต่เมื่อรวมกันความครอบคลุมไม่ได้เป็นรูปสี่เหลี่ยมผืนผ้าดังนั้นจึงมีพื้นที่โนดาต้า

ใน MapGuide ฉันต้องสามารถแสดงพื้นที่โนดาต้าเหล่านี้เป็นสีขาวเพื่อให้ผู้ใช้ของฉันไม่ต้องเสียหมึกสีดำเมื่อพิมพ์

ในขนาดใหญ่ที่ฉันแสดงภาพความละเอียดเต็มรูปแบบดั้งเดิมโดยตรงไม่มีปัญหา ฉันเพิ่งตั้งค่าสีพื้นหลังของแผนที่เป็นสีขาวและพื้นที่ที่ไม่มีภาพ orthophoto แสดงพื้นหลัง

เพื่อประสิทธิภาพฉันต้องผสานภาพต้นฉบับเหล่านี้ทั้งหมดเข้ากับภาพรวมคอมโพสิตที่มีการ resampled สำหรับการแสดงในระดับที่เล็กลงซึ่งสามารถดูได้มากขึ้นในคราวเดียว

ฉันพยายามใช้ GDAL เพื่อรวมและลองใหม่ภาพรวม แต่โดยค่าเริ่มต้นดูเหมือนว่าจะสร้างแผ่น GeoTIFF คอมโพสิตที่มีการสุ่มใหม่ด้วยสีดำในพื้นที่โหนดและ MapGuide ไม่อนุญาตให้ฉันตั้งค่าสีดำแบบโปร่งใสใน rasters สี

มีวิธีให้ฉันได้อย่างมีประสิทธิภาพในสิ่งที่ฉันต้องการหรือไม่

ฉันได้ให้คำตอบที่ฉันลงเอยด้วยการใช้ GDAL แต่ชอบที่จะเห็นวิธีแก้ปัญหาโดยใช้โปรแกรมอรรถประโยชน์การประมวลผลภาพอื่น ๆ และแอพพลิเคชั่น GIS ทั้งโอเพ่นซอร์สและกรรมสิทธิ์

คำตอบ:


15

วิธีที่ง่ายที่สุดสำหรับผมที่จะจัดการกับปัญหานี้คือการใช้GDAL รูปแบบเสมือนจริง รูปแบบนี้ทำให้ฉันสามารถใช้รูปภาพทั้งหมดเป็นวัตถุภาพเดียวและแปลงเป็นสามขั้นตอนง่ายๆ

การสร้างชุดข้อมูลเสมือน

GDAL (รวมTamas Szekeres' GISInternals ไบนารีของ Windowsและรุ่นล่าสุดของOSGeo4W ) รวมถึงสาธารณูปโภคที่เรียกว่าgdalbuildvrtซึ่งสามารถนำมาใช้ในการสร้างชุดข้อมูลเสมือนการเริ่มต้น

วิธีง่ายๆในการใช้สิ่งนี้คือการเพิ่มรูปภาพของคุณทั้งหมดลงในไฟล์ข้อความจากนั้นใช้ไฟล์ข้อความนั้นเป็นอินพุตไปยัง gdalbuildvrt นี่คือตัวอย่าง (คุณจะต้องใส่คำสั่งที่สองกลับมาที่หนึ่งบรรทัด):

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

สิ่งนี้จะทำให้คุณมีไฟล์ XML ซึ่งคุณสามารถใช้เป็นภาพเดียวสำหรับการทำงานของ GDAL ทั้งหมด นอกจากนี้ยังแสดงถึง nodata ภายในเป็นสีขาว แต่ซ่อนนิยาม nodata จากเครื่องมือที่อ่านจากมัน

การสร้างภาพรวม Resampled

ถัดไปคุณจะทำการ resampling และ output ของภาพรวม คุณสามารถทำเช่นนี้กับทั้งgdal_translateหรือgdalwarp สำหรับสิ่งเหล่านี้โปรดจำไว้ว่าขนาดผลลัพธ์จะเป็นwidth * height * 3(จำนวน 8 แบนด์) ไบต์ หากสิ่งนี้มีขนาดใหญ่กว่า 4GB คุณจะต้องดูที่ตัวเลือก GeoTIFFสำหรับไวยากรณ์เพื่อระบุ BigTIFF เป็นเอาต์พุตของคุณ (-co "BIGTIFF = YES")

สำหรับ gdal_translate คุณจะต้องกำหนดขนาดของภาพเสมือนโดยใช้คำสั่งgdalinfo ใช้ส่วนข้อมูลเหล่านี้และหารแต่ละส่วนด้วยปัจจัยที่สอดคล้องกันเพื่อกำหนดความกว้างและความสูงของไฟล์ในหน่วยพิกเซล

คำสั่งจะมีลักษณะคล้าย (ในหนึ่งบรรทัด):

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

สำหรับ gdalwarp คุณจะต้องรู้ขนาดของพิกเซลที่ได้ ในกรณีนี้ฉันใช้. 5 เมตร คุณจะต้องโทรหาวิธีการสุ่มตัวอย่างอีกครั้ง ฉันชอบ cubicspline เพื่อดูภาพรวม มันเบากว่า แต่คุณจะไม่ใช้ความละเอียดเหล่านี้ลงไปจนเต็มและในประสบการณ์ของฉันมันจะสร้างภาพที่สามารถบีบอัดได้มากกว่าถ้าคุณใช้ JPEG หรือ 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

คุณอาจต้องการใช้ตัวเลือกการบีบอัด JPEG สำหรับภาพรวม GeoTIFF ที่ถูกสุ่มใหม่เหล่านี้ มันลดขนาดไฟล์ที่ส่งออกด้วย ( ตามที่ Frank ) เท่านั้นโทษประสิทธิภาพเล็กน้อย

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

ภาพรวม

คุณจะต้องเรียกใช้คำสั่งgdaladdo ที่มีประโยชน์บนอิมเมจผลลัพธ์เพื่อสร้าง "ปิรามิด" ภายในเพื่อให้การร้องขอความละเอียดต่ำกว่าขนาดภาพเต็มสามารถพบกับชุดย่อยของข้อมูล การเพิ่มประสิทธิภาพนั้นมีค่ามากกว่าพื้นที่ดิสก์ในกรณีส่วนใหญ่ คุณจะต้องการเล่นกับระดับที่คุณใช้ที่นี่ สำหรับภาพที่มีขนาดใหญ่มากคุณอาจจะวางบางส่วน คำสั่ง gdaladdo มีลักษณะดังนี้:

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

ฉันขอแนะนำให้ทดสอบกับระดับเหล่านี้เพื่อประสิทธิภาพที่ดีที่สุด คุณอาจพบว่าช่วงเวลาการสุ่มใหม่แตกต่างกันจะดีกว่าสำหรับการสมัครของคุณหรือตามขนาดภาพของคุณคุณสามารถวางตัวเลขที่สูงขึ้นบางส่วน (หรือจำเป็นต้องมากกว่านั้น)

นอกจากนี้หากคุณกำลังสร้างภาพรวมภายนอก (โดยใช้ตัวเลือก -ro) ให้พิจารณาเพิ่มบรรทัดการกำหนดค่าการบีบอัด JPEG:

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

(ฉันเชื่อว่าสิ่งเหล่านี้สืบทอดมาจาก GeoTIFF หลักสำหรับภาพรวมที่ฝังตัว)

หมายเหตุ

เมื่อประสบกับปัญหานี้ฉันถามช่อง #gdal บน freenode.irc.net นี่เป็นแหล่งข้อมูลที่น่าอัศจรรย์และฉันเป็นหนี้บุญคุณของ Howard Butler, Frank Warmerdam และแม้แต่ Rouault ที่ช่วยเหลือฉันในเรื่องนี้


ขอบคุณที่เสร็จสมบูรณ์สละเวลาและฉันแน่ใจว่าถึงเวลาแล้วที่จะครอบคลุมกระบวนการทำงานทั้งหมดไม่ใช่เฉพาะบิตที่ตอบคำถาม
matt wilkie

1
มันน่าสนใจที่จะดูว่าgdalsetnull.pyทำงานบน VRT หรือไม่จากนั้น"แก้ไขไฟล์ VRT ในโปรแกรมแก้ไขข้อความโดยเพิ่ม <NoDataValue /> entity"จะไม่จำเป็น
matt wilkie

1
@matt wilkie มันเป็นงานเขียนใหม่และการจัดรูปแบบสำหรับไซต์นี้ แต่ฉันก็กล่าวถึงเรื่องนี้ก่อนหน้านี้เป็นส่วนหนึ่งของเวิร์กโฟลว์ขนาดใหญ่ในบล็อกของฉัน: jasonbirch.com/nodes/2009/08/11/290/fwtools- ftw-gdal คำแนะนำนั้นคุ้มค่าที่จะลอง!
JasonBirch

cmd windows ทั่วไปหมายเหตุ: ใช้คาเร็ต^สำหรับตัวแบ่งบรรทัดที่จะเข้าร่วมเมื่อดำเนินการ (เช่นเพิ่ม^ในตอนท้ายของแต่ละตัวอย่างบรรทัดโค้ดด้านบนเพื่อรักษาทั้งความชัดเจนและความสามารถในการรัน) ข้อแม้สำคัญ: อย่าสิ้นสุดไฟล์หรือบรรทัดคำสั่งด้วยเครื่องหมายรูปหมวกเว้นแต่ว่าคุณต้องการเรียกใช้หน่วยความจำทั้งหมด
matt wilkie

3

ใช่ แต่ผ่านการทดลองและข้อผิดพลาดฉันสามารถ detmerine ที่ -vrtnodata 255 มีผลของการตั้งค่าสถานะทุกอย่างที่เป็นสีขาวไม่ได้เป็นเพียงแค่ปิดแผนที่ซึ่ง gdal2tiles จะปฏิบัติกับอัลฟาโปร่งใสตามธง -a

ดังนั้นคุณจบลงด้วยภาพต้นฉบับของคุณที่ตั้งค่าเป็นโปร่งใสในกรณีของฉันส่วนสีขาวของถนนประ นี่ไม่ใช่เทอร์มินัล แต่แน่ใจว่าดีที่จะสามารถระบุ gdal2tiles สี "no src image" ไม่ว่าจะเป็นผลมาจากช่องว่างดั้งเดิมใน vrt หรือเป็นผลมาจากการแปรปรวน สำหรับชุดของฉันสีฟ้าซีดจะเป็นเพียงสิ่ง

หลังจากลองผิดลองถูกมากขึ้นดูเหมือนว่า hidenodata จะเป็นกุญแจ ฉันไม่รู้ว่าทำไมเครื่องมือเหล่านี้ถึงได้รับการบันทึกไว้น้อยมาก นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน gdal 1.8

gdalbuildvrt test.vrt -vrtnodata "209 231 245" -hidenodata BX*.tif BY*.tif
gdal2tiles -p raster -s nztm.prj test.vrt out

ยังเห็น GDAL nearblackยูทิลิตี้gdal.org/programs/nearblack.htmlซึ่งถือว่าพิกเซลรอบขอบของภาพและละเว้นกลาง
แมตต์วิลคี

0

ฉันไม่คุ้นเคยกับ GDAL เกินไป แต่ฉันเดาว่ามีวิธีการหรือคำสั่งที่คุณสามารถตั้งค่าพิกเซลของค่าที่แน่นอนด้วยค่าอื่นได้หรือไม่

ไม่มีอะไรเกี่ยวข้องกับมัน แต่ใน SQL ธรรมดา ๆ อย่างเช่น (เพื่อแสดงให้เห็น - นี่คือรหัสหลอกยิ่งกว่า):

UPDATE ชุดพิกเซลแรสเตอร์ = 255 WHERE พิกเซล = NoData;

ฉันต้องการทราบคำตอบ!


GDAL มีหลายวิธีในการเปลี่ยนสีด้วยสีอื่น ๆ ในระหว่างการประมวลผลในลักษณะที่คล้ายกับรหัสเทียมของคุณและยูทิลิตีแบบสแตนด์อโลนที่เรียกว่า nearblack ซึ่งช่วยให้คุณสามารถทำความสะอาดขอบภาพที่มีส่วนการบีบอัดและเปลี่ยนเป็นสีขาวหากต้องการ ไม่มีสิ่งเหล่านี้ทำงานได้ดีกับปริมาณข้อมูลที่ฉันทำงานด้วยในเวลานั้น
JasonBirch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.