如何防止 Numpy/ SciPy 高斯模糊将图像转换为灰度?

How can I prevent Numpy/ SciPy gaussian blur from converting image to grey scale?

我想对图像执行高斯模糊,但我不想转换为灰度。有没有办法执行此操作并保持颜色?

from scipy import misc

import scipy

import numpy as np

a = misc.imread('A.jpg')

# A retains its color
misc.imsave('color.jpg', a)

# A_G_Blur gets converted to grey scale, I want to prevent this
a_g_blure = ndimage.uniform_filter(a, size=11)

# I want it to keep it's color
misc.imsave('now_grey.jpg', a)

a 是一个形状为 (M, N, 3) 的 3 维数组。问题是 ndimage.uniform_filter(a, size=11) 将长度为 11 的过滤器应用于 a 的每个维度,包括保存颜色通道的第三个轴。当您将长度为 11 的过滤器应用于长度为 3 的轴时,结果值都非常接近三个值的平均值,因此您得到的结果非常接近灰度。 (根据图像,您可能会留下一些颜色。)

您真正想要的是分别对每个颜色通道应用二维滤镜。您可以通过将元组作为 size 参数来实现,最后一个轴的大小为 1:

a_g_blure = ndimage.uniform_filter(a, size=(11, 11, 1))

注意:uniform_filter 不是 Gaussian blur. For that, you would use scipy.ndimage.gaussian_filter. You might also be interested in the filters provided by scikit-image. In particular, see skimage.filters.gaussian_filter

对于高斯模糊,我建议使用 skimage.filters.gaussian_filter。

from skimage.io import imread
from skimage.filters import gaussian_filter

sigma=5  # blur radius

img = imread('path/to/img')

# this will only return grayscale
grayscale_blur = gaussian_filter(src_img, sigma=sigma)

# passing multichannel param as True returns colors
color_blur = gaussian_filter(src_img, sigma=sigma, multichannel=True)