matlab - Matlab 读取 Tif 文件显示错误“无法为“BitsPerSample”处理每个样本的不同值。”
问题描述
我有一个 tif 文件,我可以从 Windows Photos App 中查看它。您可以从此链接下载它。我尝试使用imread
函数将其加载到 Matlab,但是它在下面显示错误。
TIFF 库错误 - 'TIFFReadDirectory: 无法为“BitsPerSample”处理每个样本的不同值。'
然后我进一步查看文件的配置文件,发现 BitDepth 和 BitsPerSample 值似乎不正确。此外,MaxSample 值看起来很奇怪。
通过检查 Matlab buildin tiff 文件配置文件,我了解到对于 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 并指出我应该更改哪个配置文件以成功加载文件。
解决方案
如上面的评论所述,该文件似乎已损坏。我也无法用 gimp 或其他程序打开它。所以这是一个黑客。您从带有 imfinfo 的标题中获取大小(高度 x 宽度 x 3 种颜色),然后从末尾读取文件。稍微重新排序,图像就被抢救了。我不知道标题中的大 BitsPerSample,如果你使用 [8,8,8] 你有你需要的确切长度。如果您使用较大的颜色深度等,则文件中没有足够的数字来填充 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)
推荐阅读
- ios - 如何使用 Azure 移动应用服务实现唯一字母验证?
- vue.js - 在 v-expansion-panel 标题中单击 v-btn 时阻止打开
- java - 如果元素没有出现在selenium webdriver java中,如何重新加载页面
- powerbi - 商业智能 | 从 YYYY Q 格式的日期类型列创建计算列。例如,2018 年第三季度
- python-3.x - pywintypes.com_error: (-2147024882, '没有足够的内存资源来完成此操作。', None, None)
- python - 如何使用域过滤器获取特定供应商的采购订单
- java - 使用 Java 进行 Kinesis firehose 数据转换
- twig - IF URL 语句 opencart 3 树枝文件
- python-3.x - 如何捕捉触发 sklearn.GridSearchCV.fit() 警告的原因?
- python - python数组:平均数据集的斜率和截距