diff --git a/modules/util/util.py b/modules/util/util.py
index 9116e4ef1ba384571be5744095a87a0049fe1d1d..b9a4684f5851fa2af09bf98a8e9bceebce856391 100644
--- a/modules/util/util.py
+++ b/modules/util/util.py
@@ -13,6 +13,7 @@ from netCDF4 import Dataset
 from util.setup import ancillary_path
 from scipy.interpolate import RectBivariateSpline, interp2d
 from scipy.ndimage import gaussian_filter
+from scipy.signal import medfilt2d
 
 LatLonTuple = namedtuple('LatLonTuple', ['lat', 'lon'])
 
@@ -1444,6 +1445,18 @@ def smooth_2d_single(z, sigma=1.0):
     return gaussian_filter(z, sigma=sigma)
 
 
+def median_filter_2d(z, kernel_size=3):
+    z_filtered = []
+    for j in range(z.shape[0]):
+        z_j = z[j, :, :]
+        z_filtered.append(medfilt2d(z_j, kernel_size=kernel_size))
+    return np.stack(z_filtered)
+
+
+def median_filter_2d_single(z, kernel_size=3):
+    return medfilt2d(z, kernel_size=kernel_size)
+
+
 def get_training_parameters(day_night='DAY', l1b_andor_l2='both', satellite='GOES16', use_dnb=False):
     if day_night == 'DAY':
         train_params_l2 = ['cld_height_acha', 'cld_geo_thick', 'cld_temp_acha', 'cld_press_acha', 'supercooled_cloud_fraction',