实验图像像素颜色修改求助:背景转灰、绘图转红及代码报错解决
嗨,我来帮你搞定这个图像颜色替换的问题!
首先咱们先搞清楚你遇到的 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
相关产品推荐
相关产品推荐

