python - python中的中位数下采样
问题描述
我想使用中值滤波器对图像进行下采样。乍一看,with中的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)
最后一个断言失败,因为中值滤波器没有按我预期的方式应用。
您能否建议使用中值滤波器对图像进行下采样的其他方法?
解决方案
这是一些解决您的特定问题的技巧。
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
toblock_reduce
将func(out, axis=-1)
在代码(source)中被调用。我没有调用 ,而是劫持了这个,以便使用正确的参数numpy.median
调用中位数。axis
在您的示例中,block.shape
将(2, 2, 2, 2)
在第一次调用中,然后(2, 2, 2)
在第二次调用clever_func
. 我只在第一次调用 ( if len(block.shape) == 4
) 时使用 np.median,而在第二次调用时没有使用。
这不是一个很好的解决方案。
推荐阅读
- javafx - 带有 javaFX 的网页视图
- hadoop - 如何通过调度作业每天运行一个查询
- c# - 如何在 C# 应用程序中添加 System.Diagnostics 引用?
- ios - iOS 设备上未显示开发人员菜单
- php - 转移服务器代码后在新服务器上不起作用
- angular - Symfony Angular 请求的资源上不存在“Access-Control-Allow-Origin”标头
- azure - 无法使用 NuGet 安装 Microsoft.Azure.ServiceBus
- python - 即使没有合并单元格,Openpyxl 也会找到合并的单元格
- git - 使用代码格式化程序时如何逐行保留 git 作者?
- spring - 确保所有引用的类都在类路径上:interface javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter