本章中我們學習一下通過backproject直方圖,得到一副圖像中每個像素屬于該直方圖的機率。在下邊原始圖中(左圖),我們框選了一塊四邊形的區域,計算該區域的灰階直方圖,然後通過下面的函數calcBackProject,計算圖像src中每個像素在直方圖中的機率,最終的結果在result中,result中每個像素表示該像素在直方圖中的機率,我們對得到的結果進行二值化,就得到下邊右圖的結果。
我們框選了一塊白雲區域,但從背投影結果中,海浪的邊緣在直方圖中的機率也很高,這是因為它們的灰階比較相似,如果我們隻想白雲的位置,最好使用三通道的直方圖,然後背投影。
cv::calcBackProject(&src,
1, // 一副圖像
channels, // 使用的channel
hist, // backprojecting的直方圖
result, // 結果圖像
ranges, //像素值範圍
255.0 //縮放因子
);
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuIWM4MTOwYTMwATNygTO2Q2MlBDMlJjY4MTYlZWZ0EmZfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
完整的代碼:
程式代碼:工程FirstOpenCV20
下面的程式中,使用BGR三通道直方圖,注意我們框選的範圍包括藍天,也包括白雲,之是以包括藍天白雲,是因為這樣可以剔除海水邊緣白色,我們還對原始圖像進行了減色處理。
程式代碼:工程FirstOpenCV21