对于实验,我需要在整个窗口上使用高斯滤波器,例如中间部分。因为我使用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矩阵中的每个点分配一个值,使得指定的值具有高斯2d分布?后来我可以砍掉高于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()
答案 0 :(得分:3)
您对gaussian_filter
的输入是一个填充-1的数组。无论何时过滤,都必须考虑边缘的处理方式。 gaussian_filter
对边的处理由mode
参数决定。默认mode
为'reflect'
,表示数据"外部"您的数组(从过滤器的角度来看)是数组内部数据的反映副本。所以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>
(ndi
为scipy.ndimage
,imshow
为matplotlib.pyplot.imshow
。)