2013-10-28 58 views
0

我試圖定義一個函數,它會在不使用PIL的情況下模糊python中的圖像。每個像素的顏色需要與8個周圍像素的顏色平均,即:在沒有PIL的情況下在Python中模糊圖像

o的值需要用x的所有值進行平均。

x x x 
x o x 
x x x 

我有:

def blur(): 
global photo 
pixels = Image.getPixels(photo) 
for row in range(photo.height()): 
    for col in range(photo.width()): 
     red = pixels[row][col][0] 
     green = pixels[row][col][1] 
     blue = pixels[row][col][2] 
Image.setPixels(photo,pixels) 

凡Image.getPixels()返回在同一列表0和255之間的紅色,綠色和藍色值([0]返回紅色,[1]返回綠色,[2]返回藍色)以及由行和列表示的x和y值。我已經相當廣泛地搜尋了正確方向的提示,但沒有找到任何相關的內容。任何想法/幫助將不勝感激。謝謝!

+0

聽起來像你已經有了做什麼的想法。平均每個像素與八個周圍的鄰居。有什麼問題? – Kevin

+0

我會說你需要創建一個圖像的硬拷貝,這樣你就可以用原始值(避開的技巧,例如,使用已經改變的值來進一步改變其他值)來操作副本。那麼我建議你考慮使用切片的平均值。所有這些都要小心圖像的邊界(如果row = 1,我們不想使用像素[row-3],你不同意嗎?希望它們有足夠的提示朝正確的方向發展。 – Jblasco

+0

我想我的問題是我根本不瞭解如何獲得8個周圍像素的值,我知道如何平均他們,一旦我獲得這些值,但這就是我卡住的地方 – user2884456

回答

1

我認爲這是作業,所以我不會寫出代碼。你可以使用numpy向量化,這裏有一個指針How to vectorize this python code?來總結上面的三個和下面的三個然後硬編碼在兩邊加上併除以8.然後在新的三維數組中重新分配紅色的藍色和綠色,你可以預先分配爲舊圖像的大小。

0

Ofc來計算8個元素的平均值,您需要有這些元素的總和,所以從這裏開始。讓我們來思考這些元素會有什麼索引。如果中間的像素是[x] [y],那麼比右邊的像素會有[x + 1] [y],並且其上的像素會有[x] [y + 1]。找出你需要的所有八個索引,並總結這8個值。最後將結果除以8. 同樣重要的是使用兩個不同的表格(只需將圖像副本複製到另一個表格中) - 您從中計算平均值的值,然後在其中保存新像素,因爲否則,只使用一個表格來計算下一個像素,您將使用已經更改的像素的平均值。

相關問題