1.主要內容
- 直方圖概念
- API學習
- 代碼演示
2.直方圖概念
- 基本介紹
假設有圖像數據8x8,像素值範圍0~14共15個灰度等級,統計得到各個等級出現次數及直方圖如下圖所示,每個紫色的長條叫BIN(值的範圍大小)。
將bins劃分爲16個等級,每個等級有16位
- 上述直方圖概念是基於圖像像素值,其實對圖像梯度、每個像素的角度、等一切圖像的屬性值,我們都可以建立直方圖。這個纔是直方圖的概念真正意義,不過是基於圖像像素灰度直方圖是最常見的。
直方圖最常見的幾個屬性:
dims:表示維度,對灰度圖像來說只有一個通道
bins:表示維度中子區域大小劃分,bins=256,劃分爲256個級別
range:表示值的範圍,灰度值範圍在【0-255】之間(轉換到HSV空間時,H【0-300】S【0-180】)
3.API學習
split(//把多通道圖像分爲多個單通道圖像
const Mat &src,//輸入圖像
Mat* mvbegin//輸出的通道圖像數組
)
calcHist(
const Mat* images,//輸入圖像指針
int images,//圖像數目
const int* channels,//通道數
InputArray mask,//輸入mask,可選,不用,沒有的話直接寫Mat()。表示空的
OutputArray hist,//輸出的直方圖數據
int dims,//維數
const int* histsize,//直方圖級數
const float** ranges,//值域範圍
bool uniform,//true by default
bool accumulate//false by default
)
void normalize(
InputArray src,//src 輸入數組
OutputArray dst, //dst 輸出數組,支持原地運算
double alpha=1,// range normalization模式的最小值
doublebeta=0, //range normalization模式的最大值,不用於norm normalization(範數歸一化)模式。
int norm_type=NORM_L2,
/* 歸一化的類型,可以有以下的取值:
NORM_MINMAX:數組的數值被平移或縮放到一個指定的範圍,線性歸一化,一般較常用。
NORM_INF: 此類型的定義沒有查到,根據OpenCV 1的對應項,可能是歸一化數組的C-範數(絕對值的最大值)
NORM_L1 : 歸一化數組的L1-範數(絕對值的和)
NORM_L2: 歸一化數組的(歐幾里德)L2-範數
*/
int dtype =-1, // dtype爲負數時,輸出數組的type與輸入數組的type相同;否則,輸出數組與輸入數組只是通道數相同,而tpye=CV_MAT_DEPTH(dtype).
InputArray mask=noArray() //操作掩膜,用於指示函數是否僅僅對指定的元素進行操作。
)
4.代碼演示
5.舉例
通過上述代碼來的出下列的RGB三通道的直方圖,有時可以用來計算閾值,較容易得出參數
6.課外擴展
OpenCV探索之路(十四):繪製點、直線、幾何圖形
OpenCV2中矩陣的歸一化 normalize函數詳解
【雜談opencv】OpenCV中的cvRound()、cvFloor()、 cvCeil()函數講解