Raw Sentinel 2 jp2 ถึง RGB geotiff


11

ฉันกำลังมองหาวิธีผสานไฟล์วงดนตรีSentinel 2 jp2 ( B02, B03, B04 ) และแก้ไขสี RGB ทั้งหมดควรทำด้วย bash หรือ python script ตัวอย่างเช่นฉันทำงานในภาพเหล่านี้ จะเป็นการดีที่การแก้ปัญหาจะถูกปิดไปนี้กวดวิชา

ฉันสามารถรวมวงด้วยคำสั่งนี้

gdal_merge.py -separate -co PHOTOMETRIC=RGB -o merged.tif B04.jp2 B03.jp2 B02.jp2

แต่ด้วยเหตุผลบางอย่างฉันไม่สามารถแก้ไขสี RGB ด้วยคำสั่ง imagemagic เอาต์พุตเป็นภาพดำ ~ 700MB

convert -channel B -gamma 1.05 -channel RGB -sigmoidal-contrast 20,20% -modulate 100,150 merged.tif merged-cc.tif

ในที่สุดฉันต้องการไฟล์ geotiff เพื่ออัปโหลดใน mapbox คำอธิบายว่าจะเลือกconvertพารามิเตอร์ได้อย่างไร

ฉันกำลังพัฒนาแอปพลิเคชันที่ควรคาดเดาว่าภาพดาวเทียมส่วนใดเป็นพื้นที่เกษตรกรรม ภาพฉากจะถูกตัดเป็นหย่อมเล็ก ๆ (อาจ 64x64) และจะถูกจัดประเภทโดย CNN ( ครอบตัดหรือไม่ครอบตัด ) ฉันใช้ชุดข้อมูลนี้เพื่อฝึกอบรมโมเดล Inception-v3 ชุดข้อมูลประกอบด้วยภาพ RGB 64x64 พร้อมความละเอียดเชิงพื้นที่ 10 ม.


ข้อมูลเพิ่มเติมเกี่ยวกับการผสาน tif

Band 1 Block=10980x1 Type=UInt16, ColorInterp=Red
  Metadata:
    STATISTICS_MAXIMUM=4818
    STATISTICS_MEAN=320.61101402206
    STATISTICS_MINIMUM=0
    STATISTICS_STDDEV=536.76609312554
Band 2 Block=10980x1 Type=UInt16, ColorInterp=Green
  Metadata:
    STATISTICS_MAXIMUM=4206
    STATISTICS_MEAN=350.98505344194
    STATISTICS_MINIMUM=0
    STATISTICS_STDDEV=534.43264268631
Band 3 Block=10980x1 Type=UInt16, ColorInterp=Blue
  Metadata:
    STATISTICS_MAXIMUM=3801
    STATISTICS_MEAN=364.44611471973
    STATISTICS_MINIMUM=0
    STATISTICS_STDDEV=544.55509661709

นี่คือผสานแล้วก่อนและหลังใช้โซลูชันของ @ ben ก่อน หลังจาก


1
อะไรคือความลึกบิตของการผสาน tif และ min, ค่าเฉลี่ยและค่าสูงสุดในฮิสโตแกรม ตรวจสอบกับgdalinfo -hist merged.tif
user30184

@ user30184 ฉันได้เพิ่มข้อมูลที่ร้องขอไปยังคำถามของฉัน
gkiko

ฉันพยายามแปลง jp2 เป็น geotiff แล้วใช้การแก้ไขสี แต่ฉันยังคงได้ภาพสีดำ
gkiko

ทำไมคุณไม่ใช้แค่ภาพ TCI.jp2 ซึ่งเป็นแบบเดียวกับ-scale 0 4096 0 255?
pLumo

1
สำหรับการครอบตัด / ไม่ครอบตัดบางทีคุณสามารถใช้esa-sen2agri.org/resources/softwareนี้แทนการสร้างแอปพลิเคชันของคุณเองตั้งแต่เริ่มต้น
radouxju

คำตอบ:


8

ปัญหามี 2 ส่วน อย่างแรกคือคุณต้องการแปลงจาก 16 บิตเป็น 8 บิตและตัวเลือก -scale ของ gdal_translate ทำตามที่กล่าวไว้ในคำตอบก่อนหน้า

 -scale minOriginal maxOriginal minOutput maxOutput  

