我的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
中数字的小数部分很重要,因为它涉及另一个图像的信息。所以Iw
无法更改。
答案 0 :(得分:1)
根据Matlab documentation:
" 如果A是数据类型为double或single的灰度或RGB彩色图像,则imwrite假定动态范围为[0,1]并自动将数据缩放255,然后再将其写入该文件为8位值。"
换句话说:imwrite执行从double到uint8的自动转换。 如果您希望保持Iw的值不变,请将其另存为mat文件而不是图像。
如果您确实想将其保存为图像,则会丢失一些信息。在这种情况下,有两件事需要做:
将矩阵的动态范围更改为[0,1]。 (在您的情况下,范围介于-0.0035到255.0035之间。此外,矩阵包含inf值)。
如果您想获得相等,请将IwNew缩放255,然后将其转换为uint8。
代码:
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),则以明显的方式进行调整。