【計算機視覺】OpenCV中直方圖處理函數(shù)簡述

計算直方圖calcHist

直方圖是對數(shù)據(jù)集合的統(tǒng)計 ,并將統(tǒng)計結(jié)果分布于一系列預定義的bins中淮蜈。這里的數(shù)據(jù)不僅僅指的是灰度值 哺窄,統(tǒng)計數(shù)據(jù)可能是任何能有效描述圖像的特征。
假設(shè)有一個矩陣包含一張圖像的信息 (灰度值 0-255):


gray
gray

既然已知數(shù)字的范圍包含256個值, 我們可以將這個范圍分割成子區(qū)域(稱作 bins)到腥,如:


bins
bins

然后再統(tǒng)計掉入每一個bin_{i}的像素數(shù)目朵逝。采用這一方法來統(tǒng)計上面的數(shù)字矩陣,我們可以得到下圖( x軸表示 bin乡范, y軸表示各個bin中的像素個數(shù))配名。
hist1
hist1

直方圖可以統(tǒng)計的不僅僅是顏色灰度,它可以統(tǒng)計任何圖像特征(如梯度,方向等等)晋辆。

直方圖具體細節(jié)

dims: 需要統(tǒng)計的特征的數(shù)目渠脉,在上例中,dims = 1因為我們僅僅統(tǒng)計了灰度值(灰度圖像)
bins: 每個特征空間子區(qū)段的數(shù)目瓶佳,在上例中芋膘,bins = 16
range: 每個特征空間的取值范圍,在上例中霸饲,range = [0,255]

OpenCV的直方圖計算

OpenCV提供了一個簡單的計算數(shù)組集(通常是圖像或分割后的通道)的直方圖函數(shù)calcHist为朋。支持高達32維的直方圖。

void calcHist(
const Mat* arrays,          // 圖像源數(shù)組厚脉,同樣深度(CV_8U or CV_32F)习寸,同樣大小
int narrays,                // 圖片個數(shù)
const int* channels,        // 通道
InputArray mask,            // 掩碼圖像
OutputArray hist,           // 返回的直方圖
int dims,                   // 直方圖的維數(shù)
const int* histSize,        // 每一維上直方圖的個數(shù)
const float** ranges,       // 像素值的范圍
bool uniform=true, 
bool accumulate=false );

說明:

channels - 用來計算直方圖的channels的數(shù)組
mask - 掩碼。如果mask不為空傻工,那么它必須是一個8位(CV_8U)的數(shù)組霞溪,并且它的大小的和arrays[i]的大小相同,值為1的點將用來計算
dim - 直方圖的維數(shù)精钮。必須為正威鹿,并且不大于CV_MAX_DIMS(當前的OpenCV版本中為32,即最大可以統(tǒng)計32維的直方圖)
histSize - 在每一維上直方圖的個數(shù)轨香。簡單把直方圖看作一個一個的豎條的話忽你,就是每一維上豎條的個數(shù)
ranges - 用來進行統(tǒng)計的范圍

反投影直方圖

反向投影是一種記錄給定圖像中的像素點如何適應直方圖模型像素分布的方式。
簡單的講臂容,所謂反向投影就是首先計算某一特征的直方圖模型科雳,然后使用模型去尋找圖像中存在的該特征。

void calcBackProject(
const Mat* arrays, 
int narrays, 
const int* channels, 
InputArray hist, 
OutputArray backProject, 
const float** ranges, 
double scale=1, bool uniform=true );

hist - 輸入直方圖
backProject - 反投影向量脓杉,這是一個單通道的向量糟秘,和arrays[0]具有相同的大小和深度

下面使用膚色直方圖為例來解釋反向投影的工作原理:
使用模型直方圖(代表手掌的皮膚色調(diào))來檢測測試圖像中的皮膚區(qū)域,

  • 對測試圖像中的每個像素 ( p(i,j) ),獲取色調(diào)數(shù)據(jù)并找到該色調(diào)( h(i,j), s(i,j) )在直方圖中的bin的位置
  • 查詢 模型直方圖 中對應的bin( h(i,j), s(i,j) )并讀取該bin的數(shù)值
  • 將此數(shù)值儲存在新的圖像中(BackProjection)球散。 你也可以先歸一化 模型直方圖 ,這樣測試圖像的輸出就可以在屏幕顯示了
  • 通過對測試圖像中的每個像素采用以上步驟尿赚, 得到 BackProjection 結(jié)果圖


    backProjection
    backProjection
  • 使用統(tǒng)計學的語言, BackProjection 中儲存的數(shù)值代表了測試圖像中該像素屬于皮膚區(qū)域的概率。比如以上圖為例, 亮起的區(qū)域是皮膚區(qū)域的概率更大(事實確實如此),而更暗的區(qū)域則表示更低的概率

閾值化

