如何用Python按指定公式处理图像得到隐藏flag的目标图像d
问题分析
- 核心逻辑错误:题目给出的
d = y - 21a - 3b + 41c是像素通道值的算术运算,你当前代码中使用的^异或、~按位取反、&按位与都属于位运算,和要求的加减计算逻辑完全不符,这是最主要的问题。 - 像素值边界问题:RGB图像每个通道的取值范围是0~255的无符号8位整数,直接做算术运算会出现负数或者超出255的情况,需要对最终计算结果取模256,才能得到合法的像素值。
修正后的代码
from PIL import Image # 加载所有输入图像 imagey = Image.open('y.png') imagea = Image.open('a.png') imageb = Image.open('b.png') imagec = Image.open('c.png') width, height = imagey.size # 创建输出图像 new_img = Image.new('RGB', (width, height)) imgy = imagey.load() imga = imagea.load() imgb = imageb.load() imgc = imagec.load() data = new_img.load() # 逐像素按公式计算 for x in range(width): for y in range(height): # 分别取三个通道的值计算 r = imgy[x,y][0] - 21 * imga[x,y][0] - 3 * imgb[x,y][0] + 41 * imgc[x,y][0] g = imgy[x,y][1] - 21 * imga[x,y][1] - 3 * imgb[x,y][1] + 41 * imgc[x,y][1] b = imgy[x,y][2] - 21 * imga[x,y][2] - 3 * imgb[x,y][2] + 41 * imgc[x,y][2] # 处理值的范围,取模256得到合法的0-255像素值 r = int(r % 256) g = int(g % 256) b = int(b % 256) data[x,y] = (r, g, b) new_img.save('final.png') new_img.show()
补充说明
如果运行后图像显示仍然异常,可以尝试将模运算替换为max(0, min(255, int(val)))做截断处理,或者检查所有输入图像的尺寸、通道数是否一致,以上代码已经完全匹配题目给出的计算公式要求,正常运行即可得到包含flag的目标图像d。
内容的提问来源于stack exchange,提问作者newcoder
相关产品推荐
相关产品推荐

