我有一个有趣的应用程序,它需要将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(没有轴或框架)以最快的方式。由于我既不是程序员也不是数学家,所以我可能忽略了一些简单的事情。
任何人和所有建议都将受到赞赏!
答案 0 :(得分:2)
我认为您本质上是想进行极性变形,将其转换为
对此:
我在终端机中使用 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中完成:
或者您也可以“掏空” 到我上面使用的 ImageMagick 命令。
关键字:Python,图像处理,极坐标,反极坐标,笛卡尔坐标,变换,雷达,绘图
答案 1 :(得分:0)
Matplotlib并不是一个好的解决方案。
OpenGL支持的绘图。界面还不够完善,但是已经有很多功能可用。只需单击examples,然后尝试查找不必编写GLSL的功能(不在文件夹“ gloo”中但在“情节”或“场景”中的函数)。
可以很好地进行实时绘图,但是目前尚未维护。仅限Qt4。
也未维护。仅限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数组,则可能会降低性能。