1. 程式人生 > >【影象處理】HDF5 C++程式設計簡介

【影象處理】HDF5 C++程式設計簡介

HDF5是一種科學資料格式,其特點是可以將不同型別的資料集整合儲存到一個檔案,並分別打上標籤、註釋。相比舊版的HDF格式,HDF5能支援大於4GB的檔案讀寫;HDF5在資料集的基礎上增加包Group,類似資料夾。這使得HDF5檔案內部像普通的檔案系統一樣,便於資料的整合管理。HDF5跟資料庫有很大區別,HDF5使用樹形結構來標註儲存的多個數據集,並可使用類似python字典的方法來索引這些資料,與資料庫的索引操作類似,然而缺少資料的外來鍵、連線等關鍵操作,因此HDF5更加類似於zip等壓縮檔案的專用版,並且HDF5內建支援幾種開源無失真壓縮格式。HDF5原生用C語言編寫,支援C++、python、java等多種語言。
這裡簡單介紹下C++相關的程式設計,HDF5作為科學計算領域的明星,而科學計算離不開C/C++;HDF5的C語言介面複雜難學,而C++介面則能自行完成大多數工作。因此HDF5的C++程式設計非常重要。

寫資料

首先是用H5File函式開啟檔案,然後使用createDataSet函式建立資料集,或者使用createGroup建立包/資料夾,再在group下面呼叫createDataSet函式。寫入資料需要傳入原始資料指標、原始資料型別、原始資料大小、寫入規則。原始資料型別可以直接使用預定義的本地資料型別。資料大小資訊儲存在DataSpace類中。寫入規則儲存在DSetCreatPropList中。
HDF5支援直接儲存陣列資料,或者儲存分塊資料。分塊規則儲存在DSetCreatPropList中,分塊大小對於資料讀寫有重大影響。
例項:

H5File *file = new H5File(path.c_str(), H5F_ACC_TRUNC);//不用c字串貌似有bug
Group g = file->createGroup(gname.c_str()); int dims[2]={10,10}; DataSpace mspace(2,dims); DSetCreatPropList param; int chunkDims={256,256}; param.setChunk(2,chunkDims); int fillVal = 0; param.setFillValue(&fillVal);//分塊多出來部分的填充值 param.setDeflate(6);//deflate無失真壓縮 int *data = new int[100]; ...//make data
int **wdata = new int[10]; for(int i = 0; i < 10; ++i) wdata[i] = data+i*10; DataSet d = g.createDataSet(dname.c_str(),PredType::NATIVE_INT,mspace, param); d.write(wdata[0], PredType::NATIVE_INT); g.close() file->close();

HDF5允許直接寫入二維陣列,這樣要裁剪區域資料的操作api就容易寫。而影象處理通常使用一維陣列來儲存影象,我們可以建立一個二維陣列指標來指向正確的位置,然後寫入,避免重建二維陣列的工作。這裡要注意write函式的第一個引數,是wdata[0]而不是wdata。寫入操作基本就這些,寫註釋操作依樣畫葫蘆即可。請注意必須要記得使用close函式關閉group,不然沒有資料寫入。

讀資料

HDF5允許使用快取技術來加速讀取資料。HDF5快取技術需要指定單個快取塊大小(必須大於檔案chunk的尺寸),快取塊數量和快取策略。快取塊數量是用一個hash值來給定的,官網推薦這個值是目標最大快取塊數量的10倍。快取策略輸入的是一個值,表示快取塊的生存權重預設為0.75,0值表示使用LRU策略來決定快取塊的保留與否。我暫時沒有找到快取函式的C++介面,不過C函式是可以和C++相容的。例項如下:

H5File *file = new H5File(path.c_str(), H5F_ACC_RDONLY);
H5Pset_cache(file->getAccessPlist().getId(),0,521, 256*256,0.5);//第二個引數被廢棄了,後續引數是hash值,快取塊大小,快取策略值
if(!file->exists(dname.c_str())) return 0;//檢測資料是否存在
DataSet d = file->openDataSet(dname.c_str());
hsize_t offset[2]={1,1};
hsize_t cout[2]={3,4};
hszie_t stride[2]={1,1};//預設就是1,可以不用管。這裡展示一個完整的程式碼
hsize_t block[2]={1,1};//預設就是1,可以不用管。這裡展示一個完整的程式碼
DataSpace mspace(2,count,NULL);
DataSpace dataSpace = d.getSpace();
dataSpace.selectHyperslab(H5S_SELECT_SET, count, offset, stride, block);
int **data = .....//prepare data
d.read(data[0], PredType::NATIVE_INT, mspace, dataSpace);
file->close();

