2015-04-28 56 views
0

我无法找到版本1.75.01和1.82的处理对比度差异的来源。这里是显示它曾经是什么样子(1.75)两个图像, v 1.75 以及它现在的样子: v1.82与Psychopy不一致的对比处理

不幸的是,回滚是不平凡的,因为我遇到的问题具有相关性(特别是PIL v枕头)。图像是从一个numpy数组创建的,我怀疑有一些与数组如何处理(?类型,四舍五入)有关的事情发生时,从数组转换,但我找不到错误。任何帮助将深表谢意。

编辑 - 新最小例

#! /bin/bash 

import numpy as np 
from psychopy import visual,core 

def makeRow (n,c): 
    cp = np.tile(c,[n,n,3]) 
    cm = np.tile(-c,[n,n,3]) 
    cpm = np.hstack((cp,cm)) 
    return(cpm) 

def makeCB (r1,r2,nr=99): 
    #nr is repeat number 
    (x,y,z) = r1.shape 
    if nr == 99: 
     nr = x/2 
    else: 
     hnr = nr/2 
    rr = np.vstack((r1,r2)) 
    cb=np.tile(rr,[hnr,hnr/2,1]) 
    return(cb) 

def makeTarg(sqsz,targsz,con): 
    wr = makeRow(sqsz,1) 
    br = makeRow(sqsz,-1) 
    cb = makeCB(wr,br,targsz) 
    t = cb*con 
    return(t) 

def main(): 
    w = visual.Window(size = (400,400),units = "pix", winType = 'pyglet',colorSpace = 'rgb') 
    fullCon_np = makeTarg(8,8,1.0) 
    fullCon_i = visual.ImageStim(w, image = fullCon_np,size = fullCon_np.shape[0:2][::-1],pos = (-100,0),colorSpace = 'rgb') 
    fullCon_ih = visual.ImageStim(w, image = fullCon_np,size = fullCon_np.shape[0:2][::-1],pos = (-100,0),colorSpace = 'rgb') 
    fullCon_iz = visual.ImageStim(w, image = fullCon_np,size = fullCon_np.shape[0:2][::-1],pos = (-100,0),colorSpace = 'rgb') 
    fullCon_ih.contrast = 0.5 
    fullCon_ih.setPos((-100,100)) 
    fullCon_iz.setPos((-100,-100)) 
    fullCon_iz.contrast = 0.1 
    partCon_np = makeTarg(8,8,0.1) 
    partCon_i = visual.ImageStim(w, image = partCon_np,pos = (0,0), size = partCon_np.shape[0:2][::-1],colorSpace = 'rgb') 
    zeroCon_np = makeTarg(8,8,0.0) 
    zeroCon_i = visual.ImageStim(w, image = zeroCon_np,pos=(100,0), size = zeroCon_np.shape[0:2][::-1],colorSpace = 'rgb') 
    fullCon_i.draw() 
    partCon_i.draw() 
    fullCon_ih.draw() 
    fullCon_iz.draw() 
    zeroCon_i.draw() 
    w.flip() 
    core.wait(15) 
    core.quit() 

if __name__ == "__main__": 
    main() 

其中产量这样的:当转换之前产生

enter image description here

沿着水平的三个检验器板已经对比度阵列中改变到图像。垂直左侧显示,以后更改图像对比度可以正常工作。我不能使用它的原因是a)我已经收集了大量的数据与最后一个版本,并且b)我想通过将一个数组与另一个数组相乘来对中心的那些大长条的对比度进行分级,例如,使用对数刻度或其他函数,并且在数学上做数学更容易。

我仍然怀疑问题在于np.array - > pil.image的转换。这些数组的dtype是float64,但即使我强制float32没有变化。如果在半对数转换前检查数组,它会填充0.5和-0.5数字,但我认为在转换时所有负数都变成黑色和黑色被设置为0。

+1

要添加到这一点,使用''psychopy.useVersion'',这种行为出现在版本1.81,但在1.80的行为更怪。由于某些导入问题,我无法在此之前运行版本,但是您可以继续操作。在脚本的顶部,运行''import psychopy''并在下一行''psychopy.useVersion(1.76.00')''。这就是它可以回滚的程度。顺便说一下,这不是一个非常小的例子,因为它导入了很多东西,并定义了几个永远不会使用的变量。 –

+0

我找到了解决办法,但它不是真正的答案。你可以取第一个NxNx3数组的“层”。显然,图像转换将适当地处理漂浮物,例如, 'partCon_i_FIXED = visual.ImageStim(w,image = partCon_np [:,:1],size = partCon_np.shape [0:2] [:: - 1],pos =(0,100),colorSpace ='rgb')' 。但是这与使用完整阵列并随后调整对比度时看起来不完全一样。 – brittAnderson

回答

2

OK,没错,问题是随着规模的数组值的问题做。基本上,你发现了一个角落案件,PsychoPy没有正确处理(即一个错误)。

说明: PsychoPy有一套复杂的转换规则来处理图像/纹理;它试图推断你将要用这个图像做什么,以及它是否应该以支持颜色操作(有符号浮点)或不可以(无符号字节)的方式进行存储。在你的情况下,PsychoPy得到这个错误;事实上,数组中充满了浮动使PsychoPy认为它可以进行颜色转换,但事实上它是NxNx3表明它不应该(我们不想为已指定颜色的东西指定“颜色”对于每个像素rgb vals)。

解决方法(其中任何一项):

  1. 只需提供您的数组为N×N的,不NxNx3。无论如何,这是正确的做法;对于您来说,计算/存储意味着更少,通过提供“强度”值,这些值可以即时重新着色。这大致就是您在提供NxNx3阵列的一个片段时已经发现的,但重点是您可以/应该只在第一个位置创建一个片段。

  2. 使用GratingStim,它转换的一切签订浮点值,而不是试图找出什么是最好的(潜在的,那么你就需要工作,虽然出了空间频率的东西)

  3. 你可以添加一行通过重新调整你的数组(* 0.5 + 0.5),以修复它,但你必须设置的东西,使这个只有发生了这个版本(我们将在下一个版本之前将其修复)

基本上,我(1),因为它已经适用于过去,现在和将来的版本,并且无论如何都更有效率。但是,感谢您让我们知道 - 我会尽力确保我们赶上这一个未来

最良好的祝愿 乔恩

0

该代码对我来说太长,无法通读并解决实际问题。

什么可能是问题是零应该是的问题。我认为有一段时间,numpy数组被视为vals 0:1,而PsychoPy的其他部分预期值为-1:1,因此可能需要用array=array*2-1重新缩放数值才能恢复到旧的(不良行为) 。或者检查不透明度,这可能有类似的问题。如果你写了一个小例子,我会读/测试正常

感谢

+0

@Jonas你当然是最小的例子。我认为这是“微乎其微”,就我在沮丧的一天结束时所需要的工作量而言。如果问题持续存在,我会在一些更简单的例子后继续讨论。 – brittAnderson

+0

新编写的小例子和问题编辑。 - 布里特 – brittAnderson

相关问题