如何获得高斯核数组来过滤我的图像

How can I obtain a gaussian kernel array to filter my image

对于一个实验,我需要一个覆盖整个 window 的高斯滤波器,例如中间部分。因为我使用 PsychoPy,基本上,我需要一个 N x M 数组(N 和 M 是 window 的像素大小)中间的数组(底层刺激可见,边缘为 -1 . 然后我可以使用这个数组作为 GratingStim 中的掩码。 到目前为止,我一直在尝试 ndimage.filters.gaussian_filter(filter_input, 西格玛 = 7)

但是我在使用这个函数时遇到了一些问题。如果 filter_input 是一个包含 1 或 0 的 NxM 矩阵,ndimage 函数将它们保持不变。如果 filter_input 是一个带有随机数的矩阵,它会改变它们。但是我仍然没有得到我希望的结果。我知道 PsychoPy 掩码只允许 -1 和 1 之间的值,但因为它现在在下面的代码中,所以我应该看不到任何东西,因为掩码是 -1。

所以,更具体地说: 为什么 ndimage.filters.gaussian_filter(filter_input, sigma = 7) 表现得像它一样?我怎样才能让它为 NxM 矩阵中的每个点分配一个值,使分配的值具有高斯二维分布?后来我可以砍掉高于 1 和低于 -1 的值。

如果我的问题很简单,我很抱歉,我一直在用 PsychoPy 做一些编程,但我是 numpy 的新手并且 scipy...

感谢您的帮助!

下面是一些示例代码:

# -*- coding: utf-8 -*-

from psychopy import visual, event
import numpy as np
from scipy import ndimage
win = visual.Window([500,500])

#draw rectangle
perc25 = visual.Rect(win, width = 0.6,height=0.4, lineColor='red',fillColor =    'red', pos=(0.0, 0.1))  #notloesu
perc25.draw()

#add circle with fuzzy edges
perc75 = visual.GratingStim(win, sf=0, size=0.5, color='green',pos=(0.0, -0.1), mask = 'raisedCos', maskParams={'fringeWidth':0.6}) 
perc75.draw()

#create the  matrix that should result in a gaussian filter laied centrally over the entire window
#desired Result: some red in the upper part of the visible circle in the middle, the rest beeing green
filter_input = (np.ones([500,500]))*(-1.)
gaussian = ndimage.filters.gaussian_filter(filter_input, sigma = 0.2)
print(filter_input == gaussian)

#i know it's ugly, I just can't think of another way to apply the filter to the entire image and I haven't found anything in the internet
unnecesary_stim_to_get_the_mask_over_the_window  = visual.GratingStim(win, sf=0, size=0.0000001, color='green',pos=(0, 0), mask = gaussian) 
unnecesary_stim_to_get_the_mask_over_the_window.draw()

win.flip()
event.waitKeys()

您对 gaussian_filter 的输入是一个以 -1 填充的数组。无论何时进行过滤,都必须考虑如何处理边缘。 gaussian_filter 对边缘的处理由 mode 参数决定。默认 mode'reflect',这意味着数据 "outside" 您的数组(从过滤器的角度来看)是数组内部数据的反映副本。所以 gaussian_filter 看到的唯一值是常量 -1。高斯滤波器是一个低通滤波器,所以一个常数值被不加改变地通过。这就是为什么您的数组 gaussian 包含与 filter_input.

相同的值

要创建一个实际的高斯曲面,请传递一个除中心为单个 1 外全为零的数组。例如,

In [92]: x = np.zeros((101, 101))

In [93]: x[50, 50] = 1

In [94]: y = ndi.filters.gaussian_filter(x, sigma=16)

In [95]: imshow(y, interpolation='none', cmap=cm.gray)
Out[95]: <matplotlib.image.AxesImage at 0x1127e4390>

ndiscipy.ndimageimshowmatplotlib.pyplot.imshow。)