灰度直方圖是數字圖像中最簡單且有用的工具,這一篇主要總結OpenCV中直方圖CvHistogram的結構和應用。
OpenCV生成圖像直方圖 實驗代碼下載:
免費下載地址在 http://linux.linuxidc.com/
用戶名與密碼都是www.linuxidc.com
具體下載目錄在 /2013年資料/10月/20日/OpenCV 數字圖像灰度直方圖
下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm
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