在上個示例程序中,用到了直方圖結構體:CvHistogram,現在來具體的研究一下這個結構。
定義:
typedef struct CvHistogram
{
int type;
CvArr* bins;
float thresh[CV_MAX_DIM][2];
float** thresh2;
CvMatND mat;
}CvHistogram;
第一個成員type:用來指定第二個成員bins的具體類型。bins的類型是CvArr*,看其定義可以知道,CvArr* 僅僅是被用於作函數的參數,用於指示函數接收的數組類型可以不止一個,如 IplImage*, CvMat* 甚至 CvSeq*,所以需要type來具體指定bins的類型。
第二個成員bins : 用於存放直方圖每個灰度級數目的數組指針,數組在cvCreateHist 的時候創建,其維數由cvCreateHist 確定(一般以一維比較常見)。
第三個成員thresh:一個二維數組,CV_MAX_DIM對應直方圖的維數。且第二維固定爲2。
這個數組比較難理解,首先要理解什麼是一維直方圖和二維直方圖。一維直方圖就是單通道圖像的直方圖,或者彩色圖像中某個單獨通道的直方圖。二維直方圖就是2個通道的直方圖,比如彩色圖像的紅-藍直方圖。既然是直方圖,必定有上下界,所以thresh的第二維是2,比如[0 255],就是統計[0-255]區間灰度分佈的直方圖。而二維紅-藍直方圖的thresh爲[0 255;100 200],就是分別統計紅色圖像灰度級在[0 255]以及藍色圖像在灰度級[100 200]的分佈情況。
第四個成員是thresh2一個二維數組指針,用於非均勻直方圖的情形。如果是均勻直方圖,會自動根據bin的個數均分上下界,每個bin的大小一樣。若是非均勻直方圖,就要用到thresh2這個參數指定每個區間的上下界,要是多維的直方圖,那麼就要爲每一維的所有bin都設定上下界。
最後一個成員mat,用來存儲數據。
cvCalcHist函數對圖像進行操作後,得到了每一個bin的大小,並存放到mat的data成員指向的內存中。bins成員的值和mat裏的data成員的值一樣。