【问题标题】:pixel by pixel reconstruct image in python在python中逐像素重建图像
【发布时间】:2017-09-11 01:44:02
【问题描述】:

我有一个脚本,它以十六进制列出图像中的所有像素数据。 PIL 或类似库是否有一种简单的方法可以从输出文本中重建图像?这是我用来获取数据的方法

#!/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))

输出(剪辑)

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 我用于测试的图像

【问题讨论】:

  • 图像大小为 305x314 写入图像时是否需要定义?任何在正确方向上的提示,文档等将不胜感激。我是图像处理新手
  • 您可以使用类似的 for 循环代码从文本文件中重建图像。但是,这是您可以选择的保存和加载图像的最低效的方式。为什么不将图像保存为某种适当的图像格式?
  • @SvenMarnach 什么会更有效率?将像素放在平面阵列中?我需要所有的像素数据。我知道它效率不高,但它做了我需要它做的事情。我有一些包含此类数据的文本文件,我正在尝试从中重建图像。
  • 那么您是从外部来源获取这种格式的图像吗?鉴于您展示了以这种格式存储图像的代码,我假设您正在自己生成文件。如果你控制存储图像的代码,你应该只使用一些图像格式,比如 PNG。它将使用 20 倍的存储空间,并且加载速度将提高数百倍。如果您不控制图像的来源,则必须执行以下答案中的操作或类似操作。
  • 您可以使用img.save("img.png") 将图像保存为PNG,然后使用img = Image.load("img.png") 再次加载它,这比您所做的更容易和更快。这是我建议你做的。

标签: python image-processing


【解决方案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,以及。

【讨论】:

  • 这几乎可以工作,我的意思是如果我将这些行添加到我的脚本中,它确实会创建图像 foo.png。 Image.frombytes 从缓冲区中获取数据,我试图从文本文件(上面的输出)而不是从内存中重新创建图像。
【解决方案2】:

我最终更改了我的代码以提取 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    相关资源
    最近更新 更多