用卫星和样本投影卫星图像的差异

时间:2014-08-07 23:44:45

标签: python matplotlib cartopy

我编写了一个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. 上的调试目录
  4. 如果使用多处理库并行执行投影,则折扣版本会崩溃,并显示以下错误消息:

    Fatal Python error: PyEval_RestoreThread: NULL tstate
    
  5. 那么为什么卡车这么慢?是否使用C代码进行工作? cartopy应该支持多处理吗?以及如何解决对比问题?

    感谢您的帮助

1 个答案:

答案 0 :(得分:4)

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

纸盒重投影功能尚未以任何方式进行优化,虽然它使用了scipy ckdtree功能,但算法本身是用Python编写的。我似乎记得快速获胜就是使用https://pypi.python.org/pypi/kdtree从内存中提供了相当合理的加速而几乎没有工作,cartopy.img_transform将是需要进行更改的地方。

Cartopy的重新投影功能可能也付出了非常一般的成本 - 您可以在任何投影中提供图像,并将其放入任何< / em>其他投影,处理不连续和没有问题的眼泪。尽管如此(以及GDAL对此问题)加入pyresample的功能真的很酷,以便在某些情况下为用户提供加速重投影的机会。

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

您似乎正在创建一个matplotlib图形来重新采样图像并使用mpl的savefig功能。该过程可能导致对比度丢失。我建议只使用cartopy的重投影功能,而无需在图形中添加图像并保存图形(示例结尾)。

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

这真让我感到惊讶,因为在重复投影中,没有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 repo上打开一个问题,我们可以通过选项。

感谢您的询问,以及HTH!