2013-09-16 137 views
7

我在这个论坛上看到过几个关于计算掩蔽阵列中值的讨论,例如图像。我想要的是稍微更微妙,它是在我的图像上应用中值滤镜。我知道这样做的一种方式,但速度太慢,并且希望能够加快这个过程。掩蔽阵列的中值滤波器

例如,假设我有一个掩蔽阵列形状(10,10)的和我想申请中值滤波器具有箱(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。

任何输入?

回答

1

我想这种差异主要是由于在访问MaskedArray对象(这是一种围绕ndarray的包装)的开销。

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

+0

它现在在[skimage.filter.rank](http://scikit-image.org/docs/dev/api/skimage.filter.rank.html#median)包中。 – letmaik

+0

上面的2个链接似乎不再工作,现在它的任何想法? – JoVe

+0

感谢您的报告。这是一个新的链接:http://scikit-image.org/docs/stable/api/skimage.filters.rank.html#median – btel