更新
任何想法如何从特定范围值光栅图像中删除像素
使用numpy/scipy
或gdal
?
或如何使用栅格计算表达式创建具有某些类的新栅格(更好)
例如我有一个光栅图像 5级:
1. 0-100
2. 100-200
3. 200-300
4. 300-500
5. 500-1000
我想删除1类范围值
或者可能是班级1,2,4,5
我从这个脚本开始:
import numpy as np
from osgeo import gdal
ds = gdal.Open("raster3.tif")
myarray = np.array(ds.GetRasterBand(1).ReadAsArray())
#print myarray.shape
#print myarray.size
#print myarray
new=np.delete(myarray[::2], 1)
但我无法完成
答案 0 :(得分:2)
栅格是值的二维数组,每个值存储在一个像素(代表图像元素)中。每个像素必须包含一些信息。无法从阵列中删除或删除像素,因为栅格通常被编码为简单的1维位串。元数据通常有助于解释换行符的位置和位串的长度,因此1-D位串可以理解为2-D阵列。如果“移除”一个像素,则会中断光栅。二维网格不再有效。
当然,在许多情况下,您确实希望有效地丢弃或清除数据栅格。这样的例子可能是从海面温度的光栅中移除覆盖土地的像素。为实现此目标,许多地理空间栅格格式包含描述所谓NoData值的元数据。包含NoData值的像素解释为不存在。回想一下,在栅格中,每个像素必须包含一些信息。 NoData范例允许满足栅格的结构和格式,同时还可以显示或分析遮罩像素。掩模像素上仍有数据(位,1和0),但它仅用于将像素识别为无效。
考虑到这一点,这是一个使用gdal
的示例,它将屏蔽0-100范围内的值,因此它们是NoData,并且“不存在”。 NoData值将指定为0.
from osgeo import gdal
# open dataset to read, and get a numpy array
ds = gdal.Open("raster3.tif", 'r')
myarray = ds.GetRasterBand(1).ReadAsArray()
# modify numpy array to mask values
myarray[myarray <= 100] = 0
# open output dataset, which is a copy of original
driver = gdal.GetDriverByName('GTiff')
ds_out = driver.CreateCopy("raster3_with_nodata.tif", ds)
# write the modified array to the raster
ds_out.GetRasterBand(1).WriteArray(myarray)
# set the NoData metadata flag
ds_out.GetRasterBand(1).SetNoDataValue(0)
# clear the buffer, and ensure file is written
ds_out.FlushCache()