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

时间:2016-02-26 15:15:09

标签: scipy gaussian psychopy imagefilter gaussianblur

对于实验,我需要在整个窗口上使用高斯滤波器,例如中间部分。因为我使用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()

1 个答案:

答案 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>

plot

ndiscipy.ndimageimshowmatplotlib.pyplot.imshow。)