将矩阵另存为图像

时间:2016-03-04 17:35:59

标签: image matlab

我有一个数据类型为double的矩阵finalMat,其值在0到255之间。它实际上对应于某个图像。我正在显示如下:

imshow(finalMat, []);

但是当我尝试使用下面的代码保存它时,保存的图像是完全白色的。

imwrite(finalMat,'myImage.jpeg','JPEG');

我想将图像保存在磁盘上而不更改finalMat矩阵中的值。当我读取保存的图像,即myImage.jpeg时,我必须得到与finalMat中相同的值。有人可以帮忙保存图像吗?

1 个答案:

答案 0 :(得分:3)

imwrite首先在写入文件之前检查数据类型,以确定如何处理输入中的值。如果输入是double,则假定范围是0到1.如果输入是uint8,则它假定为[0,255]。

您的两个选项是将数据转换为uint8或将其标准化为0到1,并将其保留为double

投放为uint8

对于您的特定示例,您已经有0到255之间的数据,并且可能不希望缩放数据,因此您可能希望使用{{1}铸造路线。

uint8

请记住,由于您有一个imwrite(uint8(finalMat), 'file.jpg'); 图像矩阵,这将强制所有数字为整数值,因此当您将其加载回MATLAB时,它可能不会完全相等

规范化图像数据

更一般地说,您通常希望使用mat2gray来使用标准化方法来为您进行标准化,从而允许您使用完整的8位范围。

double
  

注意:您提到您希望生成的图像完全等于您传入其中的矩阵。不幸的是,您的输入数据是imwrite(mat2gray(finalMat), 'file.jpg') ,每像素需要64位。 MATLAB支持的成像格式的实际上可以存储所有 64位,因此无论您如何执行此操作,您都会遇到一些差异。如果要最小化此效果,请查找支持16位或32位数据的图像格式(您当前正在创建的JPEG是8位)。此外,我建议使用JPEG 反对,因为这可能是一种有损压缩类型。如果您想要无损压缩,请使用TIFF或PNG。