2017-09-02 73 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