Python:仅沿空间维度对 N 通道图像进行高斯滤波?

问题描述 投票:0回答:2

我有一个

HxWxN
图像
arr
,我想要对其进行高斯模糊。

scipy.ndimage.gaussian_filter
似乎将图像视为通用数组,并且还沿着最终通道维度进行模糊处理。所需的行为是对所有
arr[:, :, i]
独立进行高斯模糊
i
,然后将所得切片连接回
HxWxN
结果数组。

是否有更好的库或函数可以用来直接实现这一目标,或者我真的需要将

scipy.ndimage.gaussian_filter
放入
i
的 for 循环中?

额外的问题是,如果我将 M 张图像组织为

MxHxWxN
数组会怎样?如何仅模糊 H 和 W 尺寸?

python
2个回答
3
投票

使用
scipy.ndimage.gaussian_filter

解决方案

要仅对标准差为 1.6 的

H
x
W
x
H
图像
W
的空间维度
N
arr
进行高斯模糊,请使用:

std=1.6
gaussian_filter(arr, sigma=(std, std, 0))

说明

根据 SciPy Docs

scipy.ndimage.gaussian_filter
允许通过将标量序列传递给参数 sigma 来单独指定每个轴的标准导数:

sigma:标量或标量序列

高斯核的标准差。高斯滤波器的标准差以序列或单个数字的形式针对每个轴给出,在这种情况下,所有轴的标准差都相等。

将轴的 sigma 设置为

0
表示在该方向上不进行过滤。

如果仅给 sigma 一个标量,则图像的空间维度和 RGB 通道都会一起模糊,从而导致图像不饱和。

奖励答案

对于形状为

M
MxHxWxN
图像数组,您可以设置
sigma=(0,std, std, 0)

性能

快速查看 scipy.ndimage.gaussian_filter

源代码后,似乎该方法 
gaussian_filter1d
仅适用于那些具有 sigma > 1e-15
 的维度。如果 
sigma=0
 不是 
> 1e-15
,则跳过此维度的过滤。所以这个解决方案不应该引起任何不必要的计算。


1
投票
我明白了。

cv2.GaussianBlur()

 正是这样做的:它独立地模糊每个通道,并且图像可以具有任意数量的通道。

© www.soinside.com 2019 - 2024. All rights reserved.