歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> OpenCV 數字圖像灰度直方圖

OpenCV 數字圖像灰度直方圖

日期:2017/3/1 9:51:57   编辑:Linux編程

灰度直方圖是數字圖像中最簡單且有用的工具,這一篇主要總結OpenCV中直方圖CvHistogram的結構和應用。

灰度直方圖的定義

灰度直方圖是灰度級的函數,描述圖像中該灰度級的像素個數(或該灰度級像素出現的頻率):其橫坐標是灰度級,縱坐標表示圖像中該灰度級出現的個數(頻率)。 一維直方圖的結構表示為 高維直方圖可以理解為圖像在每個維度上灰度級分布的直方圖。常見的是二維直方圖。如紅-藍直方圖的兩個分量分別表示紅光圖像的灰度值和藍光圖像灰度值的函數。其圖像坐標(Dr,Db)處對應在紅光圖像中具有灰度級Dr同時在藍光圖像中具有灰度級Db的像素個數。這是基於多光譜——每個像素有多個變量——的數字圖像,二維中對應每個像素統計個變量。

OpenCV生成圖像直方圖 實驗代碼下載:

免費下載地址在 http://linux.linuxidc.com/

用戶名與密碼都是www.linuxidc.com

具體下載目錄在 /2013年資料/10月/20日/OpenCV 數字圖像灰度直方圖

下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm

OpenCV中的直方圖CvHistogram

注意我們在上面理解直方圖的意義時更多把他想象成一幅“圖”,繼而理解圖中橫坐標,縱坐標的意義。而在OpenCV中,應該更多把直方圖看做“數據結構”來理解。 OpenCV中用CvHistogram表示多維直方圖(http://www.opencv.org.cn/index.php/Cv%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86#CvHistogram):

typedef struct CvHistogram
{
int type;
CvArr* bins; //存放每個灰度級數目的數組指針
float thresh[CV_MAX_DIM][2]; //均勻直方圖
float** thresh2; //非均勻直方圖
CvMatND mat; //直方圖數組的內部數據結構
}
CvHistogram;

這個結構看起來簡單(比IplImage*元素少多了。。。)其實並不太好理解。

第一個成員type用來指定第二個成員bins的類型。OpenCv中常見到CvArr*的接口,可以用以指定諸如CvMat、CvMatND、IplImage的類型,其實CvArr*的是一個指向void的指針。在函數內部有時需要得到確切的指向類型,這就需要type來指定。 thresh用來指定統計直方圖分布的上下界。比如[0 255]表示用來統計圖像中像素分別在灰度級[0 255]區間的分布情況,CV_MAX_DIM對應直方圖的維數,假如設定二維紅-藍直方圖的thresh為[0 255;100 200],就是分別統計紅色圖像灰度級在[0 255]以及藍色圖像在灰度級[100 200]的分布情況。 thresh用以指定均勻直方圖的分布,我們按每個像素理解自然是“均勻分布”,其實也可以統計像素在幾個區間的分布。如果統計像素在2個區間的分布,則對應[0 255]的上下界,均勻分布統計的區間即[0 127] [127 255]分布的概率,這也是為什麼thresh第二個維數默認為2——會自動均分上下界;而thresh2指定非均勻的分布,這就需要指定每個區間的上下界,如果要統計直方圖在區間(0,10,100,255)的分布,那需要指定thresh2的一個維度為[0 10 100 255],所以用float**形式表示。 mat簡單說就是存儲了直方圖的信息,即我們統計的直方圖分布概率。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2013-10/91707p2.htm

Copyright © Linux教程網 All Rights Reserved