我想使用中值滤波器对图像进行下采样。 block_reduce
中的skimage
方法与func=numpy.median
似乎一见钟情。但是,我得到的结论是block_reduce
一次应用func
一个轴,而我希望中值滤波器同时应用于整个块 - 对于非平凡的输入,结果不是相同。
最小的演示示例是:
from skimage.measure import block_reduce
import numpy as np
image = np.array([[4, 6, 6, 2],
[6, 7, 9, 9],
[3, 0, 9, 0],
[0, 6, 6, 4]])
expected = np.array([[np.median(image[0:2,0:2]), np.median(image[0:2,2:4])],
[np.median(image[2:4,0:2]), np.median(image[2:4,2:4])]])
actual = block_reduce(image, (2,2), func=np.median)
assert np.array_equal(expected, actual)
最后一个断言失败,因为中值过滤器没有按照我预期的方式应用。
您能否建议使用中值滤波器对图像进行下采样的其他方法?
答案 0 :(得分:1)
以下是一些解决您具体问题的 hack 。
def clever_func(block, axis):
# axis unused on purpose
if len(block.shape) == 4:
return np.median(block, axis=[2, 3])
else:
return block
actual = block_reduce(image, (2,2), func=clever_func)
基本上,func
到block_reduce
的参数将在代码(source)中被称为func(out, axis=-1)
。我没有调用numpy.median
,而是劫持了这个,因此使用正确的axis
参数调用中位数。
在您的示例中,block.shape
在第一次通话中为(2, 2, 2, 2)
,在(2, 2, 2)
的第二次通话中为clever_func
。我只在第一次通话时使用np.median(if len(block.shape) == 4
),在第二次通话时没有使用任何内容。
这不是一个很好的解决方案。