在Python中处理MATLAB的*.mat格式数据及常见错误汇总

  • 前言
  • 一、数据读取错误
  • 二、数据类型错误(用Python处理图像时,若涉及加减运算,溢出差值被重新赋值255-0)



前言

由于matlab和python两种语言的编程方式不同,有时候在进行程序混编时,需要利用python调用matlab下的格式数据,下面介绍如何调用mat格式数据及常见错误解决方法,仅供参考!

一、数据读取错误

# 最初用loadmat读取数据
import numpy as np
from scipy.io mport loadmat
img = loadmat('im.mat')['im']   #im.mat为mat数据的名称,['im'] 中的im表示该文件下im的数据

使用如上代码读取数据时,会出现如下错误:

python 读取mat文件 python读取mat文件为空_matlab


如果出现以上错误,改用下面方式读取,

import h5py
img = h5py.File('im.mat')['im']
img = h5py.File('im.mat','r')['im']    # 无警告

二、数据类型错误(用Python处理图像时,若涉及加减运算,溢出差值被重新赋值255-0)

# python代码

import h5py
import numpy as np

img = h5py.File('im.mat')['im']
# python中的M,N刚刚好与matlab中的M,N取值相反,此处进行转置与matlab相同矩阵格式进行处理
x = np.array(img).T  

[M, N] = x.shape

if M < 16 and N < 16:
    score = -2
# Feature Extraction:
# 1. horizontal features
d_h = x[:, 1:N] - x[:, 0:N - 1]   # 该步操作图像产生满溢,溢出后差值可能都被赋为255,依次递减

此种情况下,d_h数据会出现满溢情况,下面就是相同数据在python和matlab下面进行运算的差异性。

python 读取mat文件 python读取mat文件为空_编程语言_02

% Matlab 代码

img = laod('im.mat')
[M, N] = size(x)

if M < 16 | N < 16
    score = -2;
end   

x = double(img);  % 将无符号类型uint8数据类型转换为double类型

% Feature Extraction:
% 1. horizontal features
d_h = x(:, 2:N) - x(:, 1:(N-1));

python 读取mat文件 python读取mat文件为空_matlab_03


原因: 导入数据类型为 uint8 数据格式,该种格式下是没有负数的,在matlab中进行运算时,先将uint8数据类型转化为了double类型,然后进行了减法运算,所以会出现如上结果,但是在python中,由于没有double类型,所以需要自己手动设置数据格式类型,只需要改成不是uint8格式即可(具体格式需要根据需求,此处改成了int8格式类型)。解决方法非常简单,只需在上面的一行代码中加入数据类型即可:

x = np.array(img,dtype = 'int8').T   # 对读取的uint8格式数据进行重新定义一下格式即可
x = np.array(img,dtype = 'float').T   # 下面这种格式虽然是浮点型,但是计算过程不容易出错,如果是上面的int8会出现部分错误,需要注意

现在看一下结果,就跟matlab处理结果一样了。

python 读取mat文件 python读取mat文件为空_python 读取mat文件_04


虽然下面是浮点型,但是能够保证数据转化的精度和准确性,img的影像数据转化成数值时不出错误,非必要情况下,不要使用int8数据格式,因为使用int8格式数据类型,会在某些部分出错,这一定要注意。(改组数据中(0,80)数值在int8格式转化时出错,原始数值为129,转化之后变成127,而使用float格式则不会出现错误)

python 读取mat文件 python读取mat文件为空_编程语言_05


原始数据unit8数据格式类型的数值为129,在python中不同格式类型的值就不一样。

python 读取mat文件 python读取mat文件为空_python_06

所以uint8格式,在python运算中还是转换成float格式靠谱,转换成int8真的不行呀!