在MATLAB中与非常大的Tiff(或rset)图像进行交互

时间:2015-03-16 14:57:17

标签: matlab image-processing tiff

我有一些非常大的Tiff图像,我试图在MATLAB GUI应用程序中使用。如果我尝试使用imshow加载图像,则会出现内存不足错误。 (是的,我知道MATLAB不是GUI或加载大图像的最佳选择,但在这种情况下使用MATLAB是有充分理由的。)

我显然可以创建一个降低分辨率的数据集(rset文件)并使用imtool来查看图像,但这没有用,因为我希望用户能够通过单击它来提取图像(x) ,y)coord into应用程序。 Imshow似乎与rset文件不直接兼容。有没有办法让我在panable / zoomable图中加载一个rset'd图像,或者我能达到目标的任何其他方式?

我查看了imtool的代码,但似乎是使用未记录的类来读取rset文件,我无法复制其行为。

3 个答案:

答案 0 :(得分:1)

您可以使用MATLAB的低级文件I / O函数来读取TIFF图像的全部或部分内容,以避免出现OOM问题。

fileName = 'LargeTiff.tif';

info = imfinfo(fileName)

% Determine number of frames    
nFramesStr= regexp(info.ImageDescription, 'images=(\d*)', 'tokens');
nFrames = str2double(nFramesStr{1}{1});

% Use low-level File I/O functions to read the file
fp = fopen(fileName , 'rb');

% The "StripOffsets" field provides the offset to the first strip. 
fseek(fp, info.StripOffsets, 'bof');

% Assume that the image format is 16-bit per pixel and is big-endian
% Also assume that the images are stored one after the other

% For example, read the first 100 frames
frameNum = 100;
imData = cell(1, frameNum);
for cnt = 1 : frameNum
    imData{cnt} = fread(fp, [info.Width info.Height], 'uint16', 0, 'ieee-be');
end

fclose(fp);

答案 1 :(得分:0)

看起来我的问题是我没有足够的内存来加载整个tiff,并且没有rset文件格式的公开规范。因此,我将通过创建自己的降低分辨率数据集版本来解决问题。我应该能够加载图像的块部分,重新​​保存它们,然后在缩放时动态加载和卸载所需的高分辨率块,并在缩小时加载缩小分辨率的概述。

答案 2 :(得分:0)

您可以编写一个回调函数来从imtool获取像素坐标(X,Y),然后使用下面的代码转换为图块编号和图块索引。然后,您可以在matlab中使用readencodedtile函数

function [tileidx,Tile_num] = getTileInfo(tiffile,X,Y)

 A = Tiff(tiffile);
 tile_width = A.getTag('TileWidth');
 tile_length = A.getTag('TileLength');
 SizeA = size(A);
 tt = sub2ind(SizeA,X,Y);

% Example only
% X = repmat((1:10)',1,10);
% Y = repmat((1:10),10,1);
% A = reshape(1:100,10,10);
% SizeA = size(A);
% tile_width = 3;
% tile_length = 2;

tileidx = rem(tt-(Y-1)*SizeA(1)-1,tile_length)+1 ...
    + tile_length*rem(Y+tile_width-1,tile_width);

Tile_num = ceil(Y/tile_width)+ ...
    (ceil(X/tile_length)-1)*ceil(SizeA(2)/tile_width);