2016-02-01 3 views
1

для эксперимента по бинокулярному соперничеству с использованием цветовых блоков (созданных с помощью GratingStim с использованием гауссовской маски), мне нужно нарисовать стимул для поддельного соперничества. То есть, мне нужен круглый цветной кадр, который имеет один цвет, например, сверху (25% цветной капли) и еще один цвет ниже (75% цветной капли). Кроме того, я хотел бы, чтобы трюк-поддельный соперничающий blob имел гауссовскую маску, так как мои настоящие соперничающие стимулы. Также было бы неплохо иметь нечеткий переход цвета в поддельный стимул соперничества. Надеюсь, ясно, что я имею в виду.Эксперимент Fake-rivalry

Одним из решений, о которых я думал, было рисование двух прямоугольников с размытыми краями, а затем наложение на них гауссовой альфа-маски. Чтобы получить правильные пропорции цвета, мне нужно было бы переместить два прямоугольника за маской. Есть ли способ разместить альфа-макс по всему окну?

Другим решением было бы использовать ShapeStim, как предлагается в этом сообщении, объясняя, как нарисовать полукруг: https://groups.google.com/forum/#!msg/psychopy-users/L9TYIrf9eJk/m0zIj0N23bMJ Мне бы пришлось поиграть с вершинами, но я думаю, что это должно сработать. Единственное, что меня беспокоит, это то, что ShapeStim не имеет атрибута маски, чтобы размыть края.

Можете ли вы придумать способ сделать это? Большое спасибо!

Lilla

Системные характеристики: Psychopy v1.83.01 работает на прошивкой 10.11.1

ответ

0
бы эта работа

? Затем вы можете найти капли, где хотите, например. для одного глаза. Не нужно делать вещи всего окна.

# Set up stimuli 
from psychopy import visual, event 
win = visual.Window([500,500]) 
blob_large = visual.GratingStim(win, sf=0, mask='gauss', size=1, color='red') 
blob_small = visual.GratingStim(win, sf=0, mask='gauss', size=0.5, color='green', maskParams={'sd':6}) 

# Draw them on top of each other 
blob_large.draw() 
blob_small.draw() 
win.flip() 

# Wait for keyboard before quitting. 
event.waitKeys() 
+0

Уважаемый Jonas, спасибо за идею, я думаю, я поеду за это, если я не смогу заставить его работать с pygame. Из вашего предложения я понял, что я не очень хорошо описывал, что я имел в виду: вместо двух капель друг над другом, я предпочел бы blob с тем, чтобы верхние 25% или около того составляли зеленый, а нижний - красный, как в Pearson, Clifford и Tong 2008 (дополнительные данные): http://www.sciencedirect.com/science/article/pii/S0960982208007239. У вас есть идеи для этого? Спасибо за помощь! – lilla

+0

Дорогой Йонас, у меня есть другая идея: я мог бы построить два стимула с помощью сделанной на заказ маски (то есть массива) над ними. Правда ли тогда, что маска должна иметь размеры рассматриваемого стимула? Спасибо за помощь! Lilla – lilla

0

Обновление на мой вопрос: следующий образец кода решает проблему:

# -*- coding: utf-8 -*- 
# adapted from https://groups.google.com/forum/#!msg/psychopy-users/69p-aAWiDGI/e4iT43cHDeEJ 
from psychopy import visual, event 

win = visual.Window([500,500]) 

#stimuli 
perc25 = visual.GratingStim(win, sf=0, size=1, color='RED',pos=(0.0, 0.0), mask = 'raisedCos', maskParams={'fringeWidth':0.8}) 
perc75 = visual.GratingStim(win, sf=0, size=0.8, color='green',pos=(0.0, -0.15), mask = 'raisedCos', maskParams={'fringeWidth':0.6}) 

#prepare for the screenshot 
Stimlist = [perc25, perc75] 
delta = .5# larger is bigger, slower 
dx = delta * win.size[1]/win.size[0] 
dy = delta 
rect = (-dx, +dy, +dx, -dy)#size of the screenshot 
screenshot = visual.BufferImageStim(win, stim=Stimlist,rect = rect, mask = 'gauss', pos=(0.0, 0.0)) # mask can also be 'raisedCos' with a smaller delta, for exmple .2 
screenshot.draw() 

win.flip() 
event.waitKeys() 
1

второе обновление, даже лучше результат:

# Set up stimuli 
from psychopy import visual, event 
import numpy as np 
from scipy.stats import gaussian_kde 

win = visual.Window([500,500]) 
win2 = visual.Window([500,500]) 

#magic numpy stuff /scipy stuff, adapted from http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.stats.gaussian_kde.html 
mean1 = [0, 0] 
#the smaller the value, the bigger the visible blob 
cov1 = [[0.03, 0], [0, 0.09]] #in this mask, it should be 50/50 

cov2 = [[0.05,0],[0,0.4]]  #in this mask, the color with this mask is the smaller one 

m1, m2 = np.random.multivariate_normal(mean1, cov1, 2000).T# * np.random.multivariate_normal(mean2, cov2, 5000).T 
for i in xrange(len(m2)): 
    if m2[i] >= 0: 
     m2[i] = m2[i]* 0.5#np.random.multivariate_normal(mean2, cov2,1).T[0] 

values = np.vstack([m1, m2]) 
kernel = gaussian_kde(values) 

xmin = m1.min() 
xmax = m1.max() 
ymin = m2.min() 
ymax = m2.max() 

X, Y = np.mgrid[xmin:xmax:128j, ymin:ymax:128j] 
positions = np.vstack([X.ravel(), Y.ravel()]) 
values = np.vstack([m1, m2]) 
kernel = gaussian_kde(values) 
Z = np.reshape(kernel(positions).T, X.shape) #this array will be the mask 
Z = Z - 1 
for i in xrange(128): 
    for j in xrange(128):  #it will neverbe smaller than -1 
     if Z[i][j] > 1: 
      Z[i][j] = 1 


# Draw them on top of each other 

perc75 = visual.GratingStim(win, sf=0, size=250, color='green',pos=(0.0, 0.0), mask =Z) 
perc25 = visual.GratingStim(win, sf=0, size=250, color='red',pos=(0.0, 0.0), mask = 'raisedCos', maskParams={'fringeWidth':0.8}) 

perc25.setAutoDraw(True) 
perc75.setAutoDraw(True) 
win.flip() 
event.waitKeys() 

 Смежные вопросы

  • Нет связанных вопросов^_^