Matlab Read Tif File показывает ошибку «Не удается обработать разные значения для образца для« BitsPerSample »». - PullRequest
1 голос
/ 12 марта 2020

У меня есть TIF-файл, который я могу просмотреть из приложения Windows Photos. Вы можете скачать его по этой ссылке . Я попытался загрузить его в Matlab, используя функцию imread, однако она показывает ошибку ниже.

Ошибка библиотеки TIFF - 'TIFFReadDirectory: Невозможно обработать разные значения для образца для "BitsPerSample".'

* 1007 Затем я заглядываю в профиль файла и обнаруживаю, что значения BitDepth и BitsPerSample кажутся неверными. Кроме того, значение MaxSample выглядит странно. enter image description here

Проверив профиль встроенного файла tiff Matlab, я узнал, что для изображения RGB значение BitDepth должно быть 24, а BitsPerSample должно быть [8,8,8]. Однако, когда я пытался явно изменить их, я все еще получаю ту же ошибку.

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,[])

Я надеюсь, что кто-то может помочь мне загрузить это изображение в Matlab и указать мне, какой профиль мне следует изменить, чтобы успешно загрузить файл.

1 Ответ

2 голосов
/ 16 марта 2020

Как упоминалось в комментариях выше, файл казался поврежденным. Я также не смог открыть его с помощью gimp или других программ. Так что вот взломать. Вы получаете размер из заголовка с помощью imfinfo (высота по ширине на 3 цвета), затем читаете файл с конца. Немного переупорядочения и изображение спасено. Я не знаю, какой большой BitsPerSample у вас есть в заголовке, если вы используете [8,8,8], у вас будет точная длина, которая вам нужна. Если вы используете большую глубину цвета et c, в файле недостаточно цифр для заполнения изображения размером 520x696 пикселей.

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

...