Python中具有位置依赖sigma的2d图像的高斯滤波器

时间:2016-02-17 06:51:43

标签: python numpy scipy sympy theano

我试图在Python中实现内核所在的高斯滤波器 enter image description here

其中f(x,y)是坐标的某个函数。有可能以某种方式欺骗scipy.ndimage.filters.gaussian_filter来完成这项工作吗?

最终我将不得不在空间上执行以下集成:

enter image description here

所以我得到$ \ tilde G(x',y')$作为坐标相关系数。

现在我正在使用繁琐的for循环:

def calc_g1(b,w,p):
    nx,ny = b.shape
    g1 = np.zeros_like(b)
    for i in np.arange(nx):
        for j in np.arange(ny):
            for ii in np.arange(nx):
                for jj in np.arange(ny):
                    g = calc_kernel(b,p,i,j,ii,jj)
                    g[i,j]+=g*w[ii,jj]
    return g1


def calc_kernel(b,w,i,j,ii,jj):
    dx,dy = p['dx'],p['dy']
    dist_x = dx*np.abs(ii-i)
    dist_y = dy*np.abs(jj-j)
    dist = dist_x**2 + dist_y**2
    f = (1.0 + p['eta']*b[i,j])**2
    return 1.0/(2.0*np.pi)*np.exp(-(dist)/(2.0*f))

**我能以某种方式使用SymPy或Theano进行符号计算吗?

1 个答案:

答案 0 :(得分:1)

从特定信号和滤波器支持大小开始的卷积总是通过信号和滤波器的傅里叶变换和逆变换的逐点乘法在傅立叶空间中执行得更快。

在这种情况下,假设过滤是线性和移位不变的,因此您的上下文不适合卷积的经典上下文。

所以你必须自己实现这个。

如果您有很多信号要应用此功能,那么最好不打算编写低级代码,而是以scipy.sparse矩阵的形式编写此转换。为此,您必须创建所需的所有高斯滤波器,并将它们适当地放置在图像中,并将这些滤波器图像的散乱版本堆叠在稀疏矩阵中。您应该截断高斯人的支持,这样图像的大多数像素都等于0.创建此矩阵后,您可以立即将其应用于任何图像的像素数组,以获得所需的结果。