OpenCV3.4.0學習筆記(六)——統計直方圖

本篇博文用於記錄 OpenCV 庫提供的直方圖統計功能,並給出圖像灰度直方圖提取與灰度均衡兩個簡例。

直方圖統計

先對直方圖概念進行闡述。

最常見的直方圖爲灰度直方圖:對給定的灰度圖像進行統計,自變量爲灰度x(x取值0-255),因變量爲灰度爲x的像素個數。

更廣義地,直方圖本質是一種統計操作。給定元素集 S ,每一元素都有 channels 個屬性。直方圖統計操作爲:以元素屬性的可能取值爲自變量x(x可以是多個維度構成的屬性向量),統計具有屬性x的元素個數。

以下介紹 OpenCV 提供的計算直方圖的函數: cv::calcHist()

void calcHist( const Mat* images,  //樣本集S,爲多個相同size的Mat構成的數組。
	//其中每一像素爲一個元素,具有channals個屬性。
	//images中不同的Mat中相同位置的元素按channals進行拼接,形成一個元素。
	int nimages, //images數組長度(統計幾個image)
	const int* channels,  //需要用作統計自變量的屬性維度下標索引(如{0,1}即以第0,1兩維度屬性值爲自變量)
	InputArray mask,  //掩膜,用於指定只統計特定區域的元素,若爲空(cv::Mat())時,統計全部像素元素
	OutputArray hist,  //統計直方圖輸出,爲通道數1的dims維Mat數據,彙總了給定對應屬性下的元素個數
	int dims,  //統計直方圖維度,與channels數組長度相同
	const int* histSize, //histSize[i]爲第i統計維度區分間隔數量(自變量可取離散值數量,也稱bins數量)
	const float** ranges, //ranges[i]數組給定了第i統計維度bins的劃分情況,若爲均勻劃分,則只需給出首尾
	bool uniform = true,  //bins是否均勻分佈的標誌位,若爲true,則ranges數組只需給出統計範圍首尾
	bool accumulate = false  //hist是否累加(控制hist需不需要清零)
	);

以下給出一個直方圖統計應用案例。

//lena圖爲rgb三色圖,即每一像素視爲一個元素,
//每一元素具有rgb三個屬性
cv::Mat srcImg =  cv::imread("lena.jpg"); 
//統計lena圖的第1,2兩個維度
int histDim[] = { 1, 2 }; 
//兩個統計維度的bins區分數量,第一維度和第二維度都是劃分爲4個區間
int histSize[] = { 4, 4 };
//給出兩個統計維度取值範圍劃分情況,由於使用均勻劃分,這裏只需要給出首尾
float range1[] = { 0, 256 };
float range2[] = { 0, 256 };
float* ranges[2];
ranges[0] = range1;
ranges[1] = range2;
//最後生成的統計直方圖
cv::Mat hist;
//注意第一個參數爲&srcImg,只統計一張圖,所以直接取圖的首地址,給定mask爲空,統計全圖。
cv::calcHist(&srcImg, 1, histDim, cv::Mat(), hist, 2, histSize, (const float**)ranges, true);

灰度圖像直方圖提取

這裏給出灰度直方圖的統計代碼作爲實例。

cv::Mat srcImg =  cv::imread("lena.jpg"); 
cv::Mat grayImg;
cv::cvtColor(srcImg, grayImg, cv::ColorConversionCodes::COLOR_BGR2GRAY);
//統計lena對應灰度圖,僅灰度這一屬性
int histDim[] = { 0 }; 
//灰度bins區分數量
int histSize[] = { 256 };
//使用均勻劃分,這裏只需要給出首尾
float range[] = { 0, 256 };
float* ranges[1];
ranges[0] = range;
//最後生成的統計直方圖
cv::Mat hist;
//注意第一個參數爲&srcImg,只統計一張圖,所以直接取圖的首地址,給定mask爲空,統計全圖。
cv::calcHist(&grayImg, 1, histDim, cv::Mat(), hist, 1, histSize, (const float**)ranges, true);

灰度均衡

OpenCV 提供了直接,簡便的灰度均衡函數 cv::equalizeHist()

void equalizeHist( InputArray src,  //輸入灰度圖像
	OutputArray dst //均衡後輸出灰度圖像
	);

尾註以上闡述爲學習過程筆記,如有錯誤,敬請指正。

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