【问题标题】:Median filter of masked arrays掩码数组的中值滤波器
【发布时间】:2013-09-20 13:28:09
【问题描述】:

我在这个论坛上看到了一些关于计算掩码数组(例如图像)的中位数的讨论。我想要的更微妙,它是在我的图像上应用中值滤波器。我知道一种方法,但太慢了,希望能加快进程。

例如,假设我有一个形状为 (10,10) 的 ma​​sked 数组,并且我想应用一个带有框 (3,3) 的中值过滤器,而不使用那些被遮罩的元素。我的目标是将图像的每个像素中的值替换为框的掩码中位数的值。

假设一个非常简单的情况,我们可以将“图像”和掩码构建为:

 im = numpy.random.uniform(size=(10,10))
 mask = numpy.zeros_like(im)
 mask[1:3,:] = 1
 masked_im = numpy.ma.array(im, mask=mask)

现在,要真正制作中值滤波器,我们可以通过以下方式以蛮力的方式完成:

 lx, ly = im.shape
 side = 3
 im_filt = numpy.zeros_like(im)
 for jj in range(ly):
     for ii in range(lx):
         minx, maxx = max([ii-side/2,0]), min([ii+side/2+1,lx])
         miny, maxy = max([jj-side/2,0]), min([jj+side/2+1,ly])
         im_filt[ii,jj] = numpy.ma.median(masked_im[minx:maxx, miny:maxy])

这解决了问题并产生了良好的结果,但正如我所说,它非常缓慢。一种(对我来说,令人惊讶的)稍微加快进程的方法是分别使用蒙版和图像,例如:

 im_filt2 = numpy.zeros_like(im)
 for jj in range(ly):
     for ii in range(lx):
         minx, maxx = max([ii-side/2,0]), min([ii+side/2+1,lx])
         miny, maxy = max([jj-side/2,0]), min([jj+side/2+1,ly])
         zoom_im = im[minx:maxx, miny:maxy]
         zoom_msk = mask[minx:maxx, miny:maxy]
         im_filt2[ii,jj] = numpy.median(zoom_im[zoom_msk == 0]) 

这将执行时间从 0.018 提高到 0.002,如果不是我想要的约 50 倍,这显然更好(为什么??)。

有什么意见吗?

【问题讨论】:

    标签: python numpy filtering median


    【解决方案1】:

    我猜这个差异主要是由于访问 MaskedArray 对象(它是 ndarray 的一种包装器)的开销。

    对于 numpy 中的有效中值过滤器,您也可以尝试scikit-image。它还接受掩码参数。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2011-10-02
    • 2018-12-31
    • 2015-01-08
    相关资源
    最近更新 更多