可视化 RGBN 图像的 RGB 波段
Visualizing RGB bands of RGBN image
我有一张 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 文件)。
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 位以进行显示(我对卫星成像不熟悉) .
谢谢 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)
我有一张 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 文件)。
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 位以进行显示(我对卫星成像不熟悉) .
谢谢 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)