Scikit-image 从 tif 读取卫星图像并删除所有 rows/columns 的无数据值

Scikit-image read satellite image from tif and drop all rows/columns with a nodata value

我正在尝试 运行 对存储为 tif 的卫星衍生栅格进行阈值算法。场景边界上出现的无数据值 (-3.40282306e+38) 正在算法中考虑,并且会导致不良行为。我正在寻找一种方法在 运行 阈值算法之前删除所有没有数据值的 rows/columns。

我试图将所有没有数据值的单元格设置为 np.nan 然后删除它们,但我没有得到我正在寻找的结果。

我的代码:

import numpy as np
from skimage import filters
from skimage import exposure
from skimage.io import imread, show
from skimage.filters import try_all_threshold

no_data_value = -3.40282306e+38

ndwi = imread(<'my.tif'>)
ndwi[ndwi == no_data_value] = np.nan
ndwi = ndwi[~np.isnan(ndwi).any(axis=1)]
val = filters.threshold_otsu(ndwi)

两件事,

您的值可能不完全是-3.40282306e+38。如果没有别的是那么大的负值,我可能会将过滤器更改为 -3e+38.

此外,我认为您在 "is not null" 过滤器的开头缺少数组。这条线就在这里 "ndwi = nwdi[~np.isnan(ndwi)]"

no_data_value = -3.0e+38
ndwi = imread(<my.tif>)
ndwi[ndwi <= no_data_value] = np.nan
ndwi = nwdi[~np.isnan(ndwi)]
val = filters.threshold_otsu(ndwi)

我的光栅值范围从 -1 到 1,所以变化

ndwi[ndwi == no_data_value] = np.nan

ndwi[ndwi <= -1] = np.nan

给了我想要的结果。似乎有点 hack 但有效。

filters.threshold_otsu不关心传入数组的形状,所以你也可以这样做:

threshold_otsu(z[z > -1])