2017-09-02 111 views
1

我有一個腳本,它列出了圖像中十六進制的所有像素數據。 PIL或類似的庫是否可以輕鬆地從輸出文本重構圖像?這是我用它來獲取數據像素逐像素python重構圖像

#!/usr/bin/python 
from PIL import Image 

def rgb2hex(r, g, b): 
    return '#{:02x}{:02x}{:02x}'.format(r, g, b) 

img = Image.open('apple_raw.png') 

if img.mode in ('RGBA', 'LA') or (img.mode == 'P' and 'transparency' in img.info): 
    pixels = img.convert('RGBA').load() 
    width, height = img.size 

    for x in range(width): 
     for y in range(height): 
      r, g, b, a = pixels[x, y] 
      print '%s,%s,%s' % (x, y, rgb2hex(r, g, b)) 

輸出(SNIP)

0,0,#ffffff 
0,1,#ffffff 
0,2,#ffffff 
0,3,#ffffff 
0,4,#ffffff 
... 
... 
304,308,#ffffff 
304,309,#ffffff 
304,310,#ffffff 
304,311,#ffffff 
304,312,#ffffff 
304,313,#ffffff 

http://imgur.com/a/5YT9H像我使用的測試

+0

圖像大小是305x314我必須定義寫圖像時?任何提示在正確的方向看什麼,文件等將不勝感激。我是圖像處理新手 – Adam

+0

您可以使用類似的for-loop代碼從文本文件重建圖像。但是,這是保存和加載您可以選擇的圖像的最低效方式。你爲什麼不以一些適當的圖像格式保存圖像? –

+0

@SvenMarnach什麼會更有效?把像素放在一個平面陣列中?我需要所有的像素數據。我知道它效率不高,但它做我需要做的事情。我有一些這類數據的文本文件,我試圖從它重建圖像。 – Adam

回答

0

我最終改變我的代碼來提取rgb而不是十六進制(255,255,255),我很難從一個文件中分割出x,y和rgb元組,所以我將文件分成兩個文件,一個用於RGB和一個座標。然後我用numpy和scipy來映射像素。這裏是代碼,以防止其他人試圖做類似的事情。這可能不是實現這一目標的理想方式,但我得到了理想的結果。

import numpy as np 
import itertools 
import scipy.misc as sc 

img = np.zeros((305,314,3), dtype=np.uint8) 

with open ('coordinates') as coord, open('rgbvalues') as rgb: 
    for coord,rgb in itertools.izip(coord,rgb): 
     rgb = map(int, rgb.split(',')) 
     r = rgb 

     coord = map(int, coord.split(',')) 
     c = coord 
     img[c[0],c[1]] = [r[0],r[1],r[2]] 
    img = sc.toimage(img) 
    img.show() 
1

您可以創建一個新的形象,並設置圖像的像素數據:

width, height = (305, 314) 

new_image = Image.new('RGB', (width, height)) 
data = new_image.load() 

for y in range(height): 
    for x in range(width): 
     data[(x, y)] = (r, g, b) 

new_image.save('foo.png', 'png') # or another format 

看看Image.frombytesImage.fromstring,以及。

+0

我會看看那些,謝謝 – Adam

+0

這幾乎可以工作,我的意思是它創建圖像foo.png,如果我添加行到我的腳本。 'Image.frombytes'從緩衝區獲取數據,我試圖從文本文件(上面的輸出)中重新創建圖像,而不是從內存中重新創建。 – Adam