首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将.mat文件传输到图像文件而不作任何更改?

如何将.mat文件传输到图像文件而不作任何更改?
EN

Stack Overflow用户
提问于 2016-05-03 03:47:33
回答 2查看 1.8K关注 0票数 1

我的image.mat大约是4MB。某些图像文件的大小也可以是4MB。image.mat可以传输到图像文件中吗?

我试过了,但这不管用:

代码语言:javascript
复制
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编写的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-03 11:09:47

我的MATLAB (R2010a)与图像处理工具箱完全能够存储双值像素值,并在不丢失数据的情况下检索它们。

这里有一个无耻的这个答案拷贝

代码语言:javascript
复制
% 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)

结果:

代码语言:javascript
复制
ans =
     1

如果你有超过一个频道(RGB)的话,用明显的方式进行调整。

票数 0
EN

Stack Overflow用户

发布于 2016-05-03 05:11:43

根据Matlab的文档

如果A是数据类型为双或单的灰度或RGB彩色图像,则imwrite假设动态范围为0,1,并在将数据写入文件为8位值之前自动缩放255。

换句话说: imwrite执行从double到uint8的自动转换。如果您希望保持Iw值不变,请将其保存为mat文件而不是图像

如果你真的想把它保存成一个图像,就会有一些信息丢失。在这种情况下,有两件事需要做:

  1. 将矩阵的动态范围更改为0,1 (在您的情况下,范围在-0.0035到255.0035之间)。此外,矩阵包含inf值)。
  2. 如果要获得等式,请将IwNew按255进行缩放,并将其转换为uint8。

代码:

代码语言:javascript
复制
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) 

结果:

代码语言:javascript
复制
ans =

 1

或者,如果要将IwNew转换为双倍,请执行以下操作:

代码语言:javascript
复制
%conversion to double
Iw2 = double(IwNew)/255;

请注意,在这种情况下,矩阵将不等于另一个矩阵,因为信息丢失发生在IM写过程中(从double转换到uint8)。相反,它们将是epsilon --彼此接近,其中epsilon= 0.0001。

为了测试这一点,请编写以下内容:

代码语言:javascript
复制
%equality check
sum(abs(Iw2(:)-Iw(:))>0.0001)   

结果:

代码语言:javascript
复制
ans =

 0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36995261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档