def test_filter_window_polar(self): self.img_setup() np.set_printoptions(precision=3) rscale = 250 nrays, nbins = self.img.shape ascale = 2 * np.pi / self.img.shape[0] mean = util.filter_window_polar(self.img, 300, "maximum", rscale) correct = np.array([[0., 1., 1., 1., 0., 0., 0., 0., 0., 0.], [0., 1., 1., 1., 0., 0., 0., 0., 0., 0.], [0., 1., 1., 1., 0., 0., 0., 0., 0., 0.], [0., 1., 1., 1., 0., 0., 0., 0., 0., 0.], [0., 1., 1., 1., 0., 1., 1., 1., 1., 0.], [0., 1., 1., 0., 0., 1., 1., 1., 1., 0.], [1., 1., 0., 0., 0., 1., 1., 1., 1., 0.], [1., 1., 0., 1., 1., 0., 0., 0., 0., 0.], [1., 0., 0., 1., 1., 1., 1., 1., 0., 0.], [1., 0., 0., 1., 1., 1., 1., 1., 0., 0.], [1., 0., 0., 1., 1., 1., 1., 1., 0., 0.], [1., 0., 0., 1., 1., 1., 1., 1., 0., 0.], [1., 0., 0., 1., 1., 1., 1., 1., 0., 0.], [1., 0., 0., 1., 1., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 1., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 1., 1., 1., 0., 0., 0., 0., 0.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 0., 0., 0., 0., 0.], [1., 1., 1., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 1., 1., 0., 0., 0., 0., 0., 0., 0.]]) self.assertTrue((mean == correct).all())
def test_filter_window_polar(self): np.set_printoptions(precision=3) rscale = 250 # nrays, nbins = self.img.shape # ascale = 2 * np.pi / self.img.shape[0] mean = util.filter_window_polar(self.img, 300, "maximum", rscale) correct = np.array([[0., 1., 1., 1., 0., 0., 0., 0., 0., 0.], [0., 1., 1., 1., 0., 0., 0., 0., 0., 0.], [0., 1., 1., 1., 0., 0., 0., 0., 0., 0.], [0., 1., 1., 1., 0., 0., 0., 0., 0., 0.], [0., 1., 1., 1., 0., 1., 1., 1., 1., 0.], [0., 1., 1., 0., 0., 1., 1., 1., 1., 0.], [1., 1., 0., 0., 0., 1., 1., 1., 1., 0.], [1., 1., 0., 1., 1., 0., 0., 0., 0., 0.], [1., 0., 0., 1., 1., 1., 1., 1., 0., 0.], [1., 0., 0., 1., 1., 1., 1., 1., 0., 0.], [1., 0., 0., 1., 1., 1., 1., 1., 0., 0.], [1., 0., 0., 1., 1., 1., 1., 1., 0., 0.], [1., 0., 0., 1., 1., 1., 1., 1., 0., 0.], [1., 0., 0., 1., 1., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 1., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 1., 1., 1., 0., 0., 0., 0., 0.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 0., 0., 0., 0., 0.], [1., 1., 1., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 1., 1., 0., 0., 0., 0., 0., 0., 0.]]) self.assertTrue((mean == correct).all())
def filter_window_distance(img, rscale, fsize=1500, tr1=7): """2d filter looking for large reflectivity gradients. This function counts for each bin in ``img`` the percentage of surrounding bins in a window of half size ``fsize`` which are not ``tr1`` smaller than the central bin. The window is defined using geometrical distance. Parameters ---------- img : array_like 2d polar data to which the filter is to be applied rscale : float range [m] scale of the polar grid fsize : int Half-size [m] of the square window surrounding the central pixel tr1 : float Threshold value Returns ------- output : array_like an array with the same shape as ``img``, containing the filter's results. See Also -------- :func:`~wradlib.clutter.filter_gabella_a` - Original version of the filter :func:`~wradlib.clutter.filter_gabella_b` - filter using a echo area """ ascale = 2 * np.pi / img.shape[0] count = np.ones(img.shape, dtype=int) similar = np.zeros(img.shape, dtype=float) good = np.ones(img.shape, dtype=float) valid = (~np.isnan(img)) hole = np.sum(~valid) > 0 nr = int(round(fsize / rscale)) range_shift = range(-nr, nr + 1) r = np.arange(img.shape[1]) * rscale + rscale / 2 adist = r * ascale na = np.around(fsize / adist).astype(int) max_na = img.shape[0] / 10 sa = 0 while sa < max_na: imax = np.where(na >= sa)[0][-1] + 1 refa1 = util.roll2d_polar(img, sa, axis=0) refa2 = util.roll2d_polar(img, -sa, axis=0) for sr in range_shift: refr1 = util.roll2d_polar(refa1, sr, axis=1) similar[:, 0: imax] += (img[:, 0: imax] - refr1[:, 0: imax] < tr1) if sa > 0: refr2 = util.roll2d_polar(refa2, sr, axis=1) similar[:, 0: imax] += (img[:, 0: imax] - refr2[:, 0: imax] < tr1) count[:, 0:imax] = 2 * sa + 1 sa += 1 similar[~valid] = np.nan count[~valid] = -1 count[:, nr:-nr] = count[:, nr:-nr] * (2 * nr + 1) for i in range(0, nr): count[:, i] = count[:, i] * (nr + 1 + i) count[:, -i - 1] = count[:, -i - 1] * (nr + 1 + i) if hole: good = util.filter_window_polar(valid.astype(float), fsize, "uniform", rscale) count = count * good count[count == 0] = 1 similar -= 1 count -= 1 similar = similar / count return similar
def test_filter_window_polar(self): np.random.seed(42) rscale = 250 # nrays, nbins = self.img.shape # ascale = 2 * np.pi / self.img.shape[0] mean = util.filter_window_polar(self.img.copy(), 300, "maximum", rscale) mean2 = util.filter_window_polar(self.img.copy(), 300, "maximum", rscale, random=True) correct = np.array([ [0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0], [0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0], [1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], ]) correct2 = np.array([ [0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0], [0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0], [1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], ]) np.testing.assert_array_equal(mean, correct) np.testing.assert_array_equal(mean2, correct2)
def test_filter_window_polar(self): rscale = 250 # nrays, nbins = self.img.shape # ascale = 2 * np.pi / self.img.shape[0] mean = util.filter_window_polar(self.img, 300, "maximum", rscale) mean2 = util.filter_window_polar(self.img, 300, "maximum", rscale, random=True) correct = np.array([[0., 1., 1., 1., 0., 0., 0., 0., 0., 0.], [0., 1., 1., 1., 0., 0., 0., 0., 0., 0.], [0., 1., 1., 1., 0., 0., 0., 0., 0., 0.], [0., 1., 1., 1., 0., 0., 0., 0., 0., 0.], [0., 1., 1., 1., 0., 1., 1., 1., 1., 0.], [0., 1., 1., 0., 0., 1., 1., 1., 1., 0.], [1., 1., 0., 0., 0., 1., 1., 1., 1., 0.], [1., 1., 0., 1., 1., 0., 0., 0., 0., 0.], [1., 0., 0., 1., 1., 1., 1., 1., 0., 0.], [1., 0., 0., 1., 1., 1., 1., 1., 0., 0.], [1., 0., 0., 1., 1., 1., 1., 1., 0., 0.], [1., 0., 0., 1., 1., 1., 1., 1., 0., 0.], [1., 0., 0., 1., 1., 1., 1., 1., 0., 0.], [1., 0., 0., 1., 1., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 1., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 1., 1., 1., 0., 0., 0., 0., 0.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 0., 0., 0., 0., 0.], [1., 1., 1., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 1., 1., 0., 0., 0., 0., 0., 0., 0.]]) correct2 = np.array([[0., 1., 1., 1., 0., 0., 0., 0., 0., 0.], [0., 1., 1., 1., 0., 0., 0., 0., 0., 0.], [0., 1., 1., 1., 0., 0., 0., 0., 0., 0.], [0., 1., 1., 1., 0., 0., 0., 0., 0., 0.], [0., 1., 1., 1., 0., 1., 1., 1., 1., 0.], [0., 1., 1., 0., 0., 1., 1., 1., 1., 0.], [1., 1., 0., 0., 0., 1., 1., 1., 1., 0.], [1., 0., 0., 1., 1., 0., 0., 0., 0., 0.], [1., 0., 0., 1., 1., 1., 1., 1., 0., 0.], [1., 0., 0., 1., 1., 1., 1., 1., 0., 0.], [1., 0., 0., 1., 1., 1., 1., 1., 0., 0.], [1., 0., 0., 1., 1., 1., 1., 1., 0., 0.], [1., 0., 0., 1., 1., 1., 1., 1., 0., 0.], [1., 0., 0., 1., 1., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 1., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 1., 1., 1., 0., 0., 0., 0., 0.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 0., 0., 0., 0., 0.], [1., 1., 1., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 1., 1., 0., 0., 0., 0., 0., 0., 0.]]) np.testing.assert_array_equal(mean, correct) np.testing.assert_array_equal(mean2, correct2)