numpy 屏蔽阵列中值滤波器

mi7gmzs6  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(66)

我在这个论坛上看到过几个关于计算掩码数组中值的讨论,比如图像。我想要的是稍微更微妙的,它是在我的图像上应用中值滤波器。我知道一种方法,但太慢了,并希望加快这一进程的方式。
例如,假设我有一个形状为(10,10)的masked数组,我想应用一个带有框(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倍的话。
有什么意见吗?

ryevplcw

ryevplcw1#

我猜这种差异主要是由于访问MaskedArray对象(它是ndarray的一种 Package 器)的开销。
要在numpy中使用高效的中值滤波器,你也可以尝试scikit-image。它还接受掩码参数。

相关问题