我在该论坛上看到了一些有关计算蒙版数组(例如图像)的中值的讨论。我想要的是稍微微妙的,它是在图像上应用中值滤镜。我知道一种解决方法,但是速度太慢了,不胜感激加快处理速度的方法。

例如,假设我有一个形状(10,10)的 mask 的数组,并且我想在一个不使用被 mask 的元素的框(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])

这解决了问题并给出了良好的结果,但是正如我所说,它的速度很慢。一种(对我而言,令人惊讶的)稍微加快此过程的方法是分别使用 mask 和图像,例如:
 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倍,这显然更好(为什么?)。

有输入吗?

最佳答案

我猜想,差异主要是由于访问MaskedArray对象(这是ndarray的包装器)的开销所致。

为了获得有效的numpy中值过滤器,您还可以尝试scikit-image。它还接受掩码参数。

关于python - 掩码数组的中值过滤器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18827310/

10-11 11:51