如何将3个高范围JPEG2000图像组合成单个RGB图像?

时间:2017-05-24 11:33:55

标签: python image-processing colors jpeg2000

我正在使用以下代码下载Sentinel-2图像

import boto3

s3 = boto3.resource('s3', region_name='us-east-2')
bucket = s3.Bucket('sentinel-s2-l1c')
path = 'tiles/36/R/UU/2017/5/14/0/'

object = bucket.Object(path + 'B02.jp2')
object.download_file('B02.jp2')
object = bucket.Object(path + 'B03.jp2')
object.download_file('B03.jp2')
object = bucket.Object(path + 'B04.jp2')
object.download_file('B04.jp2')

我在磁盘上获得了3张灰度JP2图像。

然后我尝试将颜色图层与以下代码混合

import matplotlib.image as mpimg
import numpy as np
from PIL import Image

Image.MAX_IMAGE_PIXELS = 1000000000

print('Reading B04.jp2...')
img_red = mpimg.imread('B04.jp2')

print('Reading B03.jp2...')
img_green = mpimg.imread('B03.jp2')

print('Reading B02.jp2...')
img_blue = mpimg.imread('B02.jp2')

img = np.dstack((img_red, img_green, img_blue))

img = np.divide(img, 256)
img = img.astype(np.uint8)

mpimg.imsave('MIX.jpeg', img, format='jpg')

结果看起来非常差,非常暗淡,几乎是黑白色。

我想要这样的事情:

enter image description here

或者喜欢预览

enter image description here

虽然我的版本是

enter image description here

(对不起)

UDPATE

我发现图像可能是12位。当我试过12时,我看到了曝光过度。所以在实验上我发现最好的信息是14位。

UDPATE 2

虽然即使是14位,我也有过多的过度曝光区域。这是巴哈马:

enter image description here

1 个答案:

答案 0 :(得分:0)

我今天研究了这个问题,我认为你的问题就是分裂。像kazemakase说的那样明智的是乘以255和divice乘以最大值,但矩阵非常大(因为太大而无法处理)。 我用过这个:

max_pixel_value = rgb_image.max()
rgb_image = np.multiply(rgb_image, 255.0)
rgb_image = np.divide(rgb_image, max_pixel_value)
rgb_image = rgb_image.astype(np.uint8)

你也使用了错误的乐队(我想,但我不确定!)。红色应为5级和蓝色1或2.有关详细信息,请参阅https://en.wikipedia.org/wiki/Sentinel-2#Instruments

不幸的是,第1和第5频段的数据比第3频段的数据要小得多。因此我用cv2调整了它的大小(PIL在大小和所有方面都有问题)。所以这造成了很少的计算错误,新图片看起来并没有那么好。