2013-05-04 35 views
0

像素數據欲執行以下操作:像素由在Python

  • 負載PNG圖像與Python代碼
  • 由像素RGB數據獲取像素在三個陣列,每一個用於R,G一個和B.我的意思是R [i,j]應該給我R值在圖像的第i,j個像素處。
  • 一旦我有陣列,我總是可以編輯數據。
  • 劇情使用三個陣列R,G和B,並保存爲另一個png圖片

如何去做在python編輯的數據?

+1

見答案:http://stackoverflow.com/questions/138250/read-the-rgb-value-of-given-pixel-in-python-programatically – ojs 2013-05-04 13:17:13

+1

@lovespeed。既然你已經知道你想要做什麼的高水平,你就在中途。另一半則試圖完成各個步驟。爲什麼不去學習如何在python中加載圖像,並在*之後發佈一個問題*你被困住了。 – jpaugh 2017-08-21 15:35:41

回答

4

使用PIL加載圖像:

from PIL import Image 
img = Image.open('yourimage.png') 

我要去表明,與圖像數據直接弄亂的方法,無需通過座標訪問單個像素。

您可以在一個大的字節串獲得的圖像數據:

data = img.tostring() 

您應該檢查img.mode的像素格式。 假設它是「RGBA」,下面的代碼會給你不同的渠道:

R = data[::4] 
G = data[1::4] 
B = data[2::4] 
A = data[3::4] 

如果您要訪問的協調,你可以做類似像素:

width = img.size[0] 
pixel = (R[x+y*width],G[x+y*width],B[x+y*width],A[x+y*width]) 

我們把它補好,有可能是一個更好的辦法,但你可以使用zip

new_data = zip(R,G,B,A) 

而且reuce:

new_data = ''.join(reduce(lambda x,y: x+y, zip(R,G,B,A))) 

然後保存圖片:

new_img = Image.fromstring('RGBA', img.size, new_data) 
new_img.save('output.png') 

而在這歸零紅色通道的例子這裏的一切融合在一起:這裏

from PIL import Image 
img = Image.open('yourimage.png') 

data = img.tostring() 
R = data[::4] 
G = data[1::4] 
B = data[2::4] 
A = data[3::4] 

R = '\0' * len(R) 

new_data = ''.join(reduce(lambda x,y: x+y, zip(R,G,B,A))) 
new_img = Image.fromstring('RGBA', img.size, new_data) 
new_img.save('output.png') 
+0

'tostring()'被棄用,而使用'data = str(img.tobytes)'' – Akshay 2016-06-25 08:03:28