Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 如何在不做任何更改的情况下将.mat文件传输到图像文件?_Image_Matlab - Fatal编程技术网

Image 如何在不做任何更改的情况下将.mat文件传输到图像文件?

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

我有一个大约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
中数字的小数点很重要,因为它涉及到另一幅图像的信息。因此
Iw
不能更改

实际上,Mathematica可以存储浮点数据: 但是我的程序都在MATLAB中。

根据MATLAB:

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

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

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

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

  • 如果要获得相等值,请将IwNew缩放255,然后将其转换为uint8

  • 代码:

    结果:

    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对此没有问题