Python像素画图像矩阵叠加:np.where运行结果不符合预期求助
问题核心原因
你直接对Python原生列表L和元组tr做==比较,只会返回单个布尔值False(列表对象和元组对象不可能相等),完全不是你预期的「逐像素判断RGB值是否等于tr」的逐位布尔掩码。np.where接收到全为假的条件后,所有位置都会取第三个参数L的值,最终N和L完全一致。
修复方案
你需要先把M、L转为numpy数组,再对每个像素的三个RGB通道做全相等判断,生成逐位置的布尔掩码后再做替换,注意掩码需要补充维度匹配RGB数组的三维结构。
修正后的完整代码如下:
import numpy as np from PIL import Image import os dirname = os.path.dirname(__file__) dimensions = 480, 480 x=1 bg = (255,186,241) bb = (214,168,102) tr = (0,0,0) tl = (222,191,140) M = [ [bg,bg,bg,bg,bg,bg], [bg,bb,bb,bb,bg,bg], [bg,bb,bb,bb,bg,bg], [bg,bg,bg,bg,bg,bg], [bg,bg,bg,bg,bg,bg], [bg,bg,bg,bg,bg,bg] ] L = [ [tr,tr,tr,tr,tr,tr], [tr,tr,tr,tr,tr,tr], [tr,tr,tr,tr,tr,tr], [tr,tr,tr,tl,tr,tr], [tr,tr,tr,tl,tr,tr], [tr,tr,tr,tr,tr,tr] ] # 转为numpy数组 M_arr = np.array(M, dtype=np.uint8) L_arr = np.array(L, dtype=np.uint8) # 生成逐像素的匹配掩码,补充最后维度适配RGB三通道结构 mask = (L_arr == tr).all(axis=-1)[..., None] # 基于掩码替换值 N = np.where(mask, M_arr, L_arr) new_image = Image.fromarray(N) new_image = new_image.resize(dimensions, resample=0) imgname = dirname + '/testfolder/' + (str(x)) + '.png' new_image.save(imgname)
修改后运行,会保留M的原有图案,仅在L对应tl的两个位置替换为对应颜色,符合你的预期需求。
内容的提问来源于stack exchange,提问作者Stuart Baker
相关产品推荐
相关产品推荐

