def filter_gabella_b(img, thrs=0.):
r"""Second part of the Gabella filter comparing area to circumference of
contiguous echo regions.
Parameters
----------
img : array_like
thrs : float
Threshold below which the field values will be considered as no rain
Returns
-------
output : array_like
contains in each pixel the ratio between area and circumference of the
meteorological echo it is assigned to or 0 for non precipitation
pixels.
See Also
--------
filter_gabella_a : the first part of the filter
filter_gabella : the complete filter
Examples
--------
See :ref:`notebooks/classify/wradlib_clutter_gabella_example.ipynb`.
"""
conn = np.ones((3, 3))
# create binary image of the rainfall field
binimg = img > thrs
# label objects (individual rain cells, so to say)
labelimg, nlabels = ndi.label(binimg, conn)
# erode the image, thus removing the 'boundary pixels'
binimg_erode = ndi.binary_erosion(binimg, structure=conn)
# determine the size of each object
labelhist, edges = np.histogram(labelimg,
bins=nlabels + 1,
range=(-0.5, labelimg.max() + 0.5))
# determine the size of the eroded objects
erodelabelhist, edges = np.histogram(np.where(binimg_erode, labelimg, 0),
bins=nlabels + 1,
range=(-0.5, labelimg.max() + 0.5))
# the boundary is the difference between these two
boundarypixels = labelhist - erodelabelhist
# now get the ratio between object size and boundary
ratio = labelhist.astype(np.float32) / boundarypixels
# assign it back to the objects
# first get the indices
indices = np.digitize(labelimg.ravel(), edges) - 1
# then produce a new field with the ratios in the right place
result = ratio[indices.ravel()].reshape(img.shape)
return result
评论列表
文章目录