use*_*380 6 python arrays numpy
我正在研究检测alogrythm以检测雷达图像上的风暴细胞.我在2d numpy数组中有雷达数据,我们在底图上绘制.我们得到了azymuth和rangebins数据,我们将其置于具有lat/lon坐标的极化网格中.
我们的numpy数组中的值基于dBZ高度,范围从零到最大80.
这里打印出名为data的numpy数组:
[[-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]]
Run Code Online (Sandbox Code Playgroud)
而-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
Run Code Online (Sandbox Code Playgroud)
因此,检测的次数会经常波动.也许我需要像DBscan这样的东西?
有人可以帮助我吗?
如果你可以使用 scipy,我认为这样的事情会起作用:
import scipy.ndimage
mask = data > 20
labels, num_labels = scipy.ndimage.label(mask)
custers = scipy.ndimage.find_objects(labels)
Run Code Online (Sandbox Code Playgroud)
现在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
Run Code Online (Sandbox Code Playgroud)