在Matlab中改变图像?

时间:2013-12-23 16:31:35

标签: image matlab tiff

在使用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;

我尝试将图像作为tiff对象阅读,看看它是否解决了问题,但这也无效。图像有两个条带,第一个条带的最后两行与最后一个条带的前两行相同,这就是为什么中间线条似乎重复的原因。似乎matlab正在索引读错我的图像,可能是因为它不是方形图像。我只是做错了什么,或者matlab有关于读取非方形tiff的错误?有任何改进的想法或建议吗?

1 个答案:

答案 0 :(得分:3)

首先,我有点同意horchler,也就是说,标题中有错误。

我们很容易发现StripByteCounts (15872)width*height (128*126)不匹配。这可能是您在行63 - 6465 - 66中看到重复的原因。

由于RowPerStrip = 64StripOffsets = [8,15880]可能表示您有128*124图表,因此Matlab可能会使用前64行中的最后两行来填充开头的缺失行其余的行。所以总行可以填充到126.嗯,这只是我猜测Matlab如何处理维度和ByteCounts之间的分歧。

毕竟,对于你的问题,imread在读取TIFF时确实改变了Matlab中的图像而没有发出任何警告。 imread正在阅读TIFF,Matlab。

在您的某个链接中观察TIFF帧后,TIFF似乎实际上包含尺寸为128*126的图像数据。因此,如果您信任标题中指示的维度,则可能会使用fread来读取TIFF中的帧而不是使用不稳定的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; 

现在,尽管这可能解决了奇怪的Matlab imread行为,但上述结果仍然与您在第二个链接中显示的图片不匹配。根据第二个链接中的图片,它有300帧但你在第一个链接中附加的帧只有30帧。也许我们都在看错了?