mat文件是Matlab的数据存储的标准格式。mat文件是标准的二进制文件,还可以ASCII码形式保存和加载,在MATLAB中打开显示类似于单行EXCEL表格。 —— [ 百度百科 ]
mat文件最基本的操作主要有两个:
第一、用load命令,具体为load+文件名.mat,就可以将mat中的数据放到工作空间里,然后操作
第二、用save命令,具体为save+文件名(自己取一个).mat,就可以将当前工作区间里的数据保存下来供调用了
由于深度学习中训练模型需要的输入是图片,而需要的特征保存在mat文件中,考虑到数据库包含大量的数据,所以需要编写程序来完成mat文件批量转成图片。
采用python语言来编写脚本。
代码如下:
import cv2
import scipy.io as scio
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
dataFile = r'/folder/reggae.00041.mat' # 单个的mat文件
data = scio.loadmat(dataFile)
print(type(data))
# print (data['data'])
# 由于导入的mat文件是structure类型的,所以需要取出需要的数据矩阵
a=data['data']
# 取出需要的数据矩阵
# 数据矩阵转图片的函数
def MatrixToImage(data):
data = data*255
new_im = Image.fromarray(data.astype(np.uint8))
return new_im
new_im = MatrixToImage(a)
plt.imshow(a, cmap=plt.cm.gray, interpolation='nearest')
new_im.show()
new_im.save('reggae.00041.bmp') # 保存图片
单个的mat文件转图片是很好实现的,但是处理的要点就在于对mat文件的批量处理,当一个文件夹下有几百个或者更多的mat文件,就必须进行遍历操作来完成批量转换。
如图,metal文件夹下包含了很多个.mat文件,其中的名称是可以拆分的,可以利用中间的数字段进行遍历操作。
在matlab中打开其中一个mat文件,发现一个mat文件中包含了三部分,所需要的是其中的data的数字矩阵部分。
考虑以上两点,具体的代码如下:
import cv2
import scipy.io as scio
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import os
# 数据矩阵转图片的函数
def MatrixToImage(data):
data = data*255
new_im = Image.fromarray(data.astype(np.uint8))
return new_im
# 添加路径,metal文件夹下存放mental类的特征的多个.mat文件
folder = r'/Users/Desktop/metal'
path = os.listdir(folder)
#print(os.listdir(r'/Users/hjy/Desktop/blues'))
for each_mat in path:
if each_mat == '.DS_Store':
pass
else:
first_name, second_name = os.path.splitext(each_mat)
# 拆分.mat文件的前后缀名字,注意是**路径**
each_mat = os.path.join(folder, each_mat)
# print(each_mat)
array_struct = scio.loadmat(each_mat)
array_data = array_struct['data']# 取出需要的数字矩阵部分
new_im = MatrixToImage(array_data)# 调用函数
plt.imshow(array_data, cmap=plt.cm.gray, interpolation='nearest')
new_im.show()
print first_name
new_im.save(first_name+'.bmp')# 保存图片