2017-05-18 11 views
3

私はmatplotlibので数JP2(JPEG200)の画像を読み、大きな数字でnumpyの配列を持って、コードを読み取る40000JPG2000をPythonで読むには?

を超えています

img_blue =mpimg.imread('B02.jp2') 
img_green =mpimg.imread('B03.jp2') 
img_red =mpimg.imread('B04.jp2') 

データは次のとおりです。何

[[12290 12694 13034 ..., 1968 2078 2118] 
[12174 12374 12696 ..., 1998 2068 2134] 
[12422 12522 12512 ..., 1990 1972 1990] 
..., 
[ 4268 4276 4064 ...,  0  0  0] 
[ 4174 4114 3938 ...,  0  0  0] 
[ 3954 4036 3906 ...,  

このデータはどういう意味ですか?

JP2にはより大きなダイナミックレンジが含まれている可能性がありますか?どのように私はそれを通常の画像に変換できますか?ただ正規化する?分母とは何ですか?ファイルの

例はここにある:http://sentinel-s2-l1c.s3.amazonaws.com/tiles/37/U/DB/2017/5/10/0/B02.jp2

答えて

4

質問:それはJP2は、大きなダイナミックレンジを含めることができるということですか?

Yes, it does

JPEG 2000は、例えば16ビットのように、任意のビット深度をサポートし、32ビット浮動小数点ピクセル画像、及び任意の色空間。


質問:は、どのように私はそれが正常な画像に変換することができますか?ただ正規化する?分母とは何ですか?

HDRイメージは、一般に非線形マッピングであるトーンマッピングによって8ビットイメージにマップする必要があります。異なるトーンマッピング曲線は、異なる結果をもたらす。 OpenCV tutorial on HDR image processingに示すように、あなたがOpenCVのでそれを行うことができます。

# Play with the gamma value to arrive at a result that you like 
tonemap = cv2.createTonemapDurand(gamma=2.2) 
tonemapped_img = tonemap.process(img.copy()) 
img_8bit = numpy.clip(tonemapped_img*255, 0, 255).astype('uint8') 
+0

をどのように単に正規化よりも優れているガンマで「遊んで」euristicことができますか?私は何かが非線形になることがあることを理解していますが、カーブは何ですか?それを定義する必要があります。私が間違っている? – Dims

+0

@Dimsピクセルの99%が通常の8ビット範囲(0-255)にあり、1%が40000を超えているとします。最大値を255(白)に正規化すると、画像の99%が黒になります。非線形のトーンマッピングカーブを使用すると、さまざまな色合いのグレーでイメージに到達できます。 – Leon

+0

私はこれを理解していますが、私のヒストグラムはなぜこのような性質を持っていますか?これはいくつかのスタンドアーツのためですか?または、これはオブジェクトの性質ですか?通常のJPEGでこのようなプロパティがあるとします。たとえば、中央の小さな黒い文字で大きな白い紙をスキャンしました。なぜこれが真の状況であれば、私は色を再マップするのだろうか? – Dims