在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
答案 0 :(得分:5)
只需计算b1,b2,c1和c2的总大小n,然后将其传递给单个fread(fid,n,'uint16')
调用,而不是将其循环。然后在输出上调用reshape
使其成为一个二维数组。
答案 1 :(得分:1)
您可以一次性读取图像数据。注意元素的顺序
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').';
答案 2 :(得分:1)
似乎您可以像这样简单地阅读整个图像:
%... 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