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])
我正在尝试 运行 对存储为 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])