3

我编写了一个 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
    

那么为什么 cartopy 这么慢呢?pyresample 是否在 C 代码中完成工作?cartopy 应该支持多处理吗?以及如何解决对比度问题?

谢谢您的帮助

4

1 回答 1

5

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.如果使用multiprocessing库进行并行投影,cartopy版本会崩溃,报错如下:

这真的让我感到惊讶,因为 cartopy 中没有 C 代码正在重新投影。因此,您要么发现了 scipy 的错误,要么更可能遇到了 numpy/matplotlib 的问题(谷歌提供了一些结果与您的异常和 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')

生成的图像(最终)看起来像:

重新投影的图像

使用此功能进行某些优化有一些真正的可能性 - 首先创建 kdtree 完成了大量工作(可能会被缓存),另一大块工作是从原始图像计算索引(再次,缓存非常好)这将基本上减少和重复对 numpy 索引问题的重新投影。

如果您想研究性能可能性或对比问题(我不确定我的解决方案是否修复),请随时在 github repo 上提出问题,我们可以讨论一些选项。

谢谢你的提问,还有HTH!

于 2014-08-08T08:06:10.433 回答