2013-07-21 58 views
0

我想創建一個算法,混合圖像的像素,我可以把圖像像以前一樣,但我不知道這樣做。手動使用python混合像素的圖像

我正在使用python和pil,但我可以使用其他庫。

例:enter image description hereenter image description here和回enter image description here

謝謝。

+0

可以添加更多的細節這個問題?也許你已經寫了一些示例代碼? –

+0

你在說壓縮圖像嗎? 「混合」是什麼意思? – Jblasco

+0

@ThePiedPipes我想改變位置的像素,做一個混合,然後把它恢復原樣,不幸的是我沒有沒有!代碼還沒有:( –

回答

3

這應該這樣做。沒有錯誤處理,它不遵循pep8標準,它使用緩慢的PIL操作,並且不使用參數解析庫。我相信還有其他不好的事情。

它通過播種蟒蛇的隨機數發生器與擾亂下的圖像不變的作品。使用大小的散列。由於尺寸沒有改變,因此構建於其上的隨機序列對於共享相同尺寸的所有圖像將是相同的。該序列被用作一對一映射,因此它是可逆的。

該腳本可能會從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()