我正在尝试创建一个混合图像像素的算法,我可以像以前那样拍摄图像,但我不知道这样做。
我正在使用python和pil,但我可以使用其他库。
例如:到并返回
谢谢。
答案 0 :(得分:5)
这应该这样做。没有错误处理,它没有遵循pep8标准,它使用慢速PIL操作,并且它没有使用参数解析库。我确定还有其他不好的事情。
它通过播种python的随机数生成器,在加扰下使用图像的不变量。使用大小的哈希值。由于尺寸没有改变,因此对于所有共享相同尺寸的图像,在其上构建的随机序列将是相同的。该序列用作一对一映射,因此它是可逆的。
可以从shell调用两次脚本来创建两个图像," scrambled.png"和" unscrambled.png"。 " Qfhe3.png"是源图像。
python scramble.py scramble "./Qfhe3.png"
python scramble.py unscramble "./scrambled.png"
-
#scramble.py
from PIL import Image
import sys
import os
import random
def openImage():
return Image.open(sys.argv[2])
def operation():
return sys.argv[1]
def seed(img):
random.seed(hash(img.size))
def getPixels(img):
w, h = img.size
pxs = []
for x in range(w):
for y in range(h):
pxs.append(img.getpixel((x, y)))
return pxs
def scrambledIndex(pxs):
idx = range(len(pxs))
random.shuffle(idx)
return idx
def scramblePixels(img):
seed(img)
pxs = getPixels(img)
idx = scrambledIndex(pxs)
out = []
for i in idx:
out.append(pxs[i])
return out
def unScramblePixels(img):
seed(img)
pxs = getPixels(img)
idx = scrambledIndex(pxs)
out = range(len(pxs))
cur = 0
for i in idx:
out[i] = pxs[cur]
cur += 1
return out
def storePixels(name, size, pxs):
outImg = Image.new("RGB", size)
w, h = size
pxIter = iter(pxs)
for x in range(w):
for y in range(h):
outImg.putpixel((x, y), pxIter.next())
outImg.save(name)
def main():
img = openImage()
if operation() == "scramble":
pxs = scramblePixels(img)
storePixels("scrambled.png", img.size, pxs)
elif operation() == "unscramble":
pxs = unScramblePixels(img)
storePixels("unscrambled.png", img.size, pxs)
else:
sys.exit("Unsupported operation: " + operation())
if __name__ == "__main__":
main()