我的image.mat大约是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不能改变。

实际上,我真正的问题是如何将浮点数存储到图像中?
但是MATLAB不支持Tiff 6.0,所以我必须找到一些解决办法。我正在做一个盲水印,而Iw中一个数字的小数是很重要的,因为它涉及到关于另一个image.So的信息-- Iw不能改变。
实际上,Mathematica可以存储浮点数据:

但我的程序都是用MATLAB编写的。
发布于 2016-05-03 11:09:47
我的MATLAB (R2010a)与图像处理工具箱完全能够存储双值像素值,并在不丢失数据的情况下检索它们。
这里有一个无耻的这个答案拷贝
% Some random, data of type double
A = 7.6*rand(10);
% Construct TIFF image...
t = Tiff('test.tif', 'w');
% ...with these custom parameters...
tagstruct = struct(...
'ImageLength' , size(A,1),...
'ImageWidth' , size(A,2),...
'Compression' , Tiff.Compression.None,...
'SampleFormat' , Tiff.SampleFormat.IEEEFP,... % floating point
'Photometric' , Tiff.Photometric.MinIsBlack,...
'BitsPerSample' , 64,... % 8 bytes / double
'SamplesPerPixel' , 1,...
'PlanarConfiguration', Tiff.PlanarConfiguration.Chunky);
t.setTag(tagstruct);
% ...and write it to disk.
t.write(A);
t.close();
% Read the data actually written, and check if all
% information was indeed preserved:
B = imread('test.tif');
isequal(A,B)结果:
ans =
1如果你有超过一个频道(RGB)的话,用明显的方式进行调整。
发布于 2016-05-03 05:11:43
根据Matlab的文档:
如果A是数据类型为双或单的灰度或RGB彩色图像,则imwrite假设动态范围为0,1,并在将数据写入文件为8位值之前自动缩放255。
换句话说: imwrite执行从double到uint8的自动转换。如果您希望保持Iw值不变,请将其保存为mat文件而不是图像。
如果你真的想把它保存成一个图像,就会有一些信息丢失。在这种情况下,有两件事需要做:
代码:
load image.mat %load Iw
%step 1, change the dynamic range of the image to [0,1].
%One way to do it is by using mat2gray on each channel separately.
Iw(:,:,1) = mat2gray(Iw(:,:,1));
Iw(:,:,2) = mat2gray(Iw(:,:,2));
Iw(:,:,3) = mat2gray(Iw(:,:,3));
%write the image to file
imwrite(Iw,'image.png');
%read the image
IwNew=imread('image.png');
%scale it, and convert to uint 8
Iw2 = uint8(Iw*255);
%check equality
isequal(Iw2,IwNew) 结果:
ans =
1或者,如果要将IwNew转换为双倍,请执行以下操作:
%conversion to double
Iw2 = double(IwNew)/255;请注意,在这种情况下,矩阵将不等于另一个矩阵,因为信息丢失发生在IM写过程中(从double转换到uint8)。相反,它们将是epsilon --彼此接近,其中epsilon= 0.0001。
为了测试这一点,请编写以下内容:
%equality check
sum(abs(Iw2(:)-Iw(:))>0.0001) 结果:
ans =
0https://stackoverflow.com/questions/36995261
复制相似问题