You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实验图像像素颜色修改求助:背景转灰、绘图转红及代码报错解决

嗨,我来帮你搞定这个图像颜色替换的问题!

首先咱们先搞清楚你遇到的 TypeError: 'int' object has no attribute 'getitem' 是咋回事:你加载的图片大概率是灰度模式(L模式),不是RGB彩色模式。这种模式下,getpixel() 返回的是一个0-255之间的整数(代表灰度值,0是黑,255是白),不是你预期的RGB三元组,所以你用 current_color[0] 去索引自然会报错啦。

接下来给你两种可行的解决方案,从简单到高效:

方案1:先转成RGB模式再处理(适合新手理解)

先把灰度图转成RGB模式,这样每个像素都会变成(r,g,b)的三元组,然后再按你原来的逻辑修改颜色:

from PIL import Image

fname = exp.get_file('PICTURE_1.png')
picture = Image.open(fname)
# 把灰度图转成RGB模式
picture_rgb = picture.convert('RGB')
width, height = picture_rgb.size

for x in range(width):
    for y in range(height):
        r, g, b = picture_rgb.getpixel((x, y))
        # 黑色(灰度接近0)改成红色
        if r < 20 and g < 20 and b < 20:
            picture_rgb.putpixel((x, y), (255, 0, 0))
        # 白色(灰度接近255)改成灰色
        elif r > 235 and g > 235 and b > 235:
            picture_rgb.putpixel((x, y), (115, 115, 115))

picture_rgb.show()
win.flip()
clock.sleep(1000)

方案2:直接利用灰度值判断+转RGB(更高效)

既然原图是灰度图,咱们可以直接用灰度值判断颜色,再转成RGB模式修改,省去冗余的通道判断:

from PIL import Image

fname = exp.get_file('PICTURE_1.png')
# 先确保图像是灰度模式
picture_gray = Image.open(fname).convert('L')
# 转成RGB模式以便修改为彩色
picture_rgb = picture_gray.convert('RGB')
width, height = picture_rgb.size

for x in range(width):
    for y in range(height):
        # 用原灰度图的像素值判断
        gray_val = picture_gray.getpixel((x, y))
        if gray_val < 20:
            # 黑色线条改成红色
            picture_rgb.putpixel((x, y), (255, 0, 0))
        elif gray_val > 235:
            # 白色背景改成灰色
            picture_rgb.putpixel((x, y), (115, 115, 115))

picture_rgb.show()
win.flip()
clock.sleep(1000)

进阶高效方案:用Numpy批量处理(大图片首选)

如果你的实验图片尺寸较大,双重循环会很慢,用Numpy批量修改像素能大幅提升速度:

from PIL import Image
import numpy as np

fname = exp.get_file('PICTURE_1.png')
picture = Image.open(fname).convert('RGB')
# 转成Numpy数组方便批量操作
pic_np = np.array(picture)

# 生成黑色区域的掩码(三个通道值都接近0)
black_mask = (pic_np[:, :, 0] < 20) & (pic_np[:, :, 1] < 20) & (pic_np[:, :, 2] < 20)
# 生成白色区域的掩码(三个通道值都接近255)
white_mask = (pic_np[:, :, 0] > 235) & (pic_np[:, :, 1] > 235) & (pic_np[:, :, 2] > 235)

# 批量修改颜色
pic_np[black_mask] = (255, 0, 0)
pic_np[white_mask] = (115, 115, 115)

# 转回PIL图像
modified_pic = Image.fromarray(pic_np)
modified_pic.show()
win.flip()
clock.sleep(1000)

需要注意:这个方法需要先安装Numpy,执行 pip install numpy 即可。

你可以先从方案1入手,理解清楚逻辑后,再根据图片大小选择更高效的方法~

内容的提问来源于stack exchange,提问作者Minne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:08:01