Warm tip: This article is reproduced from stackoverflow.com, please click
matlab tiff

Matlab Read Tif File shows Error "Cannot handle different values per sample for "BitsPerSample"."

发布于 2020-05-30 14:42:15

I have a tif file that I can view it from Windows Photos App. You can download it from this link. I tried to load it to Matlab using imread function, however it shows an error below.

TIFF library error - 'TIFFReadDirectory: Cannot handle different values per sample for "BitsPerSample".'

I then further looking into the file's profile and find that the BitDepth and BitsPerSample value seems not correct. Also, the MaxSample value looks weird. enter image description here

By checking the Matlab buildin tiff file profile, I learned that for a RGB image, BitDepth should be 24 and BitsPerSample should be [8,8,8]. However, when I tried to explicitly change them, I still get the same error.

fname = 'TifImg.tif';
info = imfinfo(fname);
% Explicitly Assign Correct Value to BitDepth and BitsPerSample (still doesn't work)
for i = 1: length(info)
    info(i).BitDepth = 24;
    info(i).BitsPerSample = [8 8 8];
end

% Read Tif Image 
frame = imread(fname, 1, 'Info', info);
imshow(frame,[])

I hope someone can help me to load this image to Matlab and point me which profile I should change to successfully load the file.

Questioner
SimaGuanxing
Viewed
9
Yuval Harpaz 2020-03-17 14:11

As mentioned in the comments above, the file seemed to be corrupt. I was also unable to open it with gimp or other programs. So here is a hack. You get the size from the header with imfinfo (height by width by 3 colors), then you read the file from the end. A bit of reordering and the image is salvaged. I don't know about the large BitsPerSample you have in the header, if you use [8,8,8] you have the exact length you need. If you use larger color depth etc you don't have enough numbers in the file to fill the 520x696 pix image.

info = imfinfo('TifImg.tif');
fid = fopen('TifImg.tif','r');
s = fread(fid,'uint8=>uint8');
fclose(fid);
len = info.Height*info.Width*3;
data = s(length(s)-len+1:end);
img = reshape(data,3,info.Width,info.Height);
img = permute(img,[3,2,1]);
figure;
imshow(img)

fixed image