直方圖是計算機視覺中最經典的工具之一。如今咱們來詳細講講直方圖。數組
1.直方圖的做用。ide
經過標記幀與幀之間的邊緣和顏色的統計變化,直方圖被用來檢測視頻中場景的變化。經過爲每一個興趣點設置一個有相近特徵的直方圖所構成的「標籤」,用以肯定圖像中的興趣點。邊緣、色彩、角等直方圖構成了能夠被傳遞給目標識別分類器的一個通用特徵類型。函數
2.如何獲得直方圖工具
(1)首先理解直方圖中bin的含義學習
直方圖中bin的含義:計算顏色直方圖須要將顏色空間劃分爲若干小的顏色區間,即直方圖的bin,經過計算顏色在每一個小區間內德像素獲得顏色直方圖,bin越多,直方圖對顏色的分辨率越強,但增長了計算機的負擔。即(學習opencv圖7-2中所分紅的9個豎條區域,每一個豎條區域稱爲一個bin).net
(2)簡單來講直方圖就是對數據進行統計,將統計值組織到一系列事先定義好的bin中。bin中的數值就是從數據中計算出的特徵的統計量,這些數據能夠是諸如梯度、方向、色彩或任何其餘特徵。不管如何,直方圖得到的是數據分佈的統計圖。直方圖其實是一個方便表示圖像特徵的手段。指針
CvHistogram,如今來具體的研究一下這個結構。視頻
定義:blog
typedef struct CvHistogramget
{
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,用來存儲數據。