Raw Sentinel 2 jp2 to RGB geotiff


11

Sentinel 2 jp2バンドファイル(B02、B03、B04)をマージし RGBカラーを修正する方法を探しています。すべてbashまたはpythonスクリプトで行う必要があります。私の例では、これらの画像に取り組んでいます。理想的には、ソリューションはこのチュートリアルに近いものになります。

このコマンドでバンドをマージすることができます

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

しかし、何らかの理由で、imagemagicコマンドでRGBカラーを修正できません。出力は約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モデルをトレーニングします。データセットには、10mの空間解像度を持つ64x64 RGB画像が含まれています。


merged.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のソリューションを適用する前後のmerged.tifです。 前 後


1
ヒストグラムのmerged.tifおよびmin、average、maxのビット深度は何ですか?確認してくださいgdalinfo -hist merged.tif
user30184

@ user30184質問に要求された情報を追加しました
gkiko

jp2をgeotiffに変換してから色補正を適用してみましたが、それでも黒い画像が表示されます
gkiko

基本的に同じTCI.jp2画像を使用しないのはなぜ-scale 0 4096 0 255ですか?
pLumo 2017年

1
作物/非作物の場合、独自のアプリケーションをゼロから作成する代わりに、このesa-sen2agri.org/resources/softwareを使用できます
radouxju

回答:


8

問題には2つの部分があります。1つ目は、前の回答で述べたように、16ビットから8ビットに変換することです。gdal_translateの-scaleオプションで変換します。

 -scale minOriginal maxOriginal minOutput maxOutput  

第二の問題は、コントラスト強調の問題です。あなたはスケール変更するとき、あなたはあなたがに興味を持っていることの画素に対する高いコントラストを持つようにしたいWARNING:、ので、何の「魔法」のコントラストはありませんあなたはスケール変更するとき、あなたは通常、いくつかの情報を失います:これは、データの視覚化を改善するために行われ、専門のソフトウェアは、新しいファイルを作成せずにその場でこれを行います。データをさらに処理したい場合は、「黒」のgeotiffにjp2と同じ情報が含まれており、処理の準備ができています。たとえば、植生指数を計算する場合、これは、再スケーリングされた値ではなく、「元の」反射率値を使用して行う必要があります。そうは言っても、視覚的に強化された8ビット画像を作成するためのいくつかの手順を次に示します。

@benは、反射率を0-1(この製品では10000で乗算)から0-255に再スケーリングする一般的な方法を提供しました。これは安全です(除外なし)が、反射率が非常に高いのは雲と一部の裸土だけなので、陸上(裸土を除く)にはそれほど多くはなく、水中には何もありません。したがって、画像に一般的に適用されるコントラストの強化は、全範囲のサブセットのみを取得することです。安全面では、一般的な地表面物質の最大反射率が通常0.5 / 0.6未満であるという知識を使用できます(ここを参照)いくつかの例)。もちろん、これは画像が大気補正されていることを前提としています(L2A画像)。ただし、反射率の範囲は各スペクトルバンドで異なり、関心のある領域で常に最も明るい地球表面があるとは限りません。これが「安全な」方法の例です(@RoVoによって提案された4096のように、最大​​反射率は0.4です)。

ここに画像の説明を入力してください

一方、コントラストはバンドごとに最適化できます。この範囲は手動で定義できます(たとえば、水の色に興味があり、水の予想される最大反射率値がわかっている場合)または画像統計に基づいて定義できます。一般的に使用される方法は、値の約95%を保持し、残りを「破棄」(暗すぎる-> 0または明るすぎる-> 255)することです。これは、平均値に基づいて範囲を定義するのと同様です+/- 1.96 *標準偏差。もちろん、正規分布を想定しているため、これは概算にすぎませんが、実際には非常に良好に機能します(雲が多すぎる場合、または統計がいくつかのNoData値を使用する場合を除く)。

例として最初のバンドを見てみましょう:

平均= 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がデフォルトの出力なので、繰り返さない)を使用して、単一バンドを分割する必要がないようにすることができます。また、中間ファイルとしてtifではなくvrtを使用しました(完全なイメージを書き込む必要はありません。仮想イメージで十分です)。

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

統計は、雲やNoDataなどの「アーティファクト」の影響を強く受けます。一方では、極端な値がある場合、分散は過大評価されます。一方、「ゼロ」値が大量にある場合(例のように自動的にコントラストのある画像が明るくなりすぎる場合)の平均は過小評価され、雲の大部分が存在する場合は過大評価されます(これにより、画像が暗すぎる)。したがって、この段階では、得られる結果は最高とは言えません。

ここに画像の説明を入力してください

自動化されたソリューションは、「NODATA」に設定された背景と雲の値になるとはNoDataせずにあなたの統計を計算する(見ることがこの投稿を NoDataにせずに統計を計算の詳細については、とこの1同様のNoDataに4000よりも大きく設定値に例えば)。単一の画像の場合、私は通常、可能な限り最大の雲のないサブセットの統計を計算します。"NoData"(画像の左上)がないサブセットからの統計を使用すると、これが最終結果になります。範囲が「安全な」範囲の約半分であることがわかります。これは、2倍のコントラストがあることを意味します。

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 2017年

7

TCI.jp2ファイルに含まれているファイルを使用するだけSAFE.zipです。これらのファイルは、2016年10月より前のS2ファイルでは使用できません。

または、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 4096Sentinel-2シーンには妥当な値であり、afaikはTCI.jp2画像にも使用されます。より明るい結果を得たい場合は、4096を下げます。


5

質問でリンクした解決策を探している場合は、チュートリアルでダウンロードするために提供されている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

画像のヒストグラムは、画像に非常に暗い表面しかないことを示唆していることに注意してください(これはそうですか?)。 10000-たとえば、画像に雲がある場合など、より高い値も可能でない場合。

次に、バンドをマージして、イメージの外観を微調整できます。

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

入力画像から出力画像に値をスケーリングするときは、常に入力画像の最大値と最小値を確認してください。例えば、最初のバンドについて、スケールパラメータは、この-scale 0 4818 0 255のようでなければならない
ミロスMiletic
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.