本文以转化《quick draw》数据集为例,介绍如何将.npy转为灰度图(或RGB图)。因为本人要使用easydl训练数据,所以必须把该数据集由28 * 28像素转化为30 * 30像素及以上。
import matplotlib.pyplot as plt
import numpy as np
import scipy.misc
import os
from PIL import Image
file_dir = "E:/inputplace/" # npy文件路径
dest_dir = "E:/outputplace/" # 图片文件存储的路径
def npy_png(file_dir, dest_dir):
file = file_dir + 'bird.npy' # .npy文件名
con_arr = np.load(file)
count = 0 # 序号,用作设置文件名
for con in con_arr:
arr=con
# print(array.shape) # 查看数据集size
# 本人使用的数据集存储长为784的矩阵,即数据集图片为28*28像素
arr = np.reshape(arr, (28, 28))
# 括号内数值根据相应的数据集或需求修改
im = Image.fromarray(arr)
im = im.convert('L') # 转为灰度图
resized_image = im.resize((40, 40), Image.ANTIALIAS)
# 修改像素值为40*40
resized_image.save(dest_dir + "_" + '{:06d}'.format(count) + ".png")
# 设定图片文件名为6位,如_000100.png
'''
path=dest_dir + "_" + '{:06d}'.format(count) + ".png"
image = Image.open(path)
image = image.convert("RGB") # 转换为RGB
os.remove(path)
image.save(path) # RGB图片替换此灰度图
'''
count = count + 1
if __name__ == "__main__":
npy_png(file_dir, dest_dir)
注释内为灰度图更进一步转为三通道RGB图的方法
from PIL import Image
def produceImage(file_in, width, height, file_out):
image = Image.open(file_in)
resized_image = image.resize((width, height), Image.ANTIALIAS)
resized_image.save(file_out)
if __name__ == '__main__':
file_in = 'E:/data/from.jpg' # 原图位置
width = 40
height = 40 #要转化的像素值,自由设置
file_out = 'E:/data/to.jpg' # 转化后
produceImage(file_in, width, height, file_out)
from PIL import Image
# 通道转换
def change_image_channels(image, image_path):
image = image.convert("RGB")
os.remove(image_path)
image.save(image_path) # 顶替灰度图位置
return image
if __name__ == "__main__":
image = Image.open("./timg.png")
new_image = process_image_channels(image, "./time.png")
print(new_image.mode)
参考链接:
基于Python改变图片像素大小
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