2015-03-16 2 views
0

У меня есть очень большие изображения Tiff, которые я пытаюсь использовать в приложении MATLAB GUI. Если я попытаюсь загрузить изображения с помощью imshow, я получаю ошибку вне памяти. (Да, я знаю, что MATLAB не лучший выбор для графических интерфейсов или загрузка больших изображений, но в этом случае есть веские основания для использования MATLAB).Взаимодействие с очень большими изображениями Tiff (или rset) в MATLAB

Я могу создать набор данных с уменьшенным разрешением (файл rset) и использовать imtool для просмотра изображения, но это не помогает, поскольку я хочу, чтобы пользователь мог взаимодействовать с изображением, нажав на него, чтобы извлечь (х, у) в приложение. Imshow, похоже, не совместим напрямую с rset-файлами. Есть ли способ загрузить изображение rset'd с помощью панорамируемой/масштабируемой фигуры или любым другим способом, которым я могу достичь цели?

Я просмотрел код для imtool, но, похоже, использует недокументированные классы для чтения rset-файлов, и я не могу воспроизвести его поведение.

ответ

1

Вы можете использовать низкоуровневые функции ввода/вывода файлов MATLAB для чтения цели или частей изображения 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); 
+0

Выполнение этого кода, я получаю «Ссылка на несуществующее поле» ImageDescription '. ". Я вручную устанавливаю количество кадров в 1, и это все равно приводит к ошибке из-за памяти из fread(). Может быть, мне просто нужно получить лучшую машину:/ – Huggzorx

+0

Насколько велико изображение? – scai

+0

Почти 300 МБ (это аэрофотоснимки с высоким разрешением) – Huggzorx

0

Похоже, моя проблема в том, что я просто не хватает памяти, чтобы загрузить весь размолвку, и что нет никакой общественной спецификации для формата RSET файлов. Поэтому я собираюсь вместо этого решить эту проблему, создав собственную версию набора данных с уменьшенным разрешением. Я должен иметь возможность загружать секции блока изображения, сохранять их, а затем динамически загружать и выгружать только необходимые блоки с высоким разрешением при масштабировании и загружать обзор с уменьшенным разрешением при уменьшении.

0

Вы можете написать функцию обратного вызова, чтобы получить координаты пикселей (X, Y) из imtool, а затем преобразовать в число плитки и индекс плитки, используя приведенный ниже код. Затем вы можете использовать функцию readencodedtile в matlab

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); 
Смежные вопросы