图像处理(九)-图片和数组的转换

✨✨✨ 感谢优秀的你打开了小白的文章 “希望在看文章的你今天又进步了一点点,离美好生活更近一步!”🌈

🚀往期回顾

图像的基本处理(一) 图像的基本处理(二) 图像的基本处理(三)
图像的基本处理(四) 图像的基本处理(五)ImageDraw 模块的使用

前言

在过程中,往往需要制作自己的数据集,相关论文中的现成的数据集尽管可以用来直观地感受算法的效果,但是与自己的项目需求都是有一定出入的。在有大量的图片样本时,我们首先需要读取图片,将其转化为数组,并在控制台打印出来,直观地看到图片对应的矩阵是什么样子的。

将图片转化成numpy数组

例如:只是将一张照片转化为数组,那么可以简单的这样写。

from PIL import Image 
import numpy as np

image = Image.open("2.jpg") 
image_arr = np.array(image) # 转化成numpy数组

转换实例

我们的任务:是将在./images/中的图片转化为数组,并将转化的数组保存,然后尝试将数组再转化为图片保存在./result/中。
from PIL import Image
import numpy as np
import os
import pickle

#读取图片的目录
image_dir=./images/
#保存图片的目录
result_dir=./result/
#保存数组的文件
array_file=./array.bin
#读取images目录下的图片,将图片保存成大的一维数组,将数组保存到文件
def image_to_array_file():
    #获取8张图片的名称
    filenames=os.listdir(image_dir)
    #定义变量保存8张图片的大数组
    image_arrs=np.array([])
    for filename in filenames:
        #读取图片
        img=Image.open(image_dir+filename)
        #将每张图片分隔
        r,g,b=img.split()
        #将r g b 转换为一维的数组
        r_arr=np.array(r).reshape(62500)
        g_arr=np.array(g).reshape(-1)
        b_arr=np.array(b).reshape(62500)
        #将 r_arr  g_arr  b_arr 拼接为一维数组
        arrs=np.concatenate((r_arr,g_arr,b_arr))
        image_arrs=np.concatenate((arrs,image_arrs))

    #将一维数组保存到文件中
    with open(array_file,wb) as f:
        pickle.dump(image_arrs,f)


#读取文件中的内容,转换图片
def file_to_image():
    with open(array_file,rb) as f:
        images=pickle.load(f)
        image_arr=images.reshape((8,3,250,250))
    for i in range(8):
        r=Image.fromarray(image_arr[i][0]).convert(L)
        g=Image.fromarray(image_arr[i][1]).convert(L)
        b=Image.fromarray(image_arr[i][2]).convert(L)
        #合并图片
        image=Image.merge(RGB,(r,g,b))
        image.save(result_dir+str(i)+.jpg)

if __name__ == __main__:
    file_to_image()

那么我们可以得到一个关于存储数组的array文件,里面就是包含我们所需要的训练的数据。

经验分享 程序员 微信小程序 职场和发展