gpt4 book ai didi

python - 屏蔽数组的中值滤波器

转载 作者:太空狗 更新时间:2023-10-29 21:58:43 24 4
gpt4 key购买 nike

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

例如,假设我有一个形状为 (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])

这解决了问题并给出了良好的结果,但正如我所说,它非常慢。一种(对我来说,令人惊讶的)稍微加快该过程的方法是分别使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com