Nguyên Sentinel 2 jp2 sang RGB geotiff


11

Tôi đang tìm cách để hợp nhất các tệp băng tần Sentinel 2 jp2 ( B02, B03, B04 ) và sửa các màu RGB. Tất cả nên được thực hiện với tập lệnh bash hoặc python. Ví dụ của tôi, tôi làm việc trên những hình ảnh này . Lý tưởng nhất là giải pháp sẽ gần với hướng dẫn này .

Tôi có thể hợp nhất các ban nhạc với lệnh này

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

Nhưng vì một số lý do, tôi không thể sửa màu RGB bằng lệnh tưởng tượng. Đầu ra là hình ảnh màu đen ~ 700 MB.

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

Cuối cùng, tôi muốn có tệp địa lý để tải nó lên mapbox. Giải thích về cách người ta nên chọn converttham số được chào đón.

Tôi đang phát triển một ứng dụng để đoán phần nào của ảnh vệ tinh là đất nông nghiệp. Một hình ảnh cảnh sẽ được cắt thành các mảng nhỏ hơn (có thể là 64x64) và sẽ được phân loại theo CNN ( cắt hoặc không cắt ). Tôi sử dụng bộ dữ liệu này để đào tạo mô hình Inception-v3. Bộ dữ liệu chứa hình ảnh 64x64 RGB với độ phân giải không gian 10m.


Thông tin thêm về sáp nhập.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

Điều này được hợp nhất.tif trước và sau khi áp dụng giải pháp @ ben's trước sau


1
Độ sâu bit của sáp nhập.tif và min, trung bình và max trong biểu đồ là gì? Kiểm tra vớigdalinfo -hist merged.tif
user30184

@ user30184 Tôi đã thêm thông tin được yêu cầu vào câu hỏi của mình
gkiko

Tôi đã thử chuyển đổi jp2 sang geotiff và sau đó áp dụng hiệu chỉnh màu nhưng tôi vẫn nhận được một hình ảnh màu đen
gkiko

Tại sao bạn không sử dụng hình ảnh TCI.jp2 về cơ bản giống như -scale 0 4096 0 255?
pLumo

1
đối với crop / non crop, có lẽ bạn có thể sử dụng esa-sen2agri.org/resource/software này thay vì tạo ứng dụng của riêng bạn từ đầu
radouxju

Câu trả lời:


8

Có 2 phần của vấn đề. Đầu tiên là bạn muốn chuyển đổi từ 16 bit thành 8 bit và tùy chọn -scale của gdal_translate thực hiện điều đó, như đã đề cập trong câu trả lời trước.

 -scale minOriginal maxOriginal minOutput maxOutput  

Vấn đề thứ hai là vấn đề tăng cường độ tương phản: khi bạn bán lại, bạn muốn có độ tương phản cao cho các pixel mà bạn quan tâm. CẢNH BÁO: Không có độ tương phản "ma thuật" bởi vì, khi bạn bán lại, bạn thường mất một số thông tin : nó được thực hiện để cải thiện trực quan hóa dữ liệu và các phần mềm chuyên nghiệp thực hiện việc này một cách nhanh chóng mà không cần viết một tệp mới. Nếu bạn muốn xử lý thêm dữ liệu của mình, trình duyệt địa lý "đen" của bạn chứa thông tin tương tự như jp2 của bạn và sẵn sàng để được xử lý. Nếu bạn tính toán, ví dụ, chỉ số thực vật, điều này nên được thực hiện với các giá trị phản xạ "ban đầu", chứ không phải các giá trị phản xạ. Điều đó đang được nói, đây là một số bước để tạo ra một hình ảnh 8 bit được tăng cường trực quan.

@ben đã cho bạn một phương pháp chung để giảm độ phản xạ từ 0-1 (nhân với 10000 với sản phẩm này) thành 0-255. Điều này là an toàn (không loại trừ), nhưng chỉ có mây và một số loại đất trống có độ phản xạ thực sự cao, vì vậy bạn không nhìn thấy nhiều trên đất liền (trừ đất trống) và không có gì trong nước. Do đó, các cải tiến tương phản thường được áp dụng trên hình ảnh bao gồm chỉ lấy một tập hợp con của phạm vi đầy đủ. Về mặt an toàn, bạn có thể sử dụng kiến ​​thức rằng độ phản xạ tối đa của vật liệu bề mặt Trái đất thông thường thường dưới 0,5 / 0,6 (xem tại đâycho một số ví dụ). Tất nhiên, điều này giả định rằng hình ảnh của bạn đã được hiệu chỉnh trong không khí (hình ảnh L2A). Tuy nhiên, phạm vi phản xạ khác nhau trong mỗi dải quang phổ và bạn không phải lúc nào cũng có bề mặt Trái đất sáng nhất trong khu vực bạn quan tâm. Đây là cách phương thức "an toàn" trông như thế nào (với độ phản xạ tối đa là 0,4, giống như 4096 được đề xuất bởi @RoVo)

nhập mô tả hình ảnh ở đây

Mặt khác, độ tương phản có thể được tối ưu hóa cho mỗi băng tần. Bạn có thể xác định phạm vi này theo cách thủ công (ví dụ: bạn quan tâm đến màu nước và bạn biết giá trị phản xạ dự kiến ​​tối đa của nước) hoặc dựa trên thống kê hình ảnh. Phương pháp thường được sử dụng bao gồm giữ khoảng 95% giá trị và "loại bỏ" (quá tối -> 0 hoặc quá sáng -> 255) phần còn lại, tương tự như xác định phạm vi dựa trên giá trị trung bình +/- 1,96 * độ lệch chuẩn. Tất nhiên, đây chỉ là một xấp xỉ vì nó giả sử phân phối bình thường, nhưng nó hoạt động khá tốt trong thực tế (ngoại trừ khi bạn có quá nhiều đám mây hoặc nếu các số liệu thống kê sử dụng một số giá trị NoData).

