我正在尝试将多波段 tif 文件(4 个波段 - [蓝色、绿色、红色、红外])读入 xarray ,然后使用 Jupyter 笔记本中的HoloViews显示为 RGB 。作为参考,我大致遵循了此处的 RGB png 示例:http://holoviews.org/reference/elements/matplotlib/RGB.html
最终的 RGB 图像确实显示出来,但是,通过使用 np.dstack 组合 DataArray,我丢失了 x/y 坐标尺寸。最终图像中的 x/y 坐标默认为 ~ -0.5 - +0.5。
我不知道如何在整个过程中传达坐标尺寸,或者如何将原始坐标尺寸应用到最终图像中。
# read .tif ximg = xarray.open_rasterio('path/to/tif') print('1.', type(ximg), ximg.coords['x'].values) # convert to hv.Dataset r_ds = hv.Dataset(ximg[2,:,:], kdims=['x','y'], vdims='Value') g_ds = hv.Dataset(ximg[1,:,:], kdims=['x','y'], vdims='Value') b_ds = hv.Dataset(ximg[0,:,:], kdims=['x','y'], vdims='Value') print('2.', type(r_ds), r_ds.dimension_values('x')) # scale to uint8 r = np.squeeze((r_ds.data.to_array().astype(np.float64)/8190)*255).astype('uint8') g = np.squeeze((g_ds.data.to_array().astype(np.float64)/8190)*255).astype('uint8') b = np.squeeze((b_ds.data.to_array().astype(np.float64)/8190)*255).astype('uint8') print('3.', type(r), r.coords['x'].values) # combine to RGB dstack = np.dstack([r, g, b]) # lose coordinate dimensions here print('4.', type(dstack), 'NO COORDS') rgb = hv.RGB(dstack, kdims=['x','y']) print('5.', type(rgb), rgb.dimension_values('x')) 1. <class 'xarray.core.dataarray.DataArray'> [557989.5 557992.5 557995.5 ... 563194.5 563197.5 563200.5] 2. <class 'holoviews.core.data.Dataset'> [557989.5 557989.5 557989.5 ... 563200.5 563200.5 563200.5] 3. <class 'xarray.core.dataarray.DataArray'> [557989.5 557992.5 557995.5 ... 563194.5 563197.5 563200.5] 4. <class 'numpy.ndarray'> NO COORDS 5. <class 'holoviews.element.raster.RGB'> [-0.49971231 -0.49971231 -0.49971231 ... 0.49971231 0.49971231 0.49971231]
显示所需坐标的示例,使用从r_ds、g_ds及b_ds以上创建的 HoloViews 图像:
r_ds
g_ds
b_ds
使用上面命名的 HoloViews RGB 显示不需要的坐标的示例rgb:
评论中提到的 Landsat 示例使用data形式为 的参数(xdim, ydim, R, G, B, A),将所需的 x/y 坐标应用于图像。
data
(xdim, ydim, R, G, B, A)
Landsat 示例:http://datashader.org/topics/landsat.html
rgb = hv.RGB( ( ximg['x'], ximg['y'], r.data[::-1], g.data[::-1], b.data[::-1] ), vdims=list('RGB') )