我有一些非常大的Tiff图像,我试图在MATLAB GUI应用程序中使用。如果我尝试使用imshow加载图像,则会出现内存不足错误。 (是的,我知道MATLAB不是GUI或加载大图像的最佳选择,但在这种情况下使用MATLAB是有充分理由的。)
我显然可以创建一个降低分辨率的数据集(rset文件)并使用imtool来查看图像,但这没有用,因为我希望用户能够通过单击它来提取图像(x) ,y)coord into应用程序。 Imshow似乎与rset文件不直接兼容。有没有办法让我在panable / zoomable图中加载一个rset'd图像,或者我能达到目标的任何其他方式?
我查看了imtool的代码,但似乎是使用未记录的类来读取rset文件,我无法复制其行为。
答案 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);