国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

opencv學習筆記(二十六)直方圖有關的操作

2019-11-08 02:19:06
字體:
來源:轉載
供稿:網友

直方圖匹配

在分析圖像、物體和視頻信息的過程中,我們常常想把眼中看到的對字用直方圖(histogram)表示。直方圖可以用來描述各種不同的事情,如物體的色彩分布、物體邊緣梯度模板,以及表示目標位置的當前假設(目標當前位置的假設)的概率分布。直方圖廣泛應用于很多計算機視覺應用中。通過標記幀與幀之間顯著的邊緣和顏色的統計變化,直方圖被用來檢測視頻中場景的變換。通過為每個興趣點設置一個有相近特征的直方圖所構成的“標簽”,用以確定圖像中的興趣點。邊緣、色彩、角等直方圖構成了可以被傳遞給目標識別分類器的一個通用特征類型。色彩和邊緣的直方圖序列還可以用來識別網絡視頻是否被復制等。直方圖是計算機視覺中最經典的工具之一。 簡單地說,直方圖就是對數據進行統計,將統計值組織到一系列事先定義好的bin中。bin中的數值是從數據中計算出的特征的統計量,這些數據可以是諸如梯度、方向、色彩或任何其他特征。無論如何,直方圖獲得的是數據分布的統計圖。通常直方圖的維數要低于原始數據。

bin

“組距”的意思。 例如:計算顏色直方圖需要將顏色空間劃分為若干小的顏色區間,即直方圖的bin,通過計算顏色在每個小區間內德像素得到顏色直方圖,bin越多,直方圖對顏色的分辨率越強,但增加了計算機的負擔。

直方圖的基本數據結構

首先直接查看CvHistogram的數據結構。

typedef struct CvHistogram{ int type; CvArr* bins; float thresh[CV-MAX-DIM][2]; for uniform histograms float** thresh2; for nonuniform histograms CvMatND mat; embedded matrix header for array histograms}CvHistogram;

這個定義看起來很簡單但并非如此,因為直方圖的很多內部數據都被存儲于CvMatND結構中。我們用下面的程序創建一個新的直方圖:

創建直方圖cvCreateHist()

定義: CvHistogram* cvCreateHist( int dims, int* sizes, int type, float** ranges=NULL, int uniform=1 ); 參數: dims 直方圖維數的數目 sizes 直方圖維數尺寸的數組 自己的理解: 比如創建一維直方圖,你設置size是256,就代表直方圖橫坐標是這個值。假如你的range是0~255,那么每組分到的寬度是1;假如size設置成256*2,那么假如你的range是0~255,那么每組分到的寬度是2。反正,設置的越大每組的寬度就越大。 type 直方圖的表示格式: CV_HIST_ARRAY 意味著直方圖數據表示為多維密集數組 CvMatND; CV_HIST_TREE 意味著直方圖數據表示為多維稀疏數組CvSparseMat.

ranges 圖中方塊范圍的數組。它的內容取決于參數 uniform 的值。這個范圍的用處是確定何時計算直方圖或決定反向映射(backPRojected ),每個方塊對應于輸入圖像的哪個/哪組值。 uniform 歸一化標識 按照我自己的理解就是: 如果不為0,bin均勻;為0,看ranges怎么設置。

cvSetHistBinRanges()

作用:在使用直方圖之前給rangs設置數值。 定義: void cvSetHistBinRanges( CvHistogram* hist, float** ranges, int uniform=1 ); 參數: cvSetHistRanges()中的變量與cvCreateHist()中的相應變量完全一致。如果想重用直方圖,可以對其進行清零操作(即設置所有bins為0),或者使用通常的釋放函數釋放直方圖。

直方圖清零cvClearHist()

void cvClearHist( CvHistogram* hist );

釋放直方圖cvReleaseHist()

void cvReleaseHist( CvHistogram**hist ); 通常,這些釋放函數通過一個指針被調用,該指針指向一個直方圖的指針,后者取自創建直方圖的函數。一旦直方圖被釋放,直方圖指針便被設置為NULL。

從數組中創建直方圖cvMakeHistHeaderForArray()

定義: CvHistogram* cvMakeHistHeaderForArray( int dims, int* sizes, CvHistogram* hist, float* data, float** ranges=NULL, int uniform=1 ); 參數: hist是指向CvHistogram數據結構的指針; data用來存儲直方塊的數組。是指向存儲直方圖bins的大小為sizes[0]sizes[1]…*sizes[dim-1]的區域的指針。注意,data是浮點數指針,因為直方圖的內部數據類型描述永遠是浮點數。返回值與我們輸入的hist值一樣。 與cvCreateHist()程序不同,沒有type變量。所有由cvMakeHistHeaderForArray()創建的直方圖都是密集直方圖。 最后一點:由于(假設)為直方圖的bins分配了數據存儲空間,則沒有理由為CvHistogram結構再次調用cvReleaseHist()。你只需要清除頭結構(如果沒有在堆棧中分配它),當然,也要清除你自己創建的數據;但是,由于這些變量是你自己定義的,你應該用自己的方式處理它們。 就是說: 函數 cvMakeHistHeaderForArray 初始化直方圖,其中頭和直方塊為用戶所分配以后不需要調用 cvReleaseHist。

查詢直方塊的值cvQueryHistValue_1D~ND()

double cvQueryHistValue_1D( CvHistogram* hist, int idx0 ); double cvQueryHistValue_2D( CvHistogram* hist, int idx0, int idx1 ); double cvQueryHistValue_3D( CvHistogram* hist, int idx0, int idx1, int idx2 ); double cvQueryHistValue_nD( CvHistogram* hist, int idxN );

