使用PIL库随机修改像素颜色为何仅首次生效,后续结果重复?
解决随机像素修改重复的问题
看起来你遇到的问题是每次运行代码生成的图片都一模一样,这其实是Python random 模块的随机数种子在搞鬼!让我一步步给你拆解原因和解决办法:
问题根源
Python的random模块在你第一次导入时,会自动用系统当前时间作为初始种子来生成随机数序列。但如果你的程序运行速度很快(比如处理的图片不大),或者短时间内多次运行,系统时间的精度可能不足以产生不同的初始种子,导致每次生成的随机数序列完全相同,最终输出的图片自然就一样了。
另外,我还注意到你代码里有个小笔误:你定义了v = randint(0,255),但后面赋值给像素的时候用的还是原来的g值,这会导致绿色通道根本没被随机修改哦!
解决思路和修改后的代码
1. 手动设置随机数种子
在代码开头添加random.seed(),可以传入当前时间的高精度值,或者用系统随机源来确保每次种子都不一样。比如用time.time()(精确到秒级以上),或者更安全的os.urandom()(用系统的随机字节生成种子)。
2. 修正变量名笔误
把v改成g,这样绿色通道才会被随机修改。
修改后的代码如下:
from PIL import Image from random import randint, seed import time # 或者用os模块 # 设置随机种子,确保每次运行的随机序列不同 seed(time.time()) # 用当前时间的高精度值作为种子 # 或者用更安全的方式: # import os # seed(os.urandom(4)) picture_1 = Image.open("panda.jpg") largeur, longueur = picture_1.size print(largeur,"*",longueur) picture_2 = Image.new("RGB", (largeur, longueur)) for x in range(largeur) : for y in range(longueur) : (r, g, b) = picture_1.getpixel((x,y)) r = randint(0,25) g = randint(0,255) # 修正了变量名v为g b = randint(0,255) picture_2.putpixel((x,y), (r, g, b)) picture_2.save("pandatest6.jpg") picture_2.show()
额外优化建议
用putpixel逐个修改像素的速度比较慢,如果处理大图片的话,建议把图片转换成numpy数组来批量处理,效率会高很多。比如:
from PIL import Image from random import seed import numpy as np import time seed(time.time()) picture_1 = Image.open("panda.jpg") img_array = np.array(picture_1) # 批量生成随机值,替换对应通道 img_array[:, :, 0] = np.random.randint(0, 26, size=img_array.shape[:2]) # 红色通道 img_array[:, :, 1] = np.random.randint(0, 256, size=img_array.shape[:2]) # 绿色通道 img_array[:, :, 2] = np.random.randint(0, 256, size=img_array.shape[:2]) # 蓝色通道 picture_2 = Image.fromarray(img_array) picture_2.save("pandatest6.jpg") picture_2.show()
这样不仅解决了随机重复的问题,处理速度也会快很多哦!
内容的提问来源于stack exchange,提问作者Louise D.
相关产品推荐
相关产品推荐