閾值是最簡單的圖像分割的方法凌净。
應用舉例:從一副圖像中利用閾值分割出我們需要的物體部分(當然這里的物體可以是一部分或者整體)悲龟。這樣的圖像分割方法是基于圖像中物體與背景之間的灰度差異,而且此分割屬于像素級的分割冰寻。
為了從一副圖像中提取出我們需要的部分须教,應該用圖像中的每一個像素點的灰度值與選取的閾值進行比較,并作出相應的判斷斩芭。(注意:閾值的選取依賴于具體的問題轻腺。即:物體在不同的圖像中有可能會有不同的灰度值。)
一旦找到了需要分割的物體的像素點划乖,我們可以對這些像素點設(shè)定一些特定的值來表示贬养。(例如:可以將該物體的像素點的灰度值設(shè)定為:‘0’(黑色),其他的像素點的灰度值為:‘255’(白色);當然像素點的灰度值可以任意琴庵,但最好設(shè)定的兩種顏色對比度較強煤蚌,方便觀察結(jié)果)。


Threshold_Example
Threshold_Example

閾值類型

Threshold Type 1
Threshold Type 1

Threshold Type 2
Threshold Type 2

Threshold Type 3
Threshold Type 3

Threshold Type 4
Threshold Type 4

Threshold Type 5
Threshold Type 5

閾值A(chǔ)PI

double threshold(
InputArray src, 
OutputArray dst, 
double thresh, 
double maxVal, 
int thresholdType);

均值漂移(Mean Shift)算法函數(shù)

該函數(shù)利用了迭代物體搜索算法细卧,它要以一個物體的反射直方圖(back projection)和初始位置作為輸入。
搜索窗口的重心向反射直方圖的質(zhì)心(mass center)移動筒占,該過程不斷的重復贪庙,直到達到了迭代的次數(shù)(criteria.maxCount),或者窗口中心小于一個閾值(criteria.epsilon)翰苫。

int meanShift(
InputArray probImage,       // Back projection of the object histogram
Rect& window,               // Initial search window
TermCriteria criteria       // Stop criteria for the iterative search algorithm.
);

Camshift算法函數(shù)

該函數(shù)首先利用meanShift()函數(shù)找到物體的中心止邮,然后調(diào)整窗口的大小并找到最優(yōu)的旋轉(zhuǎn)角度。該函數(shù)返回一個rotated rectangle數(shù)據(jù)結(jié)構(gòu)(包含物體的位置奏窑,大小和旋轉(zhuǎn)角度)导披。下一次搜索窗口的位置可以通過RotatedRect::boundingRect()得到。

RotatedRect CamShift(
InputArray probImage,       // Back projection of the object histogram
Rect& window,               // Initial search window
TermCriteria criteria       // Stop criteria for the underlying meanShift()
);

TermCriteria模板類

該類是作為迭代算法的終止條件使用的埃唯,其構(gòu)造函數(shù)需要三個參數(shù):一個是類型撩匕,第二個參數(shù)為迭代的最大次數(shù),最后一個是特定的閾值墨叛。

TermCriteria(int type, int maxCount, double epsilon);

類型有CV_TERMCRIT_ITER止毕、CV_TERMCRIT_EPS、CV_TERMCRIT_ITER+CV_TERMCRIT_EPS漠趁,分別代表著迭代終止條件為達到最大迭代次數(shù)終止扁凛,迭代到閾值終止,或者兩者都作為迭代終止條件闯传。

參考資料

OpenCV Histograms API文檔
直方圖之calcHist使用
直方圖之calcHist使用(補)
OpenCV 教程 imgproc模塊
反向投影
閾值操作

轉(zhuǎn)載請注明作者Jason Ding及其出處
Github主頁(http://jasonding1354.github.io/)
CSDN博客(http://blog.csdn.net/jasonding1354)
簡書主頁(http://www.reibang.com/users/2bd9b48f6ea8/latest_articles)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谨朝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌字币,老刑警劉巖则披,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纬朝,居然都是意外死亡收叶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門共苛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來判没,“玉大人,你說我怎么就攤上這事隅茎〕畏澹” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵辟犀,是天一觀的道長俏竞。 經(jīng)常有香客問我,道長堂竟,這世上最難降的妖魔是什么魂毁? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮出嘹,結(jié)果婚禮上席楚,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布澈缺。 她就那樣靜靜地躺著,像睡著了一般只祠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扰肌,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天抛寝,我揣著相機與錄音,去河邊找鬼狡耻。 笑死墩剖,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的夷狰。 我是一名探鬼主播岭皂,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沼头!你這毒婦竟也來了爷绘?” 一聲冷哼從身側(cè)響起书劝,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎土至,沒想到半個月后购对,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡陶因,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年骡苞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片楷扬。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡解幽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烘苹,到底是詐尸還是另有隱情躲株,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布镣衡,位于F島的核電站霜定,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏廊鸥。R本人自食惡果不足惜望浩,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惰说。 院中可真熱鬧曾雕,春花似錦、人聲如沸助被。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揩环。三九已至,卻和暖如春幅虑,著一層夾襖步出監(jiān)牢的瞬間丰滑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工倒庵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留褒墨,地道東北人。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓擎宝,卻偏偏與公主長得像郁妈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子绍申,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容