返回直方塊的指針cvGetHistValue_1D~ND()

每個函數都返回相應bin中的值的浮點數。同樣地,可以利用函數返回的bin的指針(不是bin的值)來設置(或者獲得)直方圖的bin的值。 float* cvGetHistValue_1D( CvHistogram* hist, int idx0 ); float* cvGetHistValue_2D( CvHistogram* hist, int idx0, int idx1 ); float* cvGetHistValue_3D( CvHistogram* hist, int idx0, int idx1, int idx2 ); float* cvGetHistValue_nD( CvHistogram* hist, int idxN ); 這些函數與cvGetReal D和cvPtr*D等系列函數非常相似,事實上,它們幾乎相同。在函數里傳入的矩陣hist->bins被調用的方式本質上與其被直接的矩陣訪問模式是一樣的。類似地,稀疏直方圖函數繼承了它所對應的稀疏矩陣函數的一些行為。在稀疏直方圖中,如果想利用函數GetHist()來訪問不存在的bin,這個不存在的bin會被自動創建,并且其值被設為0。 注意,函數QueryHist*()不會創建不存在的bin。

歸一化直方圖cvNormalizeHist()

cvNormalizeHist(CvHistogram* hist,double factor); factor——歸一化因子; 這里的hist表示直方圖,factor表示直方圖歸一化后的數值(通常情況下設為1)。注意,factor是一個double類型的數據,盡管函數CvHistogram( )的內部數據類型通常都是float——這進一步說明了OpenCV是一個不斷改進的項目! 函數 cvNormalizeHist 通過縮放來歸一化直方塊,使得所有塊的和等于 factor。

對直方圖取閾值cvThreshHist()

cvThreshHist(CvHistogram* hist,double factor); 作用: 函數 cvThreshHist 清除那些小于指定閾值的直方塊。 書上的說法: 變量factor是一個開關閾值。進行直方圖閾值化處理之后,小于給定閾值的各個bin的值都被設為0。回憶圖像閾值函數cvThreshold(),直方圖閾值函數與參數threshold_type設置為CV_THRESH_ TOZERO的圖像閾值函數類似。不幸的是,沒有方便的直方圖閾值函數來提供其他threshold類型的類似操作。然而,實際上函數cvThreshHist()或許是最常用的函數,因為我們在使用實數類型數據的時候常常將包含極少數據點的bin去除掉。這些bins通常是噪聲,因此將這些bins的值設為0。

拷貝直方圖cvCopyHist()

表示將一個直方圖的信息復制到另一個直方圖。 void cvCopyHist(const CvHistogram* src, CvHistogram** dst); 函數 cvCopyHist 對直方圖作拷貝。如果第二個直方圖指針 *dst 是 NULL, 則創建一個與 src 同樣大小的直方圖。否則,兩個直方圖必須大小和類型一致。然后函數將輸入的直方塊的值復制到輸出的直方圖中,并且設置取值范圍與 src 的一致。

直方圖中最小值和最大值cvGetMinMaxHistValue()

定義: void cvGetMinMaxHistValue( const CvHistogram* hist, float* min_value,//直方圖最小值的指針 float* max_value,//直方圖最大值的指針 int* min_idx=NULL,//數組中最小坐標的指針 int* max_idx=NULL//數組中最大坐標的指針 ); 函數 cvGetMinMaxHistValue 發現最大和最小直方塊以及它們的位置。任何輸出變量都是可選的。在具有同樣值幾個極值中,返回具有最小下標索引(以字母排列順序定)的那一個。

計算圖像( Image )的直方圖cvCalHist()

對于多通道圖像(如HSV或RGB),在調用函數cvCalcHist()之前,先要用函數cvSplit ( )將圖像分為單通道的。這誠然有點痛苦,但是應該考慮到多個圖像通道很常見,它們常常包含一個圖像的不同過濾形態,如梯度通道、YUV中的U或V通道。可以想像,如果試圖處理包含多通道的多個圖像,情形將有多么混亂(需要確定誰在哪兒用這些圖像的哪個通道)。為了避免這種混淆,所有傳遞給cvCa1Hist()的圖像都被假設(或被要求)為單通道圖像。 void cvCalcHist( iplImage** image, CvHistogram* hist, int accumulate=0, const CvArr* mask=NULL ); 參數: image 輸入圖像(雖然也可以使用 CvMat** ). hist 直方圖指針 accumulate 累計標識。如果非0,則直方圖在開始時不被清零。這個特征保證可以為多個圖像計算一個單獨的直方圖,或者在線更新直方圖。此外,它允許被cvCalHist()在一個數據采集循環中被多次調用。 mask 是一個可選的布爾變量,如果被設為非NULL,則只有與mask非0元素對應的像素點會被包含在計算直方圖中。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 虹口区| 巴中市| 通州区| 榆树市| 泽普县| 万全县| 田林县| 桦甸市| 宝丰县| 文山县| 吉木萨尔县| 香港 | 金塔县| 安徽省| 全椒县| 荥阳市| 罗江县| 云梦县| 靖江市| 嘉义市| 治县。| 扎赉特旗| 紫阳县| 西丰县| 无锡市| 正蓝旗| 宁南县| 五大连池市| 石嘴山市| 常山县| 扎兰屯市| 叙永县| 秭归县| 乐业县| 郎溪县| 航空| 兴隆县| 睢宁县| 灌南县| 石嘴山市| 卓尼县|