Colors 更改图像的背景和像素颜色

Colors 更改图像的背景和像素颜色,colors,pixel,psychopy,Colors,Pixel,Psychopy,对于一个实验,我想向参与者展示一个数据库中的图形,该数据库包括在白色背景上绘制的黑色线条。最终,我只想以某种颜色显示每个图像的“绘制部分”。所以我希望图像的白色部分变成灰色,所以它与灰色背景无法区分。我想用其他颜色显示图像(实际图形)的黑色部分,例如红色 我对编程很陌生,到目前为止我还没有找到答案。我试过几种方法,包括下面的两种选择 有没有人能给我举个例子,告诉我如何改变我贴在这封邮件上的图片的颜色? 非常感谢! [在此处输入图像描述][1] ####### OPTION 1, not

对于一个实验,我想向参与者展示一个数据库中的图形,该数据库包括在白色背景上绘制的黑色线条。最终,我只想以某种颜色显示每个图像的“绘制部分”。所以我希望图像的白色部分变成灰色,所以它与灰色背景无法区分。我想用其他颜色显示图像(实际图形)的黑色部分,例如红色

我对编程很陌生,到目前为止我还没有找到答案。我试过几种方法,包括下面的两种选择

有没有人能给我举个例子,告诉我如何改变我贴在这封邮件上的图片的颜色? 非常感谢! [在此处输入图像描述][1]

    ####### OPTION 1, not working
#picture = Image.open(fname)
fname = exp.get_file('PICTURE_1.png')
picture = Image.open(fname)

# Get the size of the image
width, height = picture.size

# Process every pixel
for x in range(width):
   for y in range(height):
       current_color = picture.getpixel( (x,y) )
       if current_color == (255,255,255): 
           new_color = (255,0,0)
           picture.putpixel( (x,y), new_color)
       elif current_color == (0,0,0):
           new_color2 = (115,115,115)
           picture.putpixel( (x,y), new_color2)
           picture.show()

#picture.show()
win.flip()
clock.sleep(1000)
按照您的建议实施的更改给出了:TypeError:“int”对象没有属性“getitem
for x in range(width):
   for y in range(height):
       current_color = picture.getpixel( (x,y) )
       if (current_color[0]<200) and (current_color[1]<200) and (current_color[2]<200):
           new_color = (255,0,0)
           picture.putpixel( (x,y), new_color)
       elif (current_color[0]>200) and (current_color[1]>200) and (current_color[2]>200):
           new_color2 = (115,115,115)
           picture.putpixel( (x,y), new_color2)
           picture.show()
范围(宽度)内x的
:
对于范围内的y(高度):
当前颜色=picture.getpixel((x,y))
如果(当前颜色[0]200):
新颜色2=(115115)
图片。像素((x,y),新颜色2)
图片显示()

您在选项一中的方法基本上是正确的,但以下是一些帮助您使其正常工作的提示:

如果当前颜色==(255255255):,则应改为放置
if(当前颜色[0]>200)和(当前颜色[1]>200)以及(当前颜色[2]>200):

即使图像的白色部分看起来是白色的,像素也可能不完全是白色的(255255)

我以为你想把白色部分变成灰色,黑色部分变成红色?在选项1的代码中,行
如果当前颜色==(255255):
新颜色=(255,0,0)

将使白色像素变为红色。要将黑色像素变为红色,如果当前颜色==(0,0,0),则应为

如果在进行这些更改时代码仍然无法工作,则可以尝试创建与原始图像尺寸相同的新图像,并向新图像添加像素,而不是编辑原始图像中的像素

另外,如果您能告诉我们在运行代码时实际发生了什么,这也会有所帮助。是否有错误信息,或是否显示图像但图像不正确?请附上一个输出示例好吗

更新: 我摆弄了你的代码,让它做你想做的事。以下是我最后得到的代码:

import PIL
from PIL import Image

picture = Image.open('image_one.png')

# Get the size of the image
width, height = picture.size

for x in range(width):
   for y in range(height):
       current_color = picture.getpixel( (x,y) )
       if (current_color[0]<200) and (current_color[1]<200) and (current_color[2]<200):
           new_color = (255,0,0)
           picture.putpixel( (x,y), new_color)
       elif (current_color[0]>200) and (current_color[1]>200) and (current_color[2]>200):
           new_color2 = (115,115,115)
           picture.putpixel( (x,y), new_color2)
picture.show()
导入PIL
从PIL导入图像
picture=Image.open('Image\u one.png'))
#获取图像的大小
宽度、高度=图片大小
对于范围内的x(宽度):
对于范围内的y(高度):
当前颜色=picture.getpixel((x,y))
如果(当前颜色[0]200):
新颜色2=(115115)
图片。像素((x,y),新颜色2)
图片显示()

如果您将此代码复制并粘贴到脚本中,并将其与图像放在同一文件夹中运行,则应能正常工作。

有比循环遍历每个像素并更改其值更有效的方法

因为它看起来像是在使用PsychoPy,所以您可以使用透明背景将图像保存为灰度。通过使用灰度图像格式,您可以让PsychoPy通过改变刺激颜色设置,将线条的颜色更改为您想要的任何颜色。通过使用透明背景,你在线条后面看到的任何东西都会显示出来,所以你可以选择有一个白色的正方形,一个不同的正方形,或者根本没有正方形。通过这种方法,所有颜色的计算都在图形卡上完成,并且可以在每一帧中进行更改,不会出现任何问题


如果出于某种原因,您需要以PsychoPy固有不允许的方式更改图像(如果处理速度很重要),那么您应该尝试在一次操作中更改所有像素(使用numpy阵列),而不是在for循环中一次更改一个像素。

您也可以执行
如果所有(当前颜色>200):
如果“当前颜色”是numpy数组,谢谢您的帮助!我已经实现了这些更改(正如你在我原来的帖子中看到的),但它仍然不起作用。奇怪的是,它没有给我一个错误代码,表明代码应该工作正常。但是实际上什么也没有发生。因此,在实现了关于if语句的更改后(参见原始帖子),出现了一个错误:TypeError:“int”对象没有属性“getitem”
exp.get_文件
行可能导致了错误,就像我在笔记本电脑上运行代码时,该行导致了错误一样(与您得到的错误不同)。当我删除该行并更改底线上的缩进时(picture.show()-您希望在for循环完成后运行此操作,而不是在每次迭代中),代码运行得非常完美。我已使用所用的代码更新了我的答案。