从 uint8 RGB 像素数据制作图像

问题描述 投票:0回答:1

我正在尝试制作一个与RGB像素数据相关的库,但似乎无法正确保存图像数据。

Image

这是我的输出图像。 这是我的代码:

像素管理器.py

from PIL import Image
import numpy as np

class MakeImgFromPixelRGB:
    def createIMG(PixelArray: list, ImgName: str, SaveImgAsFile: bool):
        # Convert the pixels into an array using numpy
        array = np.array(PixelArray, dtype=np.uint8)
        if SaveImgAsFile == True:
            new_image = Image.fromarray(array)
            new_image.save(ImgName)
class getPixelsFromIMG:
    def __init__(self, ImagePath):
        im = Image.open(ImagePath, 'r')
        width, height = im.size
        pixel_values = list(im.getdata())
        self.output = pixel_values

测试.py

import pixelmanager

a = pixelmanager.getPixelsFromIMG(ImagePath="download.jpg")

pixelmanager.MakeImgFromPixelRGB.createIMG(a.output, "output.png", True)

with open("output.txt", "w") as f:
    for s in a.output:
        f.write(str(s) + "," + "\n")

我尝试过在paint.net中对图像进行缩放,也尝试过改变uint大小。

python python-imaging-library pixel rgb txt
1个回答
0
投票

将图像视为 Python 像素列表通常不是最好的主意,因为它很慢并且容易出错。一般来说,您希望使用以

C
编码并处理
PIL Image
类型的 PIL 函数,或者高度矢量化/优化并处理 Numpy 数组的 Numpy 或 OpenCV。

无论如何,如果你真的非常想处理列表(其实你不想),你需要记住,当你针对 JPEG 调用

Image.getdata()
时,你将得到一个 flat RGB 元组列表。因此,如果您的图像是 640x480 像素,并且您执行以下操作:

im = Image.open('image.jpg')
px = list(im.getdata())

您将得到一个包含 307,200 个条目的列表,每个条目都是一个 RGB 元组。 但是您的列表不再知道图像的高度和宽度。因此,当您随后这样做时:

array = np.array(PixelArray, dtype=np.uint8)

你的数组现在的形状是 (307200,3) 而不是 (480,640,3) - 太棒了,你在输出图像中得到了一长串像素。

如果您坚持使用列表,则需要保留原始图像的高度和宽度,因此您可以这样做:

array = np.array(PixelArray, dtype=np.uint8).reshape(h,w,3)
© www.soinside.com 2019 - 2024. All rights reserved.