使用Python快速绘制极地雷达数据?

时间:2019-12-06 03:18:28

标签: python matplotlib image-processing

我有一个有趣的应用程序,它需要将3D极坐标数据(该点的角度,距离和值)转换为表示该数据的图像。我在自定义应用程序中使用的是NOAA NEXRAD雷达数据。

数据存储在3个数组中,分别是range_data(距雷达的距离,以米为单位,共1800个点),azimuth_data(距雷达的角度,以0.5度为步长,720个点),以及radar_data(720x1800数组,其中每个数组均包含一个数据值)范围和方位角的组合)。这是我从NOAA获取数据的格式,因此在这方面我无能为力。

现在,我以下列方式(基本上是this example from the library I'm using)使用matplotlib pcolormesh对其进行绘制:

<div class="string-check string-check-bordered-primary mb-2">
    <input type="checkbox" name="grace" class="form-check-input" id="grace">
    <label class="string-check-label" for="grace">
        <span class="ml-2" for="grace"></span>
    </label>
</div>

当前的主要难题是使用savefig()命令实际绘制和保存绘图。每个图像大约需要7秒钟,要处理20组左右的数据集,对于我所想到的应用程序来说,它花费的时间太长了。

因为我只需要颜色映射的数据作为图像,所以我实际上并不需要大多数matplotlib的工具和功能。我认为必须有一种更快的方法来从原始数据生成此图像。

我尝试单步执行数据并逐个填充x-y数组,然后使用PIL保存该数组,但是手动遍历数据比使用matplotlib花费的时间更长。用numpy进行数组运算会更快,但是我真的想不出任何在坐标系之间转换数据的运算。

要更简单地解决这个问题,我已经将极性数据以value [angle,distance]的格式存储在720x1800 Radar_data数组中,并且我想生成一个colormapped radar image like this one(没有轴或框架)以最快的方式。由于我既不是程序员也不是数学家,所以我可能忽略了一些简单的事情。

任何人和所有建议都将受到赞赏!

4 个答案:

答案 0 :(得分:2)

我认为您本质上是想进行极性变形,将其转换为

enter image description here

对此:

enter image description here

我在终端机中使用 ImageMagick 做到了这一点,因为它简便快捷,并且已安装在大多数Linux发行版中,并且可用于macOS和Windows。我使用的命令是:

magick image.png -virtual-pixel Black -distort Polar 0 result.png

注意:如果您使用的是 ImageMagick v6,请在前面的命令中将magick替换为convert

注意:为了进行实验,我将原始图像制作如下:

magick -size 1800x720  gradient:red-blue image.png 

如果这是您想要的,则可以使用多种工具中的任何一种在Python中完成:

  • skimage -warp_polar()
  • OpenCV -warpPolar()
  • 想要-distort()

或者您也可以“掏空” 到我上面使用的 ImageMagick 命令。

关键字:Python,图像处理,极坐标,反极坐标,笛卡尔坐标,变换,雷达,绘图

答案 1 :(得分:0)

Matplotlib并不是一个好的解决方案。

  • Vispy

    OpenGL支持的绘图。界面还不够完善,但是已经有很多功能可用。只需单击examples,然后尝试查找不必编写GLSL的功能(不在文件夹“ gloo”中但在“情节”或“场景”中的函数)。

  • PyQtGraph

    可以很好地进行实时绘图,但是目前尚未维护。仅限Qt4。

  • PyQwt

    也未维护。仅限Qt4。

您也可以将自定义GUI放在一起,而无需进行太多工作,周围有很多示例。例如here。只需查找“实时绘制Qt”即可。

答案 2 :(得分:0)

值得指出的是,以下代码对我来说需要1秒钟:

import numpy as np
import matplotlib.pyplot as plt
import time

t = time.time()
range_data = np.arange(1800)
azimuth_data = np.linspace(0, 359.5, 720)
radar_data = np.dot(np.atleast_2d(azimuth_data).T , np.atleast_2d(range_data))

x = range_data * np.sin(np.deg2rad(azimuth_data))[:,None]
y = range_data * np.cos(np.deg2rad(azimuth_data))[:,None]

fig, ax = plt.subplots(1,1,figsize=(4,4))
ax.pcolormesh(x,y,radar_data)
ax.set_aspect('equal','datalim')

ax.set_axis_off()

plt.savefig("radar.png", transparent=True, dpi=100)
print(time.time()-t)

如果您将分辨率减半,即900 x 360点而不是1800 x 720,则只需0.3秒。因此,这主要还是要获取多大图像的问题。

答案 3 :(得分:0)

为了确保您已经: 如果您的azimuth_data不是一个numpy数组,则可能会降低性能。