python中

时间:2018-05-23 10:05:36

标签: python scikit-image

我想使用中值滤波器对图像进行下采样。 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)

最后一个断言失败,因为中值过滤器没有按照我预期的方式应用。

您能否建议使用中值滤波器对图像进行下采样的其他方法?

1 个答案:

答案 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)

基本上,funcblock_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),在第二次通话时没有使用任何内容。

这不是一个很好的解决方案。