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