从numpy数组中检测高值



我正在研究一种探测算法,用于探测雷达图像上的风暴单体。我有二维numpy数组的雷达数据,我们把它们绘制在底图上。我们得到了奇异度和距离的数据,我们把它们放入了一个极格中,带有经纬度坐标。

我们的numpy数组中的值是基于dBZ高度的,范围从0到最大80。

下面是我们的numpy数组data的输出:

[[-31.5 -31.5  16.5 ..., -31.5 -31.5 -31.5]
[-31.5 -31.5 -31.5 ..., -31.5 -31.5 -31.5]
[-31.5 -31.5 -31.5 ..., -31.5 -31.5 -31.5]
...,
[-31.5 -31.5 -31.5 ..., -31.5 -31.5 -31.5]
[-31.5 -31.5 -31.5 ..., -31.5 -31.5 -31.5]
[-31.5  11.5 -31.5 ..., -31.5 -31.5 -31.5]]

而-31.5表示空值或隐藏值。我们只需要正数。即使小数也没有意义。

那么我们要做什么呢:

检测高值的集群,并使它们在该单元格周围成为一个红色正方形。我已经尝试了一些图像蒙版,但我被困在那里。我甚至不知道一个图像蒙版是否是一个很好的解决方案。

下面是我处理数据的代码。

gain             = 0.5                                  
offset           = -31.5
az = np.arange(0.,360.,360./scan["scan_number_azim"])
r  = np.arange(scan["scan_start_azim"], (scan["scan_start_azim"] + scan["scan_number_range"] * rscale), rscale)
data = gain * raw["scan2/scan_Z_data"] + offset

所以检测到的计数会经常波动。也许我也需要像DBscan这样的东西?

有人能帮我一下吗?

如果你能使用scipy,我想像这样的东西会起作用:

import scipy.ndimage
mask = data > 20
labels, num_labels = scipy.ndimage.label(mask)
custers = scipy.ndimage.find_objects(labels)

clusters现在将是切片元组的列表,您可以获得矩形的开始和结束行和列:

for row_slice, col_slice in clusters:
    start_row = row_slice.start
    end_row = row_slice.stop
    start_col = col_slice.start
    end_col = col_slice.stop
    # draw your rectangle

最新更新