在matlab中保存int16堆栈tif

时间:2015-03-25 14:57:59

标签: matlab tiff imread

我试图在matlab中保存.tif。 Imwrite不支持直接为.tif写int16,但可以将我的图片转换为uint16并使用imwrite。

imageName='someimage.tif';
info=imfinfo(imageName);
num_images=numel(info);
x_size=info(1).Width;
y_size=info(1).Height;

result=zeros(y_size, x_size, num_images, 'uint16');
for i=1:num_images
    result(:,:,i) = im2uint16(imread(imageName,i,'Info',info));
end

imwrite(result(:,:,i), 'newimage.tif');
for i=2:num_images,
    imwrite(result(:,:,i), 'newimage.tif', 'WriteMode', 'append');
end

当我这样做时,似乎对比度会以某种方式增加,而我希望这些图片是相同的。

其次,我尝试使用this作为以下内容

imageName='someimage.tif';
info=imfinfo(imageName);
num_images=numel(info);
x_size=info(1).Width;
y_size=info(1).Height;

result=zeros(y_size, x_size, num_images, 'int16');
for i=1:num_images
    result(:,:,i) = imread(imageName,i,'Info',info);
end
options.message=true;
saveastiff(result, 'newimage.tif', options);

我在这里遇到同样的问题,对比度上升,它会破坏画面。我正在处理灰度图片。 有没有办法保存这些图片而不会破坏它?

1 个答案:

答案 0 :(得分:0)

@siliconwafer帮助我理解我的问题是,如果使用与第一张图片相同的动态范围,前几帧相当明亮,其余图片显示为黑色。

我无法以雄辩的方式解决这个问题,但我做了以下

t = Tiff("Some_image.tif", 'r+');
imgs = zeros(y_size, x_size, num_images, 'uint16');
for k=1:num_images,
    t.setDirectory(k);
    imgs(:,:,k) = t.read();
end

result = doStuff(imgs)

for k=1:num_images,
    t.setDirectory(k);
    t.write(imgs(:,:,k));
end

这样做的缺点是它改变了原貌。优点是每帧的动态范围不会改变。