【问题标题】:Visualizing RGB bands of RGBN image可视化 RGBN 图像的 RGB 波段
【发布时间】:2019-04-28 02:43:51
【问题描述】:

我有一个 PlanetScope 的 RGBN 波段 .tif 卫星图像,我想为神经网络进行预处理。当我在 QGIS 中查看图像时,我得到了一个漂亮的 RGB 图像,但是当作为一个 numpy 数组导入时,图像非常轻。图片上的一些信息:

Type of the image :  <class 'numpy.ndarray'>

Shape of the image : (7327, 7327, 5)
Image Height 7327
Image Width 7327
Image Shape (7327, 7327, 5)
Dimension of Image 3
Image size 268424645
Maximum RGB value in this image 65535
Minimum RGB value in this image 1

图片为uint16类型。最后一个波段 (pic[:,:,5]) 在所有情况下都只显示一个奇异值 (65535)。因此,我认为应该去掉这个波段,留下RGBN波段,其信息如下:

Type of the image :  <class 'numpy.ndarray'>

Shape of the image : (7327, 7327, 4)
Image Height 7327
Image Width 7327
Image Shape (7327, 7327, 4)
Dimension of Image 3
Image size 214739716
Maximum RGB value in this image 19382
Minimum RGB value in this image 1

知道 uint16 图像的范围是 0-65535,RGBN 图像的最大值 (19382) 似乎相当低。随后,函数 'skimage.io.imshow(image)' 显示近乎白色的图像。我不明白为什么 QGIS 能够以真彩色正确显示图像,而 python 却不能。

图片通过pic = skimage.io.imread("planetscope_20180502_43.tif")加载

我尝试使用img_scaled = pic / pic.max() 缩放图像并将其转换为uint8,然后使用img_as_ubyte(pic) 查看图像,但没有成功。我用skimage.io.imshow(pic)查看图像。

如有需要,可以下载图片here。我合并了图像,因为不知何故似乎无法使用某些包导入图像(例如 Tifffile 不适用于此 tif 文件)。

【问题讨论】:

  • 请提供一些用于加载图像的最小代码。另外——当你在编辑它时——一次只有一个问题。 (我建议删除“Furthermore .... 非常广泛的讨论”部分,但适合自己。)
  • 感谢您的回复,我已经编辑了原始问题!如果缺少更多信息,请告诉我。
  • edit您的问题标题更能说明问题的内容——您的问题可能会吸引更多访问者。 “图像处理”非常通用,也是您的标签之一的名称。试着想出一个不重复标签信息的标题。
  • 标题已编辑,我会在以后的帖子中记住您的建议。

标签: image-processing neural-network python-imaging-library rgb image-scaling


【解决方案1】:

谢谢 w-m,我能够在此基础上进行构建并弄清楚了。由于 w-m 已经很好地阐述了这个问题,我将把我为解决问题而编写的代码留在这里:

for i in range(0,4):
    min_ = int(np.percentile(image[:,:,i],2))
    max_ = int(np.percentile(image[:,:,i],98))

    np.maximum(image[:,:,i])
    np.minimum(image[:,:,i])

    image[:,:,i] = np.interp(image[:,:,i], image[:,:,i].min(), image[:,:,i].max(), (0,255))

image_8bit_scaled = skimage.img_as_ubyte(image)

【讨论】:

    【解决方案2】:

    RGB通道最大值低于N通道:

    >>> pic.max(axis=(0,1))
    array([10300,  7776, 11530, 19382, 65535], dtype=uint16)
    

    但是看看 RGB 通道的平均值:它们比 max/2 小得多:

    >>> pic.mean(axis=(0,1))
    array([  439.14001492,   593.17588875,   542.4638124 ,  3604.6826063 ,
       65535.        ])
    

    您在此处有一张高动态范围 (HDR) 图像,并希望将其高范围压缩为 8 位以进行显示。由于最高峰值比平均图像值高一个数量级,因此无法使用最大值进行线性缩放。绘制 RGB 值的直方图:

    如果您使用略高于平均值的某个因子进行线性缩放,而忽略裁剪其余(现在过度曝光)值,您可以显示它以查看您是否有有效数据:

    rgb = pic[..., :3].astype(np.float32) / 2000
    rgb = np.clip(rgb, 0.0, 1.0)
    

    但要获得正确的图像,您需要查看相机对数据的响应是什么,以及这些 HDR 图像通常如何压缩为 8 位进行显示(我不熟悉卫星成像)。

    【讨论】:

      猜你喜欢
      • 2015-06-16
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2015-08-04
      • 2015-01-12
      • 1970-01-01
      相关资源
      最近更新 更多