Image 如何在不做任何更改的情况下将.mat文件传输到图像文件?
我有一个大约4MB的内存。 某些图像文件的大小也可以是4MB。 能否将Image 如何在不做任何更改的情况下将.mat文件传输到图像文件?,image,matlab,Image,Matlab,我有一个大约4MB的内存。 某些图像文件的大小也可以是4MB。 能否将image.mat传输到图像文件 我试过这个,但没用: load image.mat %load Iw imshow(mat2gray(Iw)) imwrite(Iw,'image.png'); IwNew = imread('image.png'); isequal(Iw,IwNew) 结果为0;我是不是误解了什么 Iw中的数字非常重要,因此不能更改Iw 实际上,我真正的问题是如何将浮点数存储到图像中 但是MA
image.mat
传输到图像文件
我试过这个,但没用:
load image.mat %load Iw
imshow(mat2gray(Iw))
imwrite(Iw,'image.png');
IwNew = imread('image.png');
isequal(Iw,IwNew)
结果为0;我是不是误解了什么
Iw
中的数字非常重要,因此不能更改Iw
实际上,我真正的问题是如何将浮点数存储到图像中
但是MATLAB不支持Tiff 6.0,所以我必须找到一些解决方法。
我正在做一个盲水印,而Iw
中数字的小数点很重要,因为它涉及到另一幅图像的信息。因此Iw
不能更改
实际上,Mathematica可以存储浮点数据:
但是我的程序都在MATLAB中。根据MATLAB:
如果A是数据类型为双精度或单精度的灰度或RGB彩色图像,则imwrite假定动态范围为[0,1],并在将数据作为8位值写入文件之前自动将其缩放255
换句话说:imwrite执行从double到uint8的自动转换。
如果希望保持Iw的值不变,请将其另存为mat文件,而不是图像
如果您确实想将其保存为图像,则会丢失一些信息。在这种情况下,需要做两件事:
ans =
1
ans =
0
ans =
1
或者,如果要将IwNew转换为double,请执行以下操作:
%conversion to double
Iw2 = double(IwNew)/255;
%equality check
sum(abs(Iw2(:)-Iw(:))>0.0001)
注意,在这种情况下,矩阵之间不相等,
由于imwrite过程中发生的信息丢失(从double转换为uint8)。
相反,它们将是彼此接近的ε,其中ε=0.0001
为了测试这一点,请编写以下内容:
%conversion to double
Iw2 = double(IwNew)/255;
%equality check
sum(abs(Iw2(:)-Iw(:))>0.0001)
结果:
ans =
1
ans =
0
ans =
1
我的MATLAB(R2010a)和图像处理工具箱完全能够存储双值像素值,并在不丢失数据的情况下检索它们
这是一份无耻的副本:
结果:
ans =
1
ans =
0
ans =
1
如果您有多个通道(RGB),请以明显的方式进行调整。我不想更改Iw,我希望IwNew的类是double而不是uint8,但Iw(:,:,1)=mat2gray(Iw(:,:,1))实际更改了Iw。请仔细阅读我的答案。要将Iw保存为图像而不丢失信息是不可能的。首先,由于Iw不是有效图像(它包含大于255且小于0的值),其次,由于imwrite函数将双图像保存为uint8。这是不可能的。。。我通常做的是以eps格式保存,然后将eps转换为png。它使图像保持几乎相同。相关:你使用的是什么版本的MATLAB?因为TIFF和HDF似乎很适合你的案子。但是如上所述,您将丢失一些信息(像素值
-realmax
是什么意思?…什么数据类型是Iw
,它的范围是什么?你可能会想出一个能够保存所有信息的地图…@RodyOldenhuis我在用Matlab。Iw的类是双精度的。它的范围从0到255左右。好的,但是什么版本的MATLAB?MATLAB R2006和MATLAB R2016aGood之间有着天壤之别,但是test.tif
无法在我的计算机中显示:(@partida这很奇怪;Irfanview对此没有问题