從minist database(t10k-images-idx3-ubyte)中讀取圖片


matlab代碼(親測,可運行出來):

% Matlab_Read_t10k-images_idx3.m
% 用於讀取MNIST數據集中t10k-images.idx3-ubyte文件並將其轉換成bmp格式圖片輸出。
% 用法:運行程序,會彈出選擇測試圖片數據文件t10k-labels.idx1-ubyte路徑的對話框和
% 選擇保存測試圖片路徑的對話框,選擇路徑后程序自動運行完畢,期間進度條會顯示處理進度。
% 圖片以TestImage_00001.bmp~TestImage_10000.bmp的格式保存在指定路徑,10000個文件占用空間39M。。
% 整個程序運行過程需幾分鍾時間。

clear all;
clc;
%讀取訓練圖片數據文件
[FileName,PathName] = uigetfile('*.*','選擇測試圖片數據文件t10k-images.idx3-ubyte');
TrainFile = fullfile(PathName,FileName);
fid = fopen(TrainFile,'r'); %fopen()是最核心的函數,導入文件,‘r’代表讀入
a = fread(fid,16,'uint8'); %這里需要說明的是,包的前十六位是說明信息,從上面提到的那個網頁可以看到具體那一位代表什么意義。所以a變量提取出這些信息,並記錄下來,方便后面的建立矩陣等動作。
MagicNum = ((a(1)*256+a(2))*256+a(3))*256+a(4);
ImageNum = ((a(5)*256+a(6))*256+a(7))*256+a(8);
ImageRow = ((a(9)*256+a(10))*256+a(11))*256+a(12);
ImageCol = ((a(13)*256+a(14))*256+a(15))*256+a(16);
%從上面提到的網頁可以理解這四句
if ((MagicNum~=2051)||(ImageNum~=10000))
    error('不是 MNIST t10k-images.idx3-ubyte 文件!');
    fclose(fid);    
    return;    
end %排除選擇錯誤的文件。
savedirectory = uigetdir('','選擇測試圖片路徑:');
h_w = waitbar(0,'請稍候,處理中>>');
for i=1:ImageNum
    b = fread(fid,ImageRow*ImageCol,'uint8');   %fread()也是核心的函數之一,b記錄下了一副圖的數據串。注意這里還是個串,是看不出任何端倪的。
    c = reshape(b,[ImageRow ImageCol]); %亮點來了,reshape重新構成矩陣,終於把串轉化過來了。眾所周知圖片就是矩陣,這里reshape出來的灰度矩陣就是該手寫數字的矩陣了。
    d = c'; %轉置一下,因為c的數字是橫着的。。。
    e = 255-d; %根據灰度理論,0是黑色,255是白色,為了弄成白底黑字就加入了e
    e = uint8(e);
    savepath = fullfile(savedirectory,['TestImage_' num2str(i,d) '.bmp']);
    imwrite(e,savepath,'bmp'); %最后用imwrite寫出圖片
    waitbar(i/ImageNum);
end
fclose(fid);
close(h_w);

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM