我想显示卫星图像(最好使用python,但欢迎使用其他解决方案)。它包含一个浮点参数P,其维数为NxM,每个像素由纬度和经度(每个大小为NxM)进行地理定位。所以我想:
(1)创建具有相关色标的参数P的图像。图像不应重新采样,因此它应具有尺寸NxM
(2)在此图像上显示海岸线
目前,我可以(1)使用PIL。我还可以使用底图库来显示图像和海岸线,但我不知道如何在没有重投影的情况下通过保留大小为NxM的图像原生投影来实现它。
编辑:参数P不包含有关海岸线的任何信息。只应使用像素的位置(lat,lon)来覆盖海岸线。例如,可以从gshhs获得海岸线的坐标。 gshhs实际上在底图库中使用。
答案 0 :(得分:0)
如果您要做的只是增强陆地和水之间的界限,那么使用高通滤波器可能会更好。
例如,从Lena开始:
并应用高通滤波器:
然后将高通叠加在原始顶部:
(可以找到更多细节和示例here)。
您可以在scipy here中找到过滤器。
答案 1 :(得分:0)
对于社区中仍在寻找这个问题答案的人来说,我目前正在实施的方法(对于类似的目的 - 我试图测试卫星数据的地理位置)需要一个landmask。
陆地上有各种各样的土地面具数据集,每个都有不同的规则和特征。我正在使用python中的netCDF4数据,我的landmask是一个网格化的.nc数据集,其中海洋元素的值为1,而陆地元素的值为0。
迭代我的卫星数据,我将每个纬度和经度值乘以landmask中每度数的元素数。就我而言,纬度/经度每度有120个元素,所以
len(lons)/360
len(lats)/180
更通用的写作方式包括用120代替
my_mask = np.zeros(data.shape, dtype=int)
分别。如果使用numpy数组(python netCDF4模块就是这种情况),这两个操作的例子几乎可以瞬间完成。
现在我创建了一个自己的掩码:它必须与数据阵列具有相同的尺寸(对于那些不熟悉卫星的人来说,数据,拉特和长子阵列都具有相同的尺寸):
landmask[lon_inds[i,j],lat_inds[i,j]]
现在我们需要做的就是替换有海岸线的面具中的值。这是通过迭代lat_inds和lon_inds数组来完成的,在
的landmask中查找值mask[i,j]
并更改
的值landmask[lon_inds[i,j]-1,lat_inds[i,j]]
landmask[lon_inds[i,j]+1,lat_inds[i,j]]
landmask[lon_inds[i,j],lat_inds[i,j]-1]
landmask[lon_inds[i,j],lat_inds[i,j]+1]
如果任何邻居,则为1
>>> a=[1,2,3,4,5,6]
>>> iter(a)
<listiterator object at 0x7f96f3273950>
>>> next(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list object is not an iterator
>>> ia=iter(a)
>>> next(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list object is not an iterator
>>> next(ia)
1
不等于0(当然,通过添加对角线相邻单元格可以生成更平滑的海岸线,但这不是必需的,因为希望您应该使用比您的卫星数据更清晰的空间分辨率的Landmask数据集)