从numpy数组中检测高值

时间:2014-05-05 10:05:52

标签: python arrays numpy

我正在研究检测alogrythm以检测雷达图像上的风暴细胞。 我在2d numpy数组中有雷达数据,我们在底图上绘制。 我们得到了azymuth和rangebins数据,我们将它放在具有lat / lon坐标的极化网格中。

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

这里打印出名为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这样的东西?

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

如果你可以使用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