2013-07-21 2 views
0

이미지의 픽셀을 블렌딩하는 알고리즘을 만들려고하고 있으며 이미지를 이전과 같이 가져올 수는 있지만 잘 모르겠습니다.이미지의 픽셀을 파이썬을 사용하여 수동으로 섞음

저는 파이썬과 pil을 사용하고 있지만 다른 라이브러리를 사용할 수 있습니다.

Exemple : enter image description hereenter image description here에 다시

enter image description here 당신을 감사합니다.

+0

이 질문에 좀 더 세부 사항을 추가 할 수 있습니까? 이미 작성한 샘플 코드일까요? –

+0

이미지 압축에 대해 이야기 하시겠습니까? "블렌드"란 무엇을 의미합니까? – Jblasco

+0

@ ThePiedPipes 장소의 픽셀을 변경하고 믹스를 한 다음 이전과 같이 되돌리고 싶습니다. 불행히도 None이 없습니다! 코드가 아직 없습니다 : ( –

답변

3

이렇게해야합니다. 오류 처리는 없으며 pep8 표준을 따르지 않으며 느린 PIL 작업을 사용하며 인수 파싱 라이브러리를 사용하지 않습니다. 나는 그것에 대해 다른 나쁜 점도있을 것이라고 확신합니다.

이것은 파이썬의 난수 생성기에 스크램블링중인 이미지의 불변성을 시딩하여 작동합니다. 크기의 해시가 사용됩니다. 크기가 변경되지 않으므로 동일한 크기를 공유하는 모든 이미지에서 동일한 시퀀스가 ​​만들어집니다. 이 시퀀스는 일대일 매핑으로 사용되므로 가역적입니다.

스크립트는 두 개의 이미지 "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() 
관련 문제