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

时间:2016-05-03 03:47:34

标签: image matlab

我的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无法更改

process flowchart

实际上我真正的问题是如何将浮点数存储到图像中?

但是MATLAB不支持Tiff 6.0,所以我必须找到一些解决方法。 我正在进行盲水印,Iw中数字的小数部分很重要,因为它涉及另一个图像的信息。所以Iw无法更改。

实际上, Mathematica 可以存储浮动浮点数据: enter image description here 但我的程序都在 MATLAB

2 个答案:

答案 0 :(得分:1)

根据Matlab documentation

" 如果A是数据类型为double或single的灰度或RGB彩色图像,则imwrite假定动态范围为[0,1]并自动将数据缩放255,然后再将其写入该文件为8位值。"

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

如果您确实想将其保存为图像,则会丢失一些信息。在这种情况下,有两件事需要做:

  1. 将矩阵的动态范围更改为[0,1]。 (在您的情况下,范围介于-0.0035到255.0035之间。此外,矩阵包含inf值)。

  2. 如果您想获得相等,请将IwNew缩放255,然后将其转换为uint8。

  3. 代码:

    main:
        la      $t5,myhalf
        lh      $t1,0($t5)
        nop
    
        .data
    myhalf:     .half       0x8000          # this works
    
    # these do _not_
    myword:     .word       0x80000000
    myword2:    .word       0x8000
    

    结果:

    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) 
    

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

    ans =
    
     1
    

    请注意,在这种情况下,矩阵不会彼此相等, 由于在imwrite过程中发生的信息丢失(从double转换为uint8)。 相反,它们将彼此接近epsilon = 0.0001。

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

    %conversion to double
    Iw2 = double(IwNew)/255;
    

    结果:

    %equality check
    sum(abs(Iw2(:)-Iw(:))>0.0001)   
    

答案 1 :(得分:0)

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

这是this answer的无耻副本:

% 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),则以明显的方式进行调整。