mm1798906228 2024-09-13 21:42 采纳率: 0%
浏览 59

npz格式数据集转换图片jpg

通过下面的代码将npz格式的数据集转换成jpg图片的时候出现全黑的图片错误,代码如下:


import os
import numpy as np
from PIL import Image
import zipfile
import matplotlib.pyplot as plt

def npz_to_jpg(npz_folder, output_folder):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    for file_name in os.listdir(npz_folder):
        if file_name.endswith('.npz'):
            file_path = os.path.join(npz_folder, file_name)

            try:
                # 确保文件是有效的 .npz 文件
                with zipfile.ZipFile(file_path, 'r') as zip_ref:
                    zip_ref.testzip()  # 测试文件完整性

                # 加载 .npz 文件
                npz_data = np.load(file_path)

                for array_name in npz_data.files:
                    x = npz_data[array_name]
                    plt.imshow(x)
                    plt.axis('off')
                    plt.show()
                    print("查看数据类型", type(x))
                    print("查看数组元素数据类型", (x).dtype)
                    print("查看数组元素总数", (x).size)
                    print("查看数组的shape", (x).shape)
                    print("查看数组的维度", (x).ndim)

                    if x.ndim == 3 and x.shape[2] == 1:
                        x = np.squeeze(x, axis=2)

                    print("查看数据类型", type(x))
                    print("查看数组元素数据类型", (x).dtype)
                    print("查看数组元素总数", (x).size)
                    print("查看数组的shape", (x).shape)
                    print("查看数组的维度", (x).ndim)

                    plt.imshow(x)
                    plt.axis('off')
                    plt.show()
                    image = Image.fromarray(x)

                    # 保存为 .jpg 文件
                    output_file = os.path.join(output_folder, f"{os.path.splitext(file_name)[0]}.jpg")
                    image.save(output_file)
                    print(f"Saved {output_file}")

            except (zipfile.BadZipFile, ValueError, IOError) as e:
                print(f"Error processing file {file_path}: {e}")


# 使用示例
npz_folder = '/home/mimi/modules/txt_generation'
output_folder = '/home/mimi/dataset/FantasticReality'
npz_to_jpg(npz_folder, output_folder)
print("saved all jpg")

#print输出的结果:

查看数据类型 <class 'numpy.ndarray'>
查看数组元素数据类型 uint8
查看数组元素总数 11943936
查看数组的shape (3456, 3456, 1)
查看数组的维度 3
查看数据类型 <class 'numpy.ndarray'>
查看数组元素数据类型 uint8
查看数组元素总数 11943936
查看数组的shape (3456, 3456)
查看数组的维度 2
Saved /home/mimi/dataset/FantasticReality/IMG_0000051_IMG_0000050.jpg
saved all jpg

其中在代码中的两次 plt.show() 的图片如下:

img

img


但是最后保存的图片却是全黑的,不知道这是为什么?求解答。

img

  • 写回答

3条回答 默认 最新

  • 铭渊老黄 新星创作者: Python技术领域 2024-09-17 06:19
    关注
    🕒上午好,题主!目前:🟢[在线]
    📢参考GPT-4o mini 模型、由清水白石008整理提供!
    📣今日金句:“成功是由对自己能力的信心和对目标的坚定信念所决定的。”** — 埃隆·马斯克
    

    从你的描述和代码来看,问题可能出在图像数据的处理和保存过程中。以下是一些可能的原因和解决方法:

    可能原因

    1. 数据范围问题

      • 图像数据的值范围可能不在 [0, 255] 之间,导致保存的图像显示为全黑。
    2. 数据类型问题

      • 图像数据的类型可能不适合直接转换为图像。

    解决方法

    1. 检查数据范围

      • 确保图像数据的值在 [0, 255] 之间。如果数据范围不对,可以进行归一化处理。
    2. 转换数据类型

      • 确保图像数据的类型为 uint8,这是图像数据的常用类型。

    修改后的代码

    以下是修改后的代码,添加了数据范围检查和类型转换:

    import os
    import numpy as np
    from PIL import Image
    import zipfile
    import matplotlib.pyplot as plt
    
    def npz_to_jpg(npz_folder, output_folder):
        if not os.path.exists(output_folder):
            os.makedirs(output_folder)
    
        for file_name in os.listdir(npz_folder):
            if file_name.endswith('.npz'):
                file_path = os.path.join(npz_folder, file_name)
    
                try:
                    # 确保文件是有效的 .npz 文件
                    with zipfile.ZipFile(file_path, 'r') as zip_ref:
                        zip_ref.testzip()  # 测试文件完整性
    
                    # 加载 .npz 文件
                    npz_data = np.load(file_path)
    
                    for array_name in npz_data.files:
                        x = npz_data[array_name]
                        plt.imshow(x)
                        plt.axis('off')
                        plt.show()
                        print("查看数据类型", type(x))
                        print("查看数组元素数据类型", (x).dtype)
                        print("查看数组元素总数", (x).size)
                        print("查看数组的shape", (x).shape)
                        print("查看数组的维度", (x).ndim)
    
                        if x.ndim == 3 and x.shape[2] == 1:
                            x = np.squeeze(x, axis=2)
    
                        # 确保数据范围在 [0, 255] 之间
                        if x.max() > 255 or x.min() < 0:
                            x = (255 * (x - x.min()) / (x.max() - x.min())).astype(np.uint8)
                        else:
                            x = x.astype(np.uint8)
    
                        print("查看数据类型", type(x))
                        print("查看数组元素数据类型", (x).dtype)
                        print("查看数组元素总数", (x).size)
                        print("查看数组的shape", (x).shape)
                        print("查看数组的维度", (x).ndim)
    
                        plt.imshow(x)
                        plt.axis('off')
                        plt.show()
                        image = Image.fromarray(x)
    
                        # 保存为 .jpg 文件
                        output_file = os.path.join(output_folder, f"{os.path.splitext(file_name)[0]}.jpg")
                        image.save(output_file)
                        print(f"Saved {output_file}")
    
                except (zipfile.BadZipFile, ValueError, IOError) as e:
                    print(f"Error processing file {file_path}: {e}")
    
    # 使用示例
    npz_folder = '/home/mimi/modules/txt_generation'
    output_folder = '/home/mimi/dataset/FantasticReality'
    npz_to_jpg(npz_folder, output_folder)
    print("saved all jpg")
    

    解释

    1. 数据范围检查

      • 检查数据的最大值和最小值,如果不在 [0, 255] 之间,则进行归一化处理。
    2. 数据类型转换

      • 将数据类型转换为 uint8,确保图像数据适合保存为图像文件。

    希望这些修改能帮助你解决问题!如果有任何进一步的问题或需要更多帮助,请随时告诉我。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月13日