python+mat文件读取

1.mat文件中数据(数据最大4000)转化成uint8,再进行图像显示,用imshow函数显示并保存
2.用imshow(x,camp=gray,vmin=0,vmax=4000)所显示图像并保存
问题:两个方法获得的图像有什么差别,我认为都是uint8数据形式,灰度值应该相同,但是用plt.imread函数读取图像,读出来的数值不同,这是为什么?

该回答引用GPTᴼᴾᴱᴺᴬᴵ
对于问题1,你可以使用scipy.io.loadmat()函数来读取.mat文件,然后将读取到的数据转化为uint8类型,再进行图像显示和保存。

示例代码如下:

import scipy.io as sio
import numpy as np
import cv2

# 读取.mat文件
data = sio.loadmat('filename.mat')
img_data = data['img_data']  # 获取图像数据

# 转化为uint8类型
img_data = np.uint8(img_data)

# 显示图像
cv2.imshow('image', img_data)

# 保存图像
cv2.imwrite('filename.png', img_data)


对于问题2,你可以使用matplotlib.pyplot.imshow()函数来显示图像,其中cmap参数设置为gray,vmin参数设置为0,vmax参数设置为4000,同时保存图像。

示例代码如下:

import matplotlib.pyplot as plt
import scipy.io as sio

# 读取.mat文件
data = sio.loadmat('filename.mat')
img_data = data['img_data']  # 获取图像数据

# 显示图像
plt.imshow(img_data, cmap='gray', vmin=0, vmax=4000)

# 保存图像
plt.savefig('filename.png')


关于读取图像数值不同的问题,可能是因为plt.imread()函数默认将图像归一化到[0,1]之间,而imshow()函数没有对图像进行归一化处理。可以尝试使用plt.imshow()函数代替plt.imread()函数来读取图像数据,或者在使用plt.imread()函数时,将图像转化为uint8类型,例如:

import matplotlib.pyplot as plt
import scipy.io as sio
import numpy as np

# 读取图像
img_data = plt.imread('filename.png')

# 转化为uint8类型
img_data = np.uint8(img_data * 255)

# 显示图像
plt.imshow(img_data, cmap='gray', vmin=0, vmax=4000)

# 保存图像
plt.savefig('filename.png')


这样可以保证读取的图像数据与使用imshow()函数显示的图像数据相同。

虽然两个方法获得的图像都是以uint8的格式保存的灰度图像,但是它们的数据范围不同。在第一个方法中,将原始数据通过np.uint8()转换为uint8格式时,数据的范围被限制在0-255之间,因此显示的图像的灰度值范围也被限制在0-255之间。而在第二个方法中,使用vmin和vmax参数限制了数据的范围,但是数据本身并没有被强制转换为uint8格式,因此显示的图像的灰度值范围可以超过0-255的范围。

当使用plt.imread()函数读取保存的图像时,函数默认会将图像的数据类型转换为float32格式,因此读出来的数值范围可以超过0-255。如果需要读取uint8格式的图像,可以使用cv2.imread()函数。