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

时间:2015-07-31 16:45:28

标签: python numpy scipy

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

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)

2 个答案:

答案 0 :(得分:4)

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

您真正想要的是分别对每个颜色通道应用二维滤镜。您可以通过将元组作为a_g_blure = ndimage.uniform_filter(a, size=(11, 11, 1)) 参数,使用大小1作为最后一个轴来执行此操作:

uniform_filter

注意:>>> import timeit >>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000) 不是Gaussian blur。为此,您将使用scipy.ndimage.gaussian_filter。您可能还对scikit-image提供的过滤器感兴趣。请特别注意skimage.filters.gaussian_filter

答案 1 :(得分:0)

对于高斯模糊,我建议使用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)