Чтение большого структурированного файла в Matlab - PullRequest
2 голосов
/ 31 января 2012

В matlab я хотел бы прочитать из структурированного и довольно большого файла (размер: 18 + 2048 * 2048 байт), где 18 первых байт назначены заголовку, а остальные - интенсивности пикселей. Беспокойство здесь - скорость. Как видно из приведенного ниже кода, многократный доступ к файлу значительно снизил производительность. Можете ли вы предложить более быстрый способ чтения этого содержимого из файла? например чтение всей вещи в буфере, из которого мы можем читать, используя функцию "fread".

fid = fopen(fileName, 'r', 'b');     % 'r' readonly and 'b' big endian
a= fread(fid,1,'uint16');
b1= fread(fid,1,'uint32');
b2= fread(fid,1,'uint32');
c1= fread(fid,1,'uint32');
c2= fread(fid,1,'uint32');
img=zeros (...
for i= (b1 + 1) : (b2 + 1)
   for j= (c1 + 1) : (c2 + 1)
      img(i, j) = fread(fid,1,'uint16');
   end
end

Ответы [ 3 ]

5 голосов
/ 31 января 2012

Просто вычислите общий размер n из b1, b2, c1 и c2 и передайте его единственному вызову fread(fid,n,'uint16') вместо того, чтобы зацикливаться на нем. Затем вызовите reshape на выходе, чтобы сделать его двумерным массивом.

1 голос
/ 31 января 2012

Кажется, что вы можете просто прочитать все изображение сразу, вот так:

%... read header first so that file pointer is positioned at start of image data

M = b2 - b1 + 1; % width
N = c2 - c1 + 1; % height

[A, count] = fread(fid, [M, N], 'uint16');

if (count ~= M * N) % error check for number of elements read
    disp('Error reading image file');
end

img = zeros(...);
img(b1+1:b2+1, c1+1:c2+1) = A; % offset the image as necessary
1 голос
/ 31 января 2012

Вы можете прочитать данные изображения за один раз.Обратите внимание на порядок элементов

img(b1+1:b2+1,c1+1:c2+1) = fread(fid, [c2-c1+1 b2-b1+1], 'uint16').';

Еще одна вещь, которую необходимо учитывать, - это сохранение данных как uint16, чтобы избежать двойного преобразования целого числа:

img = zeros(s1, s2, 'uint16');
img(b1+1:b2+1,c1+1:c2+1) = fread(fid, [c2-c1+1 b2-b1+1], '*uint16').';
...