如何用Python阅读JPG2000?

时间:2017-05-18 15:23:05

标签: python numpy image-processing matplotlib jpeg2000

我用matplotlib读了几张JP2(JPEG200)图片,得到了大数字的numpy数组,超过40000.

阅读代码:

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可以包含更大的动态范围?如何将其转换为普通图像?刚刚正常化?什么是分母?

文件示例如下:enter image description here

3 个答案:

答案 0 :(得分:4)

  

问题:这是否意味着JP2可以包含更大的动态范围?

Yes, it does

  

JPEG 2000支持任何位深度,例如16位和32位浮点像素图像,以及任何色彩空间。

  

问题:如何将其转换为普通图像?刚刚正常化?什么是分母?

HDR图像必须通过色调映射映射到8位图像,色调映射通常是非线性映射。不同的色调映射曲线将产生不同的结果。你可以使用OpenCV来完成它,如OpenCV tutorial on HDR image processing

所示
# 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')

答案 1 :(得分:0)

我只是将22.5除以B02,B03,B04并将其合并。

看到此页面 https://knowledge.safe.com/articles/43742/making-rgb-images-with-sentinel-data.html

我的代码是

b_r = im_b_04/22.5;
b_g = im_b_03/22.5;
b_b = im_b_02/22.5;

RGB_gt = numpy.zeros([len(b_r), len(b_r[0]), 3], np.uint8)
RGB_gt[:, :, 0] = b_r;
RGB_gt[:, :, 1] = b_g;
RGB_gt[:, :, 2] = b_b;

有效。

答案 2 :(得分:0)

import rasterio

ds = rasterio.open(path_to_jp2_image)
ds.read(1)

见:can't open jp2 (from sentinel) with python rasterio,gdal