我有一个数据类型为double的矩阵finalMat
,其值在0到255之间。它实际上对应于某个图像。我正在显示如下:
imshow(finalMat, []);
但是当我尝试使用下面的代码保存它时,保存的图像是完全白色的。
imwrite(finalMat,'myImage.jpeg','JPEG');
我想将图像保存在磁盘上而不更改finalMat矩阵中的值。当我读取保存的图像,即myImage.jpeg时,我必须得到与finalMat中相同的值。有人可以帮忙保存图像吗?
答案 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。