How to gauss-filter (blur) a floating point numpy array
If you have a two-dimensional numpy array a
, you can use a Gaussian filter on it directly without using Pillow to convert it to an image first. scipy has a function gaussian_filter
that does the same.
from scipy.ndimage.filters import gaussian_filterblurred = gaussian_filter(a, sigma=7)
Here is my approach using only numpy.It is prepared with a simple 3x3 kernel, minor changes could make it work with custom sized kernels.
def blur(a): kernel = np.array([[1.0,2.0,1.0], [2.0,4.0,2.0], [1.0,2.0,1.0]]) kernel = kernel / np.sum(kernel) arraylist = [] for y in range(3): temparray = np.copy(a) temparray = np.roll(temparray, y - 1, axis=0) for x in range(3): temparray_X = np.copy(temparray) temparray_X = np.roll(temparray_X, x - 1, axis=1)*kernel[y,x] arraylist.append(temparray_X) arraylist = np.array(arraylist) arraylist_sum = np.sum(arraylist, axis=0) return arraylist_sum
Purely numpy solution using convolve and the separability of the Gaussian filter into two separate filter steps (which makes it relatively fast):
kernel = np.array([1.0,2.0,1.0]) # Here you would insert your actual kernel of any sizea = np.apply_along_axis(lambda x: np.convolve(x, kernel, mode='same'), 0, a)a= np.apply_along_axis(lambda x: np.convolve(x, kernel, mode='same'), 1, a)