Как объединить 3 изображения JPEG2000 с высоким диапазоном в одно изображение RGB?

Я загружаю 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')

Результат выглядит очень плохим, очень тусклым и почти черно-белым.

Я хотел бы что-то вроде этого:

или как предварительный просмотр

пока моя версия

(извиняюсь)

UDPATE

Я обнаружил, что изображения, вероятно, 12-битные. Когда я попробовал 12, я увидел передержку. Итак, экспериментально я обнаружил, что лучшее качество для 14 битности.

UDPATE 2

Хотя даже с 14 битами у меня небольшие участки передержки. Вот Багамские острова:

1 ответ

Я изучил эту проблему сегодня, и я думаю, что ваша проблема - это разделение. Как сказал Каземакасе, разумно умножить на 255 и подрезать на максимальное значение, но матрица очень большая (например, слишком большая для обработки). Я использовал это:

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 для получения более подробной информации.

К сожалению, данные для полос 1 и 5 намного меньше, чем для полосы 3. Поэтому я изменил их размер с помощью cv2 (у PIL были проблемы с размером и всеми остальными). Так что это сделало довольно мало ошибок вычислений, и новая картина выглядит не намного лучше.

Другие вопросы по тегам