我在使用imread读取堆叠tiff的单个图像时遇到问题.tiff是128×126.它使用ImageJ读取得很好,但我尝试将其读入Matlab进行一些处理,并在图像中心创建一条奇数条纹.利用左上方的图像的原点,行63和64作为行65和66重复,并且图像的最后两行125和126被切掉.我可以通过将matlab中显示的图像与ImageJ中显示的图像进行视觉比较来判断是否发生了这种情况.
如果我采用相同的tiff堆栈,并保存ImageJ中的第一帧,我没有这个问题.即使使用ImageJ显示输出的matlab图像,我也会看到同样的问题.但是,我想自动化将来自几个tiff堆栈的图像保存为单个tiff文件的过程,这是我在ImageJ中无法做到的,所以我转向Matlab并遇到了这个问题.我在下面提供了我的代码.我尝试用两种不同的方式阅读tiff并得到了同样的错误.它似乎与tiff堆栈以及matlab在tiff中的读取方式有关.我正在使用Matlab R2012b.
我已将下面的链接包含在我看到的静态ImageJ图像和我看到的静态matlab图像中.我还提供了一个链接,用于加载堆叠的tiff文件,这个文件正在为我生成这些问题.
注意:当我将ImageJ作为单独的tiff输出时,我使用下面相同的代码在matlab中从该输出打开第一帧,图像被正确显示.只有在Matlab中从图像堆栈读取第一帧时才会出现错误.
StackOverflow不支持嵌入TIFF文件,但您可以从这些链接查看和下载它们:
用于生成图像的代码
fname='C:\FileLocation\pcd144_012.tif';
im1=imread(fname,1)
imagesc(im1);
axis image; colormap gray;
Run Code Online (Sandbox Code Playgroud)
我尝试在图像中读取tiff对象,看看它是否解决了问题,但这也无效.图像有两个条带,第一个条带的最后两行与最后一个条带的前两行相同,这就是中间线条似乎重复的原因.似乎matlab正在索引读错我的图像,可能是因为它不是方形图像.我只是做错了什么,或者matlab是否有关于非正方形tiff阅读的错误?有任何改进的想法或建议吗?
首先,我有点同意霍克勒的观点,那就是你的标题有问题。
我们可以很容易地观察到StripByteCounts (15872)不匹配width*height (128*126)。63 - 64这可能是您在 row和中看到重复的原因65 - 66。
由于RowPerStrip = 64和StripOffsets = [8,15880]可能表明您有一个128*124图形,Matlab 可能会使用前 64 行中的最后两行来填充其余行开头处的缺失行。所以总行最多可以填充 126。好吧,这只是我对 Matlab 如何处理维度和字节计数之间不一致的猜测。
毕竟,对于你的问题,imread在读取 TIFF 时确实会改变 Matlab 中的图像而不发出任何警告。阅读 TIFF、Matlab时表现不佳imread。
在观察其中一个链接中的 TIFF 帧后,TIFF 似乎实际上具有尺寸为 的图像数据128*126。因此,如果您信任标头中指示的尺寸,您可能会使用 fread 来读取 TIFF 中的帧,而不是使用 shaky imfread。
fname='pcd144_012.tif';
tiffInfo = imfinfo(fname);
framIndex = 1;
tiffWidth = tiffInfo(framIndex).Width; % image width
tiffHeight = tiffInfo(framIndex).Height; % image height
tiffStartOffset = tiffInfo(framIndex).StripOffsets(1); % Image data offset start point
tiffEndOffset = tiffInfo(framIndex).StripOffsets(2); % Image data offset end point
fid = fopen(fname);
fseek(fid,tiffStartOffset,'bof');
im1 = fread(fid,tiffWidth*tiffHeight,'*uint16'); % We knew this from BitsPerSample
fclose(fid);
im1 = reshape(im1,tiffWidth,tiffHeight); % Reshape the image data array
figure
imagesc(im1);
colormap gray;
axis xy;
axis image;
Run Code Online (Sandbox Code Playgroud)
现在,虽然这可能会解决奇怪的 Matlabimread行为,但是,上面的结果仍然与您在第二个链接中显示的图片不匹配。根据第二个链接中的图片,它有 300 帧,但您在第一个链接中附加的图片只有 30 帧。也许我们都看错了图片?
| 归档时间: |
|
| 查看次数: |
1467 次 |
| 最近记录: |