注意讀圖有兩個DataSpace,dataSpace指定讀取範圍,mspace給定讀取資料的大小(感覺引數有點重複)。
如果不知道資料集的大小,則需要從DataSet獲取相關資訊:

int rank = dataSpace.getSimpleExtentNdims();
hsize_t *dims = new hsize_t[rank];
dataSpace.getSimpleExtentdims(dims);

此外,HDF5封裝了多種跨平臺的資料型別,支援複合資料型別,所以HDF5不會直接返回給使用者當前DataSet的資料型別是什麼,需要預先告知程式設計者。如果使用本地資料型別,則相對簡單:

DataType type = dataSet.getDataType();
if(type == PredType::NATIVE_INT){
...
}

C++類DataType可以指代任意資料型別,並支援用==符號來選擇正確的資料型別。

遍歷

遍歷沒有找到C++介面,只能用C語言編寫,需要準備一個回撥函式,回撥函式用iterateElems函式來呼叫:

herr_t Op(hid_t group, const char *name, void *data)
{
H5G_stat_t statbuf;
H5Gget_objinfo(group, name, false, & statbuf);
//name是每一輪遍歷的名稱,statbuf儲存檔案資訊,內部的H5G_obj_t可以鑑別是資料集還是group型別。data是外部傳入的資料,可以把遍歷檔案的資訊匯出去
std::vector<std::string> *opdata = (std::vector<std::string> *)data;
opdata->push_back(name);
}

int num = file.getNumObjs();//根目錄下obj的數量
int *ids=new int[num];
for(int k = 0; k < num; ++k)
  ids[k] = k;
std::vector<std::string> dataList;
file.iterateElems("/",ids, Op,&dataList);

相關推薦

影象處理HDF5 C++程式設計簡介

HDF5是一種科學資料格式,其特點是可以將不同型別的資料集整合儲存到一個檔案,並分別打上標籤、註釋。相比舊版的HDF格式,HDF5能支援大於4GB的檔案讀寫;HDF5在資料集的基礎上增加包Group,類似資料夾。這使得HDF5檔案內部像普通的檔案系統一樣,便於資

影象處理直方圖均衡化(附帶Matlab及OpenCV3自程式設計實現程式碼)

前言   直方圖均衡化是最基礎的影象處理方法之一,也是本人接觸影象處理時最先接觸到的演算法。演算法很簡單,但是卻不得不說非常的巧妙。本文將從方法的數學基礎出發講解直方圖均衡化背後的數學原理,並提供matlab實現程式碼。 直方圖均衡化   影象灰度

影象處理C++實現模板匹配

////////////////////////////////////////////////////////////////////////// //預先判斷——3*3十字中心——區域是否相似,如果相似,則再匹配判斷。這樣可以減少判斷次數。 //前提:模板大於9

影象處理 增加程式速度的方法

1. stack(棧) heap(堆) 和全域性區 測試BGR轉YUV  的表在stack 和 heap  2. 查詢表   部分查詢表  和3D查詢表  速度比較   3. 查詢表放在堆上和棧上的速度比較   4.

影象處理工業相機原理詳述 (轉載)

轉自:  https://blog.csdn.net/HelloZEX/article/details/80905095 工業相機是機器視覺系統中的一個關鍵元件,其最本質的功能就是將光訊號轉變成有序的電訊號。選擇合適的相機也是機器視覺系統設計中的重要環節,相機的選擇不僅直接決定所採集到的影象

影象處理Lightroom Classic CC 2019 for Mac中文破解版

Lightroom Classic CC 2019 for Mac中文破解版是目前最強大的影象處理軟體之一,簡稱Lr CC 2019破解版,使用lightroom mac 破解版可以讓您獲得最佳的攝影效果所提供的圖片整理編輯工具,提高照片的色彩、刪除瑕疵、伸展畫面等等,可以為您的照片錦上添花。新版L

影象處理RGB影象邊緣檢測

灰度圖邊緣檢測    在學習影象處理時,首先接觸到的就是灰度影象的邊緣檢測,這是影象處理最基礎的也是最重要的一環,熟悉影象邊緣檢測有助於我們學習其他的數字影象處理方法。由於影象的邊緣區域會存在明顯的畫素值階躍,因此邊緣檢測主要是通過獲得影象灰度梯度,進而通過梯

影象處理Matlab開啟PCD或者PLY檔案點雲檔案

一、Windows系統實現配置PCL庫 最新版本的PCL Windows已經進行了更新,不少網路現有教程都無法使用。建議放棄掙扎,使用PCL更換Ubuntu。 二、Matlab開啟PCD或者其他點雲檔案 如果提示缺少pcread,會自動安裝MATLAB影象處理Toolbox。 p

影象處理VTK二維影象標記bug修正

