将矩阵保存为图像

4
我有一个数据类型为double的矩阵finalMat,其值范围在0到255之间。它实际上对应于一些图像。我将其显示如下:
imshow(finalMat, []);

但是,当我尝试使用以下代码保存它时,保存的图片完全是白色的。
imwrite(finalMat,'myImage.jpeg','JPEG');

我希望能够将图像保存到磁盘中,而不改变finalMat矩阵中的数值。当我读取已保存的图像,即myImage.jpeg时,必须获得与finalMat中相同的数值。请问有谁能帮忙保存这个图像吗?

1个回答

3

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

您有两个选项:将数据转换为uint8或将其归一化为0到1并保持为double

转换为uint8

对于您的特定示例,您已经拥有介于0和255之间的数据,并且可能不希望对该数据进行缩放,因此您可能需要选择uint8转换路线。

imwrite(uint8(finalMat), 'file.jpg');

请记住,由于您有一个double图像矩阵,这将强制所有数字成为整数值,因此当您将其加载回MATLAB时可能不会完全相等。
归一化图像数据
更一般地说,通常希望使用标准化方法,使用mat2gray为您执行标准化,从而使您能够利用完整的8位范围。
imwrite(mat2gray(finalMat), 'file.jpg')

注意: 你提到希望生成的图像与输入矩阵完全一致。不幸的是,你的输入数据是一个每个像素需要64位的double类型。由于Matlab支持的图像格式无法存储所有64位,所以无论如何操作都会导致某些差异。如果你希望最小化这种影响,请寻找支持16或32位数据的图像格式(你当前创建的JPEG是8位)。此外,我建议不要使用JPEG,因为这是一种有损压缩。如果你想要无损压缩,选择TIFF或PNG。


我绝对不会使用 uin8,因为它只是一个类型转换。可能更好的选择是 mat2gray - Ander Biguri
@AnderBiguri,即使输入的是double类型,imwrite在写入时也会将其转换为uint8类型。文档中指出,它会被转换为8位图像:“如果A是灰度或RGB颜色图像,数据类型为double或single,则imwrite假定动态范围为[0,1],并在写入文件之前自动将数据缩放255作为8位值。如果A中的数据为single,请在写入GIF或TIFF文件之前将A转换为double。” - Suever
是的,但当你对图像执行 uint8() 操作时,它只是转换数值类型。mat2gray 的作用也相同,但会确保进行缩放。不受控制地使用 uint8 将会导致未知结果,因为它会进行强制类型转换。 - Ander Biguri
@AnderBiguri 好的,我当然可以。我只是假设数据已经被缩放了,因为原始问题说明值为[0,255]。 - Suever
@AnderBiguri 完全同意,答案已更新。 - Suever
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接