def imblur(Y, sig=5, siz=11, nDimBlur=None, kernel=None):
"""Spatial filtering with a Gaussian or user defined kernel
The parameters are specified in GreedyROI
"""
from scipy.ndimage.filters import correlate
X = np.zeros(np.shape(Y))
if kernel is None:
if nDimBlur is None:
nDimBlur = Y.ndim - 1
else:
nDimBlur = np.min((Y.ndim, nDimBlur))
if np.isscalar(sig):
sig = sig * np.ones(nDimBlur)
if np.isscalar(siz):
siz = siz * np.ones(nDimBlur)
# xx = np.arange(-np.floor(siz[0] / 2), np.floor(siz[0] / 2) + 1)
# yy = np.arange(-np.floor(siz[1] / 2), np.floor(siz[1] / 2) + 1)
# hx = np.exp(-xx**2 / (2 * sig[0]**2))
# hx /= np.sqrt(np.sum(hx**2))
# hy = np.exp(-yy**2 / (2 * sig[1]**2))
# hy /= np.sqrt(np.sum(hy**2))
# temp = correlate(Y, hx[:, np.newaxis, np.newaxis], mode='constant')
# X = correlate(temp, hy[np.newaxis, :, np.newaxis], mode='constant')
# the for loop helps with memory
# for t in range(np.shape(Y)[-1]):
# temp = correlate(Y[:,:,t],hx[:,np.newaxis])#,mode='constant', cval=0.0)
# X[:,:,t] = correlate(temp,hy[np.newaxis,:])#,mode='constant', cval=0.0)
X = Y.copy()
for i in range(nDimBlur):
h = np.exp(-np.arange(-np.floor(siz[i] / 2), np.floor(siz[i] / 2) + 1)**2
/ (2 * sig[i]**2))
h /= np.sqrt(h.dot(h))
shape = [1] * len(Y.shape)
shape[i] = -1
X = correlate(X, h.reshape(shape), mode='constant')
else:
X = correlate(Y, kernel[..., np.newaxis], mode='constant')
# for t in range(np.shape(Y)[-1]):
# X[:,:,t] = correlate(Y[:,:,t],kernel,mode='constant', cval=0.0)
return X
#%%
评论列表
文章目录