Думаю тут и PIL сгодится. Сначала задав код для рисования по пиксельно нужного изображения. А дальше создать список с разными цветами, с которого потом через random выбирать нужный цвет.
Т.е. создать по функции для рисования определёных одноцветных мест рисунка. А далее выбирая через random случайный код света, передавать его функции, для отрисовки.
Update: я пока лишь так, быстро просмотрел PIL, написал пусть и не до конца идеальный, но для начала сойдёт - мини-код. Он берёт из папки уже существующее входное изображение, а на выходе изменённое со случайными цветами.
from PIL import Image, ImageDraw
from random import randint
import time
image = Image.open('enter-image.png')
pix = image.load()
width = image.size[0]
height = image.size[1]
draw = ImageDraw.Draw(image)
pixel_id = []
print(f'Через 3 секунды начнётся анализ картинки. Размеры {width}x{height}')
time.sleep(3)
start_time = time.time()
for x in range(width):
for y in range(height):
print(x, y)
if not pix[x,y] in [i[0] for i in pixel_id]:
pixel_id.append([pix[x,y], []])
pixel_id[[i[0] for i in pixel_id].index(pix[x,y])][1].append((x,y))
for a in pixel_id:
color = (randint(0, 255), randint(0, 255) , randint(0, 255))
for draw_zone in a[1]:
draw.point(draw_zone, color)
print('Проработка изменённой картинки завершена. Начинается сохранение.')
image.save("output-image.png")
print(f'Сохранение завершено за {time.time()-start_time}.')
Если же нужно чтоб какие-то цвета не брало в счёт, можно приделать такую проверку.
if pix[x,y] not in [(0, 0, 0, 255), (255,255,255, 255)]:
if not pix[x,y] in [i[0] for i in pixel_id]:
pixel_id.append([pix[x,y], []])
pixel_id[[i[0] for i in pixel_id].index(pix[x,y])][1].append((x,y))