MATLAB 處理hdf5圖像數據集使用總結

最近使用MATLAB要對要使用的圖片進行小波變換(wavelet analysis)處理後再使用,順便也學了一下MATLAB,雖然以前也接觸過,但和“安裝了一下軟件”的接觸水平沒啥區別。

最近也突然感悟到,編程的真諦在於你首先要清楚你要幹什麼,然後纔是結合具體的語言的語法、函數、特性等具體的手段去實現它。所以編程語言雖然重要,但並不是最核心的,最核心的是你知道你要幹什麼,編程的核心不是編程語言,而是如何達到目的思路。剩下的就是交給Google或度娘,還有自己在具體編程的時的經驗積累以及觸類旁通的能力了。


使用MATLAB一定要注意在語句後加不加分號 “ ”的問題!另外MATLAB運行的路徑也要搞清楚在哪,路徑問題對任何一種語言都是極爲重要的,它牽涉到你能不能找到你要操作的對象。

我要處理的數據是HDF5文件,一般以 .hdf5 或 .h5 爲文件後綴。MATLAB讀取hdf5文件使用

hdf5read(filename,keyname), 未來會改爲h5read 函數捨棄hdf5read;

比如:data = hdf5read('DLL_xyz.hdf5','data')   (或者:h5read('DLL_xyz.hdf5','/data') ,注意data前要多加一個/)

可以通過size函數來查看data的shape或格式情況:size(data),輸出ans= 32,32,3,122361,表示這是一個HWCN格式的圖像,寬高爲32x32的圖像,通道爲3,RGB色(除了caffe和python中cv包是BGR外,其他的好像都是RGB,RGBA暫不考慮),共122361張圖像。如果你不知道你的hdf5文檔有什麼主鍵keyname怎麼辦呢?這時候搜索就是好習慣啦,用hdf5info(filename)來解析你的活hdf5文件結構,如

info = hdf5info(filename), top_level = info.GroupHierarchy, 查看文件的層次結構可以繼續:toplevel.Groups等,多試試你就知道是什麼了。

MATLAB讀取單張圖像的方式是:file = imread(filename),顯示圖片一般用imshow(file)即可,其他的函數如image、imagesec等函數還需要你自己去試,我因爲用不到所以就沒再看。寫圖片到磁盤上用imwrite(file,filename)函數。

對圖像進行小波變換並顯示的方式爲:

對於單張圖片:

img = imread('lenna.png');
[cA,cH,cV,cD] = dwt2(img,'haar');
figure,imshow(img),title('原圖');
subplot(2,2,1),imshow(uint8(cA)),title("低頻分量");
subplot(2,2,2),imshow(uint8(cH)),title("水平細節分量");
subplot(2,2,3),imshow(uint8(cV)),title("垂直細節分量");
subplot(2,2,3),imshow(uint8(cD)),title("對角線細節分量");



對於多張圖片:
對於多張圖片需要把不同分量分開放在各個不同的figure中,需要給figure編號
data = hdf5read(filename,'data');
%images = permute(data,[4,1,2,3]);%轉換HWCN格式爲NHWC
dataSize = size(data);
img_num = ceil(dataSize(4)/1000); %ceil()餘數向上取整
plot_num = ceil(sqrt(img_num));
fprintf('value of dataSize(4),img_num,plot_num  is:%d,%d,%d\n',dataSize(4),img_num,plot_num);

num = 1;
for i = 1:1000:dataSize(4)
    img = data(:,:,:,i); % matlab 數組切片方式
    [cA,cH,cV,cD] = dwt2(img,'haar');
    figure(1);
    subplot(plot_num,plot_num,num),imshow(uint8(cA));
    figure(2);
    subplot(plot_num,plot_num,num),imshow(uint8(cH));
    figure(3);
    subplot(plot_num,plot_num,num),imshow(uint8(cV));
    figure(4);
    subplot(plot_num,plot_num,num),imshow(uint8(cD));
    num = num + 1;
end

要注意的是在MATLAB中數組形式的數據是按列優先的順序排的,和python等不一樣,所以你讀取出來的數據很可能看起來好像被鏡像/旋轉了,看着和原圖不一樣,尤其是hdf5文件,一般是互爲轉置的,更要小心。

程序中需要用什麼功能的程序要自己去查,比如計算figure大小的時候使用ceil()函數可以將餘數向上取整,round()是四捨五入;

mkdir(path)可以創建目錄。

MATLAB的幾種打印輸出方式:format,disp,fprintf,其中fprintf是格式化輸出控制函數,和C語言中的printf很像,但是和python中的不一樣,不能直接用來輸出值,必須要有格式化輸出控制串,比如fprintf('value is :%d\n',value) 輸出就沒問題,但是fprintf(value)直接輸出value值就會報錯。

最後再強調一下,編程最重要的是思路,解決問題的思路。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章