ปัญหาที่สองคือปัญหาการปรับปรุงความคมชัด: เมื่อคุณ rescale คุณต้องการมีความคมชัดสูงสำหรับพิกเซลที่คุณสนใจคำเตือน: ไม่มีความคมชัด "วิเศษ" เพราะเมื่อคุณ rescale คุณมักจะหลวมข้อมูลบางส่วน : มันทำเพื่อปรับปรุงการแสดงข้อมูลและซอฟต์แวร์ระดับมืออาชีพทำสิ่งนี้ได้ทันทีโดยไม่ต้องเขียนไฟล์ใหม่ หากคุณต้องการประมวลผลข้อมูลเพิ่มเติม geotiff "สีดำ" ของคุณมีข้อมูลเดียวกับ jp2 ของคุณและพร้อมที่จะประมวลผล หากคุณคำนวณเช่นดัชนีพืชควรทำด้วยค่าการสะท้อน "ดั้งเดิม" ไม่ใช่ค่าที่ได้รับการช่วยเหลือ ดังที่ได้กล่าวมานี่คือขั้นตอนบางอย่างในการสร้างภาพ 8 บิตที่ได้รับการปรับปรุงให้ดีขึ้น

@ben ให้วิธีการทั่วไปแก่คุณในการลดการสะท้อนจาก 0-1 (คูณด้วย 10,000 กับผลิตภัณฑ์นี้) ถึง 0-255 นี่เป็นสิ่งที่ปลอดภัย (ไม่มีข้อยกเว้น) แต่มีเพียงเมฆและดินเปลือยบางแห่งที่มีการสะท้อนแสงสูงมากดังนั้นคุณจึงไม่เห็นอะไรบนบก (ยกเว้นดินเปล่า) และไม่มีน้ำ ดังนั้นการปรับปรุงความคมชัดที่ใช้กันทั่วไปในภาพจึงเป็นเพียงส่วนหนึ่งของช่วงเต็ม ในด้านความปลอดภัยคุณสามารถใช้ความรู้ที่การสะท้อนสูงสุดของวัสดุพื้นผิวโลกทั่วไปมักจะต่ำกว่า 0.5 / 0.6 (ดูที่นี่สำหรับตัวอย่างบางส่วน) แน่นอนว่าภาพของคุณได้รับการแก้ไขในบรรยากาศ (ภาพ L2A) อย่างไรก็ตามช่วงของการสะท้อนแสงนั้นแตกต่างกันไปในแต่ละแถบสเปกตรัมและคุณไม่มีพื้นผิวโลกที่สว่างที่สุดในพื้นที่ที่คุณสนใจ นี่คือลักษณะของวิธี "ปลอดภัย" (ที่มีการสะท้อนสูงสุด 0.4 เช่น 4096 ที่แนะนำโดย @RoVo)

ป้อนคำอธิบายรูปภาพที่นี่

ในทางตรงกันข้ามความคมชัดสามารถปรับให้เหมาะสมสำหรับแต่ละแบนด์ คุณสามารถกำหนดช่วงนี้ด้วยตนเอง (เช่นคุณสนใจสีน้ำและคุณรู้ค่าการสะท้อนน้ำสูงสุดที่คาดไว้) หรือตามสถิติภาพ วิธีที่ใช้กันทั่วไปประกอบด้วยการรักษาค่าประมาณ 95% ของค่าและ "ยกเลิก" (มืดเกินไป -> 0 หรือสว่างเกินไป -> 255) ส่วนที่เหลือซึ่งคล้ายกับการกำหนดช่วงตามค่าเฉลี่ย +/- 1.96 * ส่วนเบี่ยงเบนมาตรฐาน. แน่นอนนี่เป็นเพียงการประมาณเพราะมันถือว่าการแจกแจงแบบปกติ แต่มันใช้งานได้ค่อนข้างดีในทางปฏิบัติ (ยกเว้นเมื่อคุณมีเมฆจำนวนมากเกินไปหรือถ้าสถิติใช้ประโยชน์จากค่า NoData บางค่า)

ให้นำวงแรกของคุณเป็นตัวอย่าง:

mean = 320

std = 536

ช่วงความมั่นใจ 95% = [-731: 1372]