遊戲或者CAD軟體中,我們常常在目標旁邊顯示一個始終面向使用者的二維影象,來表示某些特定標識。VTK使用vtkFollower 來實現這個功能,然而VTK7.1及以下版本發生bug,表現為使用vtkFollower之後,二維影象無法渲染,只顯示一個純白色的矩形框

影象處理FPGA verilog實現16位RGB的影象的灰度轉換

專案:FPGA verilog實現16位RGB的影象的轉換為8位寬的灰度圖。 專案需要的模組:呼叫一個RAM,16*22500,灰度處理模組和VGA800X600模組。          本次用到的FPGA是spartan6  X16。因為資源少,所以先嚐試的做點簡單的影

影象處理引導濾波器

1,定義 引導濾波:即需要引導圖的濾波器,引導圖可以是單獨的影象或者是輸入影象,當引導圖為輸入影象時,引導濾波就成為一個保持邊緣的濾波操作,可以用於影象重建的濾波。 引導濾波的流程見下圖: 假設輸入影象為p,輸出影象為q,引導圖為I,q與I在以畫素k為中心的視

影象處理GeoTiff Tags

2100 = GGRS87 Greek Grid  2176 = ETRS89 Poland CS2000 zone 5  2177 = ETRS89 Poland CS2000 zone 7  2178 = ETRS89 Poland CS2000 zone 8  2180 = ETRS89 Poland

影象處理三種邊緣保持的濾波器(雙邊,引導,加權最小二乘)

從原理上分析,這幾種濾波器沒有太大的差別,都是基於最基本的思想:在梯度比較大的地方(edges)實現preserve,要求儘量不進行平滑,最好是輸出與輸入一樣;而在梯度比較小的地方,儘量的平滑一下,輸入與輸出可以有稍大的不同! 那麼從這個原理出

影象處理openCV光流法追蹤運動物體

openCV光流法追蹤運動物體 email:[email protected] 一、光流簡介         光流的概念是Gibson在1950年首先提出來的。它是空間運動物體在觀察成像平面上的畫素運動的瞬時速度,是利用影象序列中畫素在時間域上的變化以及相鄰幀之

影象處理直方圖均衡化

直方圖均衡化是影象處理領域中利用影象直方圖增強影象對比度的一種方法。 如果一副影象的畫素佔有很多的灰度級而且分佈均勻,那麼這樣的影象往往有高對比度和多變的灰度色調。“直方圖均衡化”是把原始影象的灰度直方圖從比較集中的某個灰度區間變成在全部灰度範圍內的均勻分佈。直方圖均衡化就是對影象進行非線性拉

影象處理影象強度變換、直方圖均衡化(Image Intensity Transformations and Histogram Equalization)

實驗要求   該實驗使用強度變換方法對影象進行增強。實驗影象為圖3.8(a)   (1.a) 用公式(3.2-2)所示的對數變換方法進行影象增強。   (1.b) 用公式(3.2-3)形式的指數變換方法進行影象增強。實驗的目的是用(1.a)和(1.b)中的

影象處理人臉預處理工具FaceTools

前言: 在做人臉分析的時候,常常要求人臉資料已經經過檢測、歸一化、對齊等操作,然而我們網上下載的資料庫,大部分是沒有經過這一些處理的,所以也經常需要我們自己寫程式來完成這些資料預處理。 雖然網上都有現成的一些人臉檢測和關鍵點檢測的可執行檔案提供,但是,使用起

VS開發影象處理直方圖均衡與平臺直方圖

首先需要說明的是,如果你說的是一道完整的題目,則這道題目沒有唯一解,因為題目中沒有說明原始影象的灰度級數(比如原始影象是16個灰度級的,或者是32個灰度級的,等等)。為了給你提供一個解題思路,現在人為假設原始影象是16個灰度級的,其它灰度級的解法類似。 1、影象的灰度直方圖求法為: (1)先計算影象中各個灰度

影象處理影象去模糊 總結

本人最近由於做相關去卷積工作,查閱了上百篇文獻,發現在這個領域,可能也是‘水太深’了,並沒有一篇較好的綜述,現在做以下總結---- 只對高斯與散焦模糊的非盲去卷積領域,對於運動模糊並未做總結,但實際上除了點擴散函式的估計有區別,實際上這三類去模糊甚至和去噪,損失函式模型都可

影象處理海森矩陣(Hessian Matrix)及一個用例(影象增強)

前言        Hessian Matrix(海森矩陣)在影象處理中有廣泛的應用,比如邊緣檢測、特徵點檢測等。而海森矩陣本身也包含了大量的數學知識,例如泰勒展開、多元函式求導、矩陣、特徵值等。寫這篇部落格的目的,就是想從原理和實現上講一講Hessian Matr