2012-01-30 56 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