使用imwrite保存tiff 32位图像

时间:2014-02-07 19:07:41

标签: matlab image-processing

我正在尝试将我的图像保存为tif 32位,但是我收到了这个错误:

Cannot write uint32 data to a TIFF file

这是我的代码:

for k=1:10

    Id{k} = waverec2(t_C,L,'sym8');
    filename= ['C:\Path \Id_number_' num2str(k) '.tif'];
    Id{k}=uint32(Id{k});
    imwrite(Id{k},filename);

end 

我需要将图像保存为tif 32位。有什么想法吗?

使用Ashish的方法编辑(见下文)

for k=1:10

        Id{k} = waverec2(t_C,L,'sym8');
        filename= ['C:\Path \Id_number_' num2str(k) '.tif'];
        t = Tiff('filename','a')
    Id{k}=uint32(Id{k});
    t.write(Id{k});
end

但在Matlab下我收到了这个错误:

Error using tifflib
Unable to retrieve ImageLength.

    Error in Tiff/getTag (line 784)
                        tagValue = tifflib('getField',obj.FileID,Tiff.TagID.(tagId));

    Error in Tiff/writeAllStrips (line 1660)
                h = obj.getTag('ImageLength');

    Error in Tiff/write (line 1228)
                    obj.writeAllStrips(varargin{:});

2 个答案:

答案 0 :(得分:6)

可以使用MATLAB:

%
% Start with:
% http://www.mathworks.com/help/matlab/import_export/exporting-to-images.html#br_c_iz-1

data = uint32(magic(10));


%% -------------------------------------
%  Modify these variables to reuse this section: (enclosed by ----s)
%     - outputFileName  (filename in your question)
%     - data            (Id{k} in your question)
%


outputFileName = 'myfile.tif';
% This is a direct interface to libtiff
t = Tiff(outputFileName,'w');


% Setup tags
% Lots of info here:
% http://www.mathworks.com/help/matlab/ref/tiffclass.html
tagstruct.ImageLength     = size(data,1);
tagstruct.ImageWidth      = size(data,2);
tagstruct.Photometric     = Tiff.Photometric.MinIsBlack;
tagstruct.BitsPerSample   = 32;
tagstruct.SamplesPerPixel = 1;
tagstruct.RowsPerStrip    = 16;
tagstruct.PlanarConfiguration = Tiff.PlanarConfiguration.Chunky;
tagstruct.Software        = 'MATLAB';
t.setTag(tagstruct)


t.write(data);
t.close();

%% -------------------------------------

%%
d = imread('myfile.tif');
disp(class(d));
assert(isequal(d,data))

答案 1 :(得分:1)

虽然TIFF格式支持uint32,但Matlab却不支持。接受的intput类是double,single,uint8,uint16或logical。

如果您可以接受丢失精度,则可以将其转换为uint16(使用im2uint16)。如果不是,您可以使用double将其转换为im2double。请注意,im2doubledouble (your_uint16_image)不同,所以请小心。

如果这些选项都不可接受,您可能需要使用libtiff编写自己的mex代码或使用Octave(这将需要使用量子深度32构建的GraphicsMagick)。

编辑:显然还有一个新的TIFF类(请参阅下面的答案),它提供了一个直接的界面。