opencv(8)直方圖操作


opencv中的直方圖弄的一點小復雜,看了好幾天還是有點不明白,尤其是后面涉及多維直方圖的時候,算了還是一步一步的重新看一下吧。

一 直方圖基本操作

1 CvHistogram

CvHistogram
thresh是一個二維數據,里面存儲每個bin的上下邊界,對於非均勻直方圖,存儲在thresh2中,直方圖的數據主要存儲在CvMatND結構中,bins中其實就是指向CvMatND中
的data數據指針,對於密集矩陣,可以通過CvMatND mat直接訪問直方圖數據
2.直方圖的創建
cvCreateHist
sizes必須為整數數組,長度等於dims的大小,每個整數表示對應維數分配的bin個數。例如dims =2, sizes = [255,255],表示2維都是255個bin。
type指定直方圖存儲的數據結構,CV_HIST_ARRAY 意味着直方圖數據表示為多維密集數組 CvMatND; CV_HIST_TREE 意味着直方圖數據表示為多維稀疏數組 CvSparseMat。
ranges是有浮點數構成,表明每個維度的統計范圍,數組個數和dims相等,也和uniform的值相關。當uniform=1時,表示直方圖是均勻的,那么rangs只用給出整個維度統計的上下限,程序會根據這個總范圍和維數決定每個bin的統計區間,例如uniform=1,dim =1 , sizes = 2 , rangs = [0,10],那么直方圖中有2個bin的統計區間分別為[0 5] , [5 10] ;另一個復雜點的例子
int dims = 2 ; 
int h_bins = 8, s_bins = 8;    
int hist_size[] = {h_bins, s_bins};  //每個維度的bin數目
float h_ranges[] = { 0, 180 };       //統計區間
float s_ranges[] = { 0, 255 };
float* ranges[] = { h_ranges, s_ranges };//兩個維度的統計區間
int  uniform = 1 ;

當uniform=0時直方圖是非均勻的,需要用數組對來表示,如果某維數里面有N個bin,需要N+1個數表示,例如,uniform=0,dim =4 , sizes = 1 ,

rangs = [0,2,4,9,10] ,對應的每個bin的統計區級為[0 2] [2 4] [4 9] [9 10] .

3 直方圖釋放

void cvReleaseHist( CvHistogram** hist );  //函數 cvReleaseHist 釋放直方圖 (頭和數據). 指向直方圖的指針被函數所清空。如果 *hist 指針已經為 NULL, 則函數不做任何事情。

void cvClearHist( CvHistogram* hist );      //函數 cvClearHist 當直方圖是稠密數組時將所有直方塊設置為 0,當直方圖是稀疏數組時,除去所有的直方塊。

 

4.訪問直方圖的函數

一種是采用函數訪問;double  cvquerhistValue_nD(CvHistogram* hist,int*idex);

對於密集直方圖可以采用直接訪問的

5.計算直方圖

void cvCalcHist( IplImage** image, CvHistogram* hist, int accumulate=0, const CvArr* mask=NULL );

image為單通道的IplImage圖像指針,多通道圖像使用splid函數分開計算即可。accumulate說明直方圖是否需要在計算前清零,如果為1則允許

cvCalcHist在一個數據采集循環中北多次調用。

6.直方圖中的最大值最小值

cvGetMinMaxHistValue

 

實例1:灰度圖像的直方圖顯示(1維直方圖,256灰度)

灰度直翻圖計算
輸出結果
1
二維直方圖

 

處理的顯示形式不是opencv例子那里的形式,這里采用R分量為X軸,B分量為Y軸,r,b中存儲的量為X Y分別為響應值的統量,如下圖,里面全部是紅色,B分量只有一點,所有直翻圖中的X軸(R分量)靠后,Y軸(B分量)很小

2 3

作者: 細雨淅淅

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM