Загрузите изображение RGB в python из продукта ESA Sentinel-2 и сохраните его с помощью openCV

Начиная с ESA snap, для изображения RGB мы должны поместить Band 4 в Red Channel, Band 3 в Green Channel и Band 2 в Blue Channel. Как мы можем прочитать эти группы с Python в numpy массив, чтобы мы могли делать любую обработку изображений, которую мы хотим, а затем сохранить изображение RGB на диске?

from snappy import Product
from snappy import ProductIO
import numpy as np
import cv2

product = ProductIO.readProduct(path_to_product)

width = product.getSceneRasterWidth()
height = product.getSceneRasterHeight()

# Natural colors 
red = product.getBand('B4')
green = product.getBand('B3')
blue = product.getBand('B2')

Например, вот тип одной из вышеуказанных переменных (то же самое для остальных):

type(red)
# org.esa.snap.core.datamodel.Band

Как я могу получить массивы из этих данных, а затем сохранить их на диск в виде изображений jpg?

1 ответ

Решение
#Read in channel's pixels    
red_pixels = np.zeros(width * height, np.float32)
red.readPixels(0, 0, width, height, red_pixels)

green_pixels = np.zeros(width * height, np.float32)
green.readPixels(0, 0, width, height, green_pixels)

blue_pixels = np.zeros(width * height, np.float32)
blue.readPixels(0, 0, width, height, blue_pixels)

#Reshape to image dimensions
red_pixels.shape =  height, width
green_pixels.shape =  height, width
blue_pixels.shape =  height, width

#Combine into a RGB image
rgb=np.zeros((height,width,3))
rgb[...,0] = red_pixels
rgb[...,1] = green_pixels
rgb[...,2] = blue_pixels

Пока у нас есть изображение RGB в numpy массив со значениями с плавающей точкой. Чтобы записать на диск изображение в формате jpg, сначала мы обрезаем большие значения, чтобы сделать изображение ярче, а затем преобразуем изображение в целые значения 0-255.

rgb2 = ((np.clip(rgb.copy(),0,1))*255).astype('uint8')
#Reverse Red-Blue Channels as open cv will reverse again upon writing image on disk
cv2.imwrite('image_name.jpg',rgb2[...,::-1])
Другие вопросы по тегам