แต่แน่นอนว่าการสะท้อนกลับมีค่ามากกว่าศูนย์เสมอดังนั้นคุณต้องกำหนดค่าต่ำสุดที่ 0

gdal_translate -scale 0 1372 0 255 -ot Byte  B01.jp2 B01-scaled.tif  

และหากคุณมี gdal รุ่นล่าสุดคุณสามารถใช้ -scale_ {band #} (0 255 เป็นเอาท์พุทเริ่มต้นดังนั้นฉันจึงไม่ทำซ้ำ) เพื่อที่คุณไม่จำเป็นต้องแยกแบนด์เดียว ฉันยังใช้ vrt แทน tif เป็นไฟล์ระดับกลาง (ไม่จำเป็นต้องเขียนภาพเต็ม: ไฟล์เสมือนก็เพียงพอแล้ว)

gdalbuildvrt -separate stack.vrt B04.jp2 B03.jp2 B02.jp2
gdal_translate -scale_1 0 1372 -scale_2 0 1397 -scale_3 0 1430 -ot Byte  stack.vrt im_rescaled.tif

โปรดทราบว่าสถิติของคุณได้รับผลกระทบอย่างมากจาก "ส่วน" เช่น clouds และ NoData ในอีกด้านหนึ่งความแปรปรวนจะถูกประเมินค่าสูงเกินไปเมื่อคุณมีค่ามาก ในอีกด้านหนึ่งค่าเฉลี่ยของคุณจะลดลงเมื่อมีค่า "ศูนย์" จำนวนมาก (ทำให้ภาพที่ตัดกันโดยอัตโนมัติสว่างเกินไปเช่นในตัวอย่าง) และจะถูกปรับให้เกินขนาดหากมีเมฆส่วนใหญ่ (ซึ่งจะทำให้ ภาพมืดเกินไป) ในขั้นตอนนี้ผลลัพธ์จะไม่ดีที่สุดที่คุณจะได้รับ

ป้อนคำอธิบายรูปภาพที่นี่

วิธีการแบบอัตโนมัติจะพื้นหลังและระบบคลาวด์ชุดค่า "ไม่มีข้อมูลตัวเลข" และคำนวณสถิติของคุณโดยไม่ต้องไม่มีข้อมูลตัวเลข (ดูโพสต์นี้สำหรับรายละเอียดเกี่ยวกับการคำนวณสถิติโดยไม่ต้องไม่มีข้อมูลตัวเลขและหนึ่งในนี้ตัวอย่างเช่นค่าชุดขนาดใหญ่กว่า 4000 ไม่มีข้อมูลตัวเลขเช่นกัน ) สำหรับภาพเดียวฉันมักจะคำนวณสถิติเกี่ยวกับชุดย่อยที่ไม่มีเมฆที่ใหญ่ที่สุดที่เป็นไปได้ ด้วยสถิติจากชุดย่อยที่ไม่มี "NoData" (มุมบนซ้ายของรูปภาพ) นี่จะให้ผลลัพธ์สุดท้าย คุณจะเห็นว่าช่วงดังกล่าวประมาณครึ่งหนึ่งของช่วง "ปลอดภัย" ซึ่งหมายความว่าคุณมีความเปรียบต่างเป็นสองเท่า:

gdal_translate -scale_1 38 2225 -scale_2 553 1858 -scale_3 714 1745 -ot Byte  stack.vrt im_rescaled.tif

ป้อนคำอธิบายรูปภาพที่นี่

เป็นคำพูดสุดท้ายgdal_constrast_stretchดูดี แต่ฉันยังไม่ได้ทดสอบ


ปัญหานี้คือว่าทุกเม็ดจะมีความสว่างที่แตกต่างกัน ขึ้นอยู่กับสิ่งที่เขาต้องการเพื่อให้บรรลุมันจะดีกว่าที่จะใช้ขนาดคงที่ -scale 0 4096 0 255ผลิตผลที่ออกมาได้ค่อนข้างดีถ้าเราไม่ต้องการพื้นผิวของคลาวด์ ...
pLumo

@RoVo ฉันยอมรับว่าสิ่งนี้จะให้คุณค่าที่ถูกกัดและคุณอาจจะตัดคอนทราสต์บนพื้นผิวที่สว่างเช่นทราย แต่ก็ขึ้นอยู่กับสถิติจากภาพที่ผสานโดย OP คุณจะไม่แตกต่างกันในเม็ด โดยทั่วไปแล้วช่วงที่เป็นสีแดงสีเขียวและสีน้ำเงินนั้นเล็กกว่าช่วงใน NIR นี่คือเหตุผลที่การใช้ความแตกต่างที่แตกต่างกันสำหรับแต่ละวงทำให้สมเหตุสมผล
radouxju

7

คุณสามารถใช้TCI.jp2ไฟล์ที่รวมอยู่ในSAFE.zipไฟล์ได้ โปรดทราบว่าไฟล์เหล่านี้ไม่สามารถใช้ได้ในไฟล์ S2 ก่อนเดือนตุลาคม 2559

หรือคุณสามารถแปลงวงดนตรีโดยใช้ GDAL:

# Merge bands
gdalbuildvrt -separate TCI.vrt B04.jp2 B03.jp2 B02.jp2

# Convert to uncompressed GeoTiff
gdal_translate -ot Byte -co TILED=YES -scale 0 4096 0 255 TCI.vrt TCI.tif

# _OR_ Convert to JPEG - compressed GeoTiff
gdal_translate -ot Byte -co TILED=YES -co COMPRESS=JPEG -co PHOTOMETRIC=YCBCR -scale 0 4096 0 255 TCI.vrt TCI.tif

-scale 0 4096เป็นค่าที่เหมาะสมสำหรับฉาก Sentinel-2 และ afaik ยังใช้สำหรับภาพ TCI.jp2 ลด 4096 ลงหากคุณต้องการได้ผลลัพธ์ที่เบากว่า


5

หากคุณกำลังมองหาวิธีการแก้ปัญหาเป็นวิธีที่คุณเชื่อมโยงในคำถามที่คุณควรปฏิบัติตามและปรับกะบังการประมวลผลเชลล์ skat Landsat 8ที่ให้ไว้สำหรับการดาวน์โหลดในการกวดวิชา

โดยเฉพาะอย่างยิ่งเมื่อเสร็จเรียบร้อยแล้วคุณอาจต้องการขายวงเดี่ยวเช่นเดิมดังนี้:

gdal_translate -ot Byte -scale 0 10000 0 255 B04.jp2 B04-scaled.tif 
gdal_translate -ot Byte -scale 0 10000 0 255 B03.jp2 B03-scaled.tif
gdal_translate -ot Byte -scale 0 10000 0 255 B02.jp2 B02-scaled.tif

โปรดทราบว่าฮิสโตแกรมของภาพของคุณแนะนำว่าคุณมีพื้นผิวที่มืดมากในภาพของคุณ (เป็นกรณีนี้ใช่หรือไม่) แต่โดยปกติแล้วภาพ Sentinel-2 ของคุณจะเป็นภาพบรรยากาศบนสุดหรือการสะท้อนที่ผิวหน้า และ 10,000 - ยกเว้นในกรณีที่ค่าสูงกว่าก็สามารถทำได้เช่นหากคุณมีเมฆในภาพ

จากนั้นคุณสามารถผสานวงดนตรีและปรับแต่งลักษณะของภาพ:

gdal_merge.py -v -ot Byte -separate -of GTiff -co PHOTOMETRIC=RGB -o RGB-scaled.tif B04-scaled.tif B03-scaled.tif B02-scaled.tif
convert -channel B -gamma 1.05 -channel RGB -sigmoidal-contrast 20,40% -modulate 100,150 RGB-scaled.tif RGB-scaled-cc.tif

นี่คือสิ่งที่เกิดขึ้นกับภาพของฉันเมื่อทำสิ่งนี้:

ป้อนคำอธิบายรูปภาพที่นี่


1
ฉันอัพเดตคำถามของฉัน ฉันจะตัดสินใจได้อย่างไรว่าควรใช้พารามิเตอร์ใดเมื่อแก้ไข geoTIFF?
gkiko

เมื่อปรับค่าจากภาพอินพุตไปยังเอาต์พุตจะดูที่ค่าสูงสุดและต่ำสุดในภาพอินพุต ตัวอย่างเช่นสำหรับแถบความถี่แรกพารามิเตอร์ของขนาดควรเป็นแบบนี้ - สเกล 0 4818 0 255
Milos Miletic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.