我想在图像上执行高斯模糊,但我不想转换为灰度。反正有没有执行此操作并保持颜色?
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)
答案 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)