Jbl*_*sco 7 python filtering numpy median
我在这个论坛上看到了几个关于计算掩码数组中值的讨论,比如图像.我想要的是稍微更微妙,它是在我的图像上应用中值滤镜.我知道一种方法可以做到这一点,但速度太慢,并且会喜欢加速这个过程的方法.
例如,假设我有一个蒙版数组形状(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)
Run Code Online (Sandbox Code Playgroud)
现在,为了实际制作中值滤波器,我们可以用蛮力的方式做到:
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])
Run Code Online (Sandbox Code Playgroud)
这解决了问题,并给出了一个很好的结果,但正如我所说,它是非常缓慢的.一个(对我来说,令人惊讶)稍微加快过程的方法是分别使用蒙版和图像,如:
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])
Run Code Online (Sandbox Code Playgroud)
这使得执行时间从0.018到0.002,这显然更好(为什么??),如果不是我想要的因素~50.
有什么输入?
我猜想差异主要是由于访问 MaskedArray 对象(它是 ndarray 的一种包装器)的开销造成的。
对于 numpy 中的高效中值滤波器,您也可以尝试scikit-image。它还接受 mask 参数。
| 归档时间: |
|
| 查看次数: |
2885 次 |
| 最近记录: |