2012-10-17 26 views
2

我想擾亂圖像中的所有像素,我的Knuths shuffle(以及其他人)的實現似乎失敗。似乎它正在做每一行。我無法弄清楚爲什麼 - 只是看不到它。Python圖像洗牌失敗 - 我哪裏出錯了?

這裏是發生了什麼:

enter image description hereenter image description here

這是不是很scrambly!那麼,它可能會更加瘋狂,而且還需要更多的抓鬥。

這裏是我的代碼:

import Image 
from numpy import * 

file1 = "lhooq" 
file2 = "kandinsky" 

def shuffle(ary): 
    a=len(ary) 
    b=a-1 
    for d in range(b,0,-1): 
     e=random.randint(0,d) 
     ary[d],ary[e]=ary[e],ary[d] 
    return ary 

for filename in [file1, file2]: 
    fid = open(filename+".jpg", 'r') 
    im = Image.open(fid) 

    data = array(im) 

    # turn into array 
    shape = data.shape 
    data = data.reshape((shape[0]*shape[1],shape[2])) 

    # Knuth Shuffle 
    data = shuffle(data) 

    data = data.reshape(shape) 
    imout = Image.fromarray(data) 

    imout.show() 

    fid.close() 
+1

那蒙娜麗莎似乎有鬍子。此外,在'shuffle'中,您正在遍歷圖像中的每一行。嘗試'將圖像重塑成一維數組,然後洗牌。 – Blender

+0

IIRC'形狀'將會是'(高度,寬度,通道)',所以他的'重塑'應該已經變平了。 – nneonneo

+0

這是馬塞爾杜尚的LHOOQ。 http://en.wikipedia.org/wiki/L.H.O.O.Q。行數據= data.reshape((形狀[0] *形狀[1],形狀[2]))應該做你說的。我想打亂像素位置而不是它們的顏色。 – Lucas

回答

1

ary是一個二維數組,ary[d]是一個數組的視圖而不是內容的副本。

因此,ary[d],ary[e]=ary[e],ary[d]相當於分配ary[d] = ary[e]; ary[e] = ary[e],由於ary[d]在RHS是一個簡單的指針的aryd個元素(相對於像素值的副本)。

爲了解決這個問題,你可以使用高級索引

ary[[d,e]] = ary[[e,d]] 
+0

不錯!我今天學到了東西! – Lucas