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);