Scikitimage从tif读取卫星图像并删除具有nodata值的所有行/列

2024-09-25 00:28:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在一个储存为tif的卫星衍生光栅上运行一个阈值算法。在算法中,场景边界上出现的无数据值(-3.40282306e+38)将被考虑在内,并导致不希望的行为。我在寻找一种方法,在运行阈值算法之前删除所有没有数据值的行/列。在

我试图将所有无数据值的单元格设置为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)

Tags: 数据nofromimport算法datathresholdnp
3条回答

有两件事

你的值可能不完全是-3.40282306e+38。如果没有其他东西是那么大的负值,我可能会把过滤器改成-3e+38。在

另外,我认为您在“is not null”过滤器的开头缺少数组。这里的这一行“ndwi=nwdi[~np.伊斯南(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

^{pr2}$

给我想要的结果。看起来有点老套,但很管用。在

filters.threshold_otsu不关心传入的数组的形状,因此您也可以执行以下操作:

threshold_otsu(z[z > -1])

相关问题 更多 >