Hãy lấy ban nhạc đầu tiên của bạn làm ví dụ:

trung bình = 320

std = 536

Khoảng tin cậy 95% = [-731: 1372]

nhưng tất nhiên độ phản xạ luôn lớn hơn 0, do đó bạn phải đặt mức tối thiểu là 0.

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

Và nếu bạn có phiên bản gdal gần đây, thì bạn có thể sử dụng -scale_ {band #} (0 255 là đầu ra mặc định, vì vậy tôi không lặp lại nó) để bạn không cần phải chia các dải đơn. Ngoài ra tôi đã sử dụng vrt thay vì tif như một tệp trung gian (không cần phải viết một hình ảnh đầy đủ: một hình ảnh ảo là đủ)

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

Lưu ý rằng số liệu thống kê của bạn bị ảnh hưởng mạnh mẽ bởi các "tạo tác" như đám mây và NoData. Một mặt, phương sai được đánh giá quá cao khi bạn có các giá trị cực đoan. Mặt khác, trung bình của bạn bị đánh giá thấp khi có một lượng lớn các giá trị "không" (làm cho hình ảnh tương phản tự động quá sáng như trong ví dụ) và nó sẽ bị đánh giá quá cao nếu có phần lớn các đám mây (sẽ tạo ra hình ảnh quá tối). Ở giai đoạn này, kết quả do đó sẽ không phải là tốt nhất bạn có thể nhận được.

nhập mô tả hình ảnh ở đây

Một giải pháp tự động sẽ được giá trị nền và đám mây thiết lập để "nodata" và tính toán số liệu thống kê của bạn mà không NoData (xem bài này để biết chi tiết về tính toán số liệu thống kê mà không NoData, và cái này cho một ví dụ để các giá trị thiết lập lớn hơn 4000 để NoData cũng ). Đối với một hình ảnh duy nhất, tôi thường tính toán các số liệu thống kê về tập hợp con không có đám mây lớn nhất có thể. Với các số liệu thống kê từ một tập hợp con không có "NoData" (phía trên bên trái hình ảnh của bạn), điều này cho kết quả cuối cùng. Bạn có thể thấy rằng phạm vi là khoảng một nửa phạm vi "an toàn", có nghĩa là bạn có độ tương phản gấp đôi:

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

nhập mô tả hình ảnh ở đây

Như một nhận xét cuối cùng, gdal_constrast_stretch có vẻ tốt nhưng tôi chưa thử nghiệm


Vấn đề với điều này là mỗi hạt sẽ có độ sáng khác nhau. Tùy thuộc vào những gì anh ta muốn đạt được, tốt hơn là sử dụng một quy mô cố định. -scale 0 4096 0 255tạo ra sản lượng khá tốt nếu chúng ta không cần kết cấu đám mây ...
pLumo

@RoVo Tôi đồng ý rằng điều này sẽ mang lại giá trị sáng và bạn có thể mất độ tương phản trên các bề mặt sáng như cát, nhưng điều này dựa trên số liệu thống kê từ hình ảnh được hợp nhất bởi OP. Bạn sẽ không có độ tương phản khác nhau trên các hạt. Thông thường, phạm vi màu đỏ, xanh lá cây và xanh dương nhỏ hơn nhiều so với phạm vi trong NIR, đây là lý do tại sao sử dụng độ tương phản khác nhau cho mỗi dải có ý nghĩa.
radouxju

7

Bạn chỉ có thể sử dụng TCI.jp2tệp có trong SAFE.ziptệp. Lưu ý rằng các tệp này không có sẵn trong các tệp S2 trước tháng 10 năm 2016

Ngoài ra, bạn có thể chuyển đổi các băng tần bằng 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 4096là một giá trị hợp lý cho các cảnh Sentinel-2 và afaik cũng được sử dụng cho các hình ảnh TCI.jp2. Hạ thấp 4096 nếu bạn muốn nhận được kết quả nhẹ hơn.


5

Nếu bạn đang tìm kiếm một giải pháp như giải pháp bạn đã liên kết trong câu hỏi, bạn nên theo dõi và điều chỉnh skript shell xử lý Landsat 8 được cung cấp để tải xuống trong hướng dẫn.

Đặc biệt, như được thực hiện ở đó, trước tiên bạn có thể muốn bán lại các dải đơn, ví dụ như sau:

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

Lưu ý rằng biểu đồ hình ảnh của bạn cho thấy rằng bạn chỉ có các bề mặt rất tối trong hình ảnh của mình (đây có phải là trường hợp không?) Nhưng thông thường hình ảnh sentinel-2 của bạn sẽ có độ phản xạ trên không khí hoặc trên bề mặt trong đó các giá trị thường nằm trong khoảng 0 và 10000 - trừ khi giá trị cao hơn cũng có thể, ví dụ nếu bạn có các đám mây trong ảnh.

Sau đó, bạn có thể hợp nhất các dải và tinh chỉnh hình ảnh:

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

Đây là những gì xảy ra với hình ảnh của tôi khi làm điều này:

nhập mô tả hình ảnh ở đây


1
Tôi cập nhật câu hỏi của tôi. Tôi nên quyết định sử dụng tham số nào khi sửa màu GeoTIFF?
gkiko

Khi chia tỷ lệ giá trị từ hình ảnh đầu vào sang đầu ra luôn nhìn vào giá trị tối đa và tối thiểu trong hình ảnh đầu vào. Ví dụ: đối với băng tần đầu tiên, tham số tỷ lệ phải như thế này -scale 0 4818 0 255.
Milos Miletic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.