与心理对比处理不一致

时间:2015-04-28 21:01:04

标签: numpy pillow psychopy

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

不幸的是,由于遇到依赖关系问题(特别是PIL v PILLOW),回滚并不是一件容易的事。图像是从一个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)我想通过将一个数组与另一个数组相乘来以编程方式对中心中那些大长条的对比度进行分级,例如使用对数刻度或其他一些函数,并且在numpy中进行数学计算更容易。

我仍然怀疑问题出在np.array的转换中 - > pil.image。这些数组的dtype是float64,但即使我强制浮动32也没有任何变化。如果你在半对比度转换之前检查数组,它会填充0.5和-0.5数字,但所有负数都会变为黑色,而转换时的黑色被设置为零psychopy.tools.imagetools.array2image我认为

2 个答案:

答案 0 :(得分:2)

好的,是的,问题与数组值的比例问题有关。基本上,您已经发现一个角落案例,PsychoPy没有正确处理(即一个错误)。

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

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

  1. 只需将您的阵列提供为NxN,而不是NxNx3。无论如何,这是正确的做法;它意味着你的计算/存储更少,并提供强度"这些值可以随时重新着色。这大致是您在提供NxNx3阵列的一个切片时已经发现的,但重点是您可以/应该只创建一个切片。

  2. 使用GratingStim,它可以将所有内容转换为有符号浮点值,而不是尝试计算出最佳值(尽管如此,您可能需要计算空间频率内容)

  3. 您可以通过重新缩放数组来添加一行来修复它(* 0.5 + 0.5),但是您必须设置一些内容以便仅针对此版本进行设置(我们将对其进行修复)在下一个版本之前)

  4. 基本上,我建议你这样做(1),因为它已经适用于过去,现在和将来的版本,无论如何都更有效。但是感谢让我们知道 - 我将努力确保我们将来能够抓住这个

    最好的祝福 乔恩

答案 1 :(得分:0)

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

可能的问题是零应该在哪里的问题。我想有一段时间numpy数组被视为具有0:1的val,而PsychoPy的其余部分期望值为-1:1,因此可能需要使用array=array*2-1重新调整您的值以恢复旧值(不良行为)。或者也检查不透明度,这可能有类似的问题。如果你写一个最小的例子,我会正确阅读/测试

由于