图像数据集制作

图像数据集的制作分为以下2个步骤:1.将图像信息数据化 2.给每一幅图像贴上对应的标签 .使用PIL中的Image模块将图片的信息数据化,整个处理过程都已经封装好了的,需要修改的地方就是文件夹的路径和文件夹的名字classes,直接上代码:

import numpy as np
import os,glob
from PIL import Image #用于处理图片的模块
import pandas as pd
import scipy.io as sio #用于读取.mat数据的模块
class Dataset:
    def __init__(self):
        self.classes = ['jp2k', 'jpeg', 'wn','gblur','fastfading'] # 文件夹的顺序要预先排列好,因为下面的遍历顺序是按照classes列表中的顺序进行遍历的
        self.cwd = os.getcwd() #得到的主目录,比如我的主目录是‘/home/nw’,那么self.cwd就等于'/home/nw'
        self.arr = [[]]
    self.a = []
    def img2array(self):
        for index,name in enumerate(self.classes):
            class_path = self.cwd + '/data/' + name + '/'#这是我的图片文件夹的存放路径
            for infile in glob.glob(class_path + '*.bmp'): # 遍历所有文件夹下的bmp格式的图片
                file,ext = os.path.splitext(infile) #将文件名字和格式进行拆分
                img = Image.open(infile) #使用Image模块打开文件
                img = img.resize([3232]) #将图片大小都设置成 32 * 32 大小的
                r,g,b = img.split() #将彩色图片拆分为三色通道,r,g,b分别为red,green,black
                r_array = np.array(r).reshape([1024]) #利用numpy将三色通道中的图片信息数据化。
                g_array = np.array(g).reshape([1024]) # 将32 * 32的三色通道的图像都reshape成一行
                b_array = np.array(b).reshape([1024])
                merge_array = np.concatenate((r_array,g_array,b_array)) #将三色通道的图片信息拼接,这就是一张图片的所有信息,shape = [1,1024 * 3]
        if self.arr == [[]]:
                    self.arr = [merge_array] #第一张图片放到列表中,后面经过numpy 中的concatenate会变成ndarray格式的
                        continue
                self.arr = np.concatenate((self.arr,[merge_array]),axis = 0) #将所有文件夹下的所有的bmp格式的图片信息拼接成一个数组
        return self.arr
    def getdataset(self):
        img_info = self.img2array() # 通过调用 img2array方法来得到图片信息
        f = open('/home/nw/data/dmos.mat','rb') #将相应文件夹下的标签信息读取出来
        #因为文件夹下的标签矩阵是mat格式的,使用scipy下的io模块中的loadmat可以直接将标签矩阵读写出来
        #注意上面classes中的文件夹的顺序要准确,要和标签的顺序一一对应。文件夹和标签的对应顺序要预先明确
        labelset = sio.loadmat(f)
        labelset = labelset['dmos'] #load出来的是字典的形式。使用索引将标签信息取出来
        labelset = np.reshape(labelset,[982,1]) #将标签处理成shape = [样本数,1]
        dataset = np.concatenate((img_info,labelset),axis = 1) #将图片信息和标签信息拼接起来
        return dataset
from sys import path
path.append('/home/nw/data') #将编译路径添加进去
from data28 import Dataset #data28是文件data28.py,从data28导入Dataset类
haha = Dataset() #实例化
dataset = haha.getdataset() #通过调用实例化之后的getdataset方法获得dataset数据集

下面使用pickle将数据写入和读出文件

f = open('/home/nw/data/dataset.txt','rb') #线打开一个文件,如果这个文件不存在,就新建这个文件,二进制可写
pickle.dump(dataset,f) #使用pickle的dump将获得的dataset数据倒入到f文件中
f.close()

使用pickles对数据做各种处理:

f = open('/home/nw/data/dataset.txt','rb') #二进制可读
dataset = pickle.load(f) #使用pickle.load()读取文件中的数据
f.close()

我的数据格式是982 * 3073,982代表的是982张图片,3073中前面的3072列代表的是图片信息,最后一列代表的标签信息。
剔除标签为0的图片:

for i in range(dataset.shape[0]):
    if dataset[i][3072] == 0:
        dataset = np.delete(dataset,i,axis = 0) #np.delete()中dataset是需要做处理的

数据集,i是需要删掉的索引,axis = 0代表按照行的方式删除,之后得到的就是去掉标签为0的全部图片数据,使用np.random.shuffle(dataset)打乱图片顺序,方便后续进行训练。np.random.shuffle(dataset)不返回任何值,所以dataset=np.random.shuffle(dataset)得到的是None

猜你喜欢

转载自blog.csdn.net/baidu_36161077/article/details/73864519