cartopy和pyresamp在卫星影像投影中的差异

2024-04-25 04:12:58 发布

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

我写了一个python脚本来投影和叠加邓迪大学的地球同步卫星图像,这样生成的图像就可以用于xplanet渲染地球表面。该工具的源代码可以在https://github.com/jmozmoz/cloudmap/tree/cartopy(这是支持cartopy的分支)

该工具支持两个不同的python库来在平面地图上投影地球静止图像:pyresample和cartopy。在

我发现以下差异/问题:

  1. pyresample比cartopy快得多(取决于输出图像的大小,最大可达10倍)
  2. 输出的图像不同:使用pyresample的结果显示出更强的对比度。 有关示例,请参阅位于https://github.com/jmozmoz/cloudmap/tree/cartopy/debug的调试目录
  3. 如果使用多处理库并行执行投影,则cartopy版本将崩溃,并显示以下错误消息:

    Fatal Python error: PyEval_RestoreThread: NULL tstate
    

为什么卡通片慢得多呢?pyresample是用C代码完成的吗?cartopy应该支持多处理吗?如何解决对比度的问题?在

谢谢你的帮助


Tags: 工具https图像github脚本comtree地球
1条回答
网友
1楼 · 发布于 2024-04-25 04:12:58

1。pyresample比cartopy快得多(取决于输出图像的大小,最高可达10倍)

cartopy重投影功能还没有以任何方式进行优化,尽管它在幕后使用scipy ckdtree功能,但算法本身是用Python编写的。我似乎记得,一个快速的胜利是使用https://pypi.python.org/pypi/kdtree,它从内存中提供了一个相当合理的加速,而很少的工作,cartopy.img_transform将是需要更改的地方。在

Cartopy的重投影功能可能也要付出非常普遍的代价——你可以在任何投影中提供一个图像,它将把它放到任何投影中,处理不连续和撕裂问题。不过,如果能将pyresample的功能(以及GDAL的功能)结合起来,让用户有机会在某些情况下加快重新投影的速度,那就太酷了。在

2。输出图像不同:使用pyresample的结果显示出更强的对比度。

看起来您正在创建一个matplotlib图形来重新采样图像并使用mpl的savefig功能。这个过程有可能导致对比度丢失。我建议只使用cartopy的重投影功能,而不向图形添加图像并保存图形(最后的示例)。在

3。如果使用多处理库并行执行投影,则cartopy版本将崩溃,并显示以下错误消息:

这真的让我很惊讶,因为在cartopy中没有C代码在执行重投影。因此,您要么发现了scipy的一个bug,要么更可能是遇到了numpy/matplotlib的问题(google提供了一些关于您的异常和matplotlib和/或numpy的结果,例如https://github.com/numpy/numpy/issues/1270)。在

好的,下面是我如何在不使用matplotlib的情况下进行重投影:

import cartopy.crs as ccrs
from cartopy.img_transform import warp_array
import numpy as np    
import PIL.Image


# I've downloaded the file from https://github.com/jmozmoz/cloudmap/blob/78923d15ad906eaa6d1dcab168a6364643d3fc94/debug/2014_8_7_1800_GOES15_4_S1.jpeg
# and clipped the image. 
fname = '2014_8_7_1800_GOES15_4_S1.jpeg'
img = PIL.Image.open(fname)

result_array, extent = warp_array(np.array(img),
                                  source_proj=ccrs.Geostationary(),
                                  target_proj=ccrs.PlateCarree(),
                                  target_res=(4000, 2000))

result = PIL.Image.fromarray(result_array)
result.save('reprojected.jpeg')

最终得到的图像看起来像:

Reprojected image

使用这个功能进行一些优化是有可能的-首先要做大量的工作来创建kdtree(可能会被缓存),而另一个很大的工作是从原始图像计算索引(同样,缓存非常好),这将从本质上减少和重复对numpy索引问题的重新投影。在

如果您想了解性能的可能性或对比度问题(我不确定我的解决方案是否修复),请随时在github回购上公开一个问题,我们可以讨论一些选项。在

谢谢你的邀请,还有!在

相关问题 更多 >