Image 隐藏的TIFF品牌?
我在做计算机断层扫描投影图像的图像处理。原始图像是CT机器输出的.tiff图像。我将它导入Matlab,在那里我处理它并使用imwrite()保存输出图像 我用来重建CT图像的软件是专有的,但只要它们符合一定的标准,就支持从任何.tiff图像重建。显然,Matlab并没有遵循这个标准,因为它似乎以某种方式标记了它保存的所有.tiff图像。我可以通过使用第三个软件加载所有图像并再次保存它们来解决这个问题,这似乎可以擦除标签并允许重建。这是乏味和耗时的,因为我一天要做很多次 我尝试使用MatlabTIFF类加载“普通”和“擦洗”tiff。我手动查看了struct中的所有字段,没有发现任何差异,尽管另一个字段不会加载到CT程序中,而另一个字段也可以Image 隐藏的TIFF品牌?,image,matlab,tiff,Image,Matlab,Tiff,我在做计算机断层扫描投影图像的图像处理。原始图像是CT机器输出的.tiff图像。我将它导入Matlab,在那里我处理它并使用imwrite()保存输出图像 我用来重建CT图像的软件是专有的,但只要它们符合一定的标准,就支持从任何.tiff图像重建。显然,Matlab并没有遵循这个标准,因为它似乎以某种方式标记了它保存的所有.tiff图像。我可以通过使用第三个软件加载所有图像并再次保存它们来解决这个问题,这似乎可以擦除标签并允许重建。这是乏味和耗时的,因为我一天要做很多次 我尝试使用MatlabT
有没有一种隐藏的方式可以让Matlab以某种方式给这些图像打上烙印?有可能在Matlab中删除这些图像吗?我不能绝对肯定,但Matlab不太可能添加隐藏品牌 根据格式标准,向tif文件添加隐藏品牌不会导致tif阅读器软件失败 请参阅私人标签部分: 开发人员可以申请一块“私有标记”,使他们能够在TIFF文件中包含自己的专有信息,而不会导致文件交换问题。TIFF阅读器必须忽略他们无法识别的标签,并且保证注册开发者的私人标签不会与任何其他人的标签或规范中定义的标准标签集发生冲突 看起来您使用的CT图像软件不符合tiff标准 软件可能(但不太可能)符合较旧版本的tiff(版本5.0而不是版本6.0) 失败的一个原因可能是Matalb创建了非常大的条带,并且没有遵循8K字节的建议。
参考: 不建议使用单一条带。选择RowsPerStrip,使每个条带 大约8K字节,即使数据未压缩,因为它使缓冲更简单 给读者。“8K”值是相当随意的,但似乎工作得很好 检查以下代码(我已发布):
失败的原因可能还有很多,因为tiff格式非常复杂(特别是从读卡器方面) 作为一种解决方法,ImageMagick将忽略或抑制不需要的TIFF标记,您可以安排它在一个简单的脚本中并行重新写入多个TIFF图像。此外,您还可以使用其
identify
程序检查您的文件,查看品牌是什么-使用identify-verbose someImage.tif
,或者如果您有v7或更高版本,在该命令前面加上magick…
前缀,如果您安装libtiff
(我在Mac上使用自制软件),您将得到一个名为tiffdump
的程序,该程序还将告诉您所有您想知道的关于TIF文件的信息。如果专有软件限制了您的研究,您总是有另一个选择:开源。对于2D CT重建和3D重建(我认为这是你的情况,因为.tif
),我相信ASTRA和TIGRE是很好的选择。两者都可以从CT机器上重建图像。免责声明:我为TIGRE编程。我尝试了你的代码,但没有帮助。我想你可能是对的,问题出在CT软件端。事实上是的。我发现另一个程序无法正确显示imwrite()-tiff。我感到沮丧,决定再试一次,并注意到上次我在代码中犯了一个错误。使用上面的代码(但将循环更改为write())解决了问题,现在两个程序都能够与TIFF正确交互。
%Simulate large image (to be saved as tiff later)
I = imread('peppers.png');
I = repmat(I, [4, 4]);
t = Tiff('I.tif', 'w');
width = size(I, 2);
height = size(I, 1);
rows_per_strip = 1; %Select 1 row per strip (assume image row is less then 8K bytes).
setTag(t, 'ImageLength', height)
setTag(t, 'ImageWidth', width)
setTag(t, 'Photometric', Tiff.Photometric.RGB)
setTag(t, 'BitsPerSample', 8)
setTag(t, 'SamplesPerPixel', 3)
setTag(t, 'RowsPerStrip', rows_per_strip)
setTag(t, 'PlanarConfiguration', Tiff.PlanarConfiguration.Chunky)
%setTag(t, 'Compression', Tiff.Compression.LZW)
setTag(t, 'Compression', Tiff.Compression.None) %Try without compression
n_strips = ceil(height / rows_per_strip); %Total number of strips.
h = waitbar(0, 'In process');
%Write the tiff image strip by strip (and advance the waitbar).
for i = 1:n_strips
y0 = (i-1)*rows_per_strip + 1; %First row of current strip.
y1 = min(y0 + rows_per_strip - 1, height); %Last row of current strip.
writeEncodedStrip(t, i, I(y0:y1, :, :)) %Write strip rows y0 to y1.
waitbar(i/n_strips, h); %Update waitbar.
drawnow %Force GUI refresh.
end
close(t)
close(h)