2012-01-30 82 views
2

在matlab中,我想从一个结构化的,相当大的文件(大小:18 + 2048 * 2048字节)中读取,其中18个第一字节分配给头,其余的是像素图像强度。 这里关心的是速度。正如您在下面的代码中看到的那样,对文件的多次访问显着降低了性能。 你能建议从文件中读取这些内容的更快速的方式吗?例如使用“fread”函数从缓冲区中读取整个事物。在Matlab中读取一个大的结构化文件

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 

回答

5

只需计算从B1,B2,C1,C2中的总大小为n,并把它传递到单个fread(fid,n,'uint16')呼叫,而不是遍历它。然后在输出上调用reshape使其成为一个二维数组。

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').'; 
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 
+0

请注意方向 – Nzbuu 2012-01-31 16:04:09