python-用cartopy和pyresample投影卫星图像的差异

我已经编写了一个python脚本来投影和叠加来自Dundee大学的对地静止卫星图像,因此生成的图像可以用于xplanet渲染地球表面.该工具的源代码位于https://github.com/jmozmoz/cloudmap/tree/cartopy(这是支持cartopy的分支)

该工具支持两个不同的python库,可将对地静止图像投影在平面地图上:pyresample和cartopy.

我发现以下差异/问题:

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

Fatal Python error: PyEval_RestoreThread: NULL tstate

那么为什么Cartopy这么慢? pyresample是否正在用C代码进行工作?同位素应支持多处理吗?以及如何通过对比解决问题?

谢谢您的帮助

解决方法:

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

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

Cartopy的重新投影功能可能也要付出非常通用的费用-您可以在任何投影中提供图像,并将其放到其他任何投影中,可以毫无问题地处理不连续性和眼泪.不过,在某些情况下,使用pyresample的功能(以及GDAL的功能)确实很酷,以便为用户提供加速重新投影的机会.

2.输出图像有所不同:使用除草样品的结果显示出更强的对比度.

似乎您正在创建一个matplotlib图形来对图像重新采样并使用mpl的savefig功能.此过程有可能导致对比度丢失.我建议您仅使用Cartopy的重新投影功能,而不要在图形上添加图像并保存图形(末尾为示例).

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

这真的让我感到惊讶,因为cartopy中没有C代码正在执行重新投影.因此,您或者发现了一个scipy错误,或者更有可能是您遇到了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')

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

使用此功能进行优化存在一些实际的可能性-首先完成了大量工作(首先可能会缓存)创建kdtree,另一大部分工作是根据原始图像计算索引(再次很好地缓存),这实际上将减少并重复进行重投影,以解决numpy索引问题.

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

感谢您的询问,还有HTH!

上一篇:python Shapely OSError: Could not find lib c or load any of its variants []


下一篇:python – Matplotlib圆形补丁没有光滑的边缘