opencv3/C++ 直方圖反向投影實例
直方圖反向投影:
即取直方圖中的值,按直方圖面積由大到小,對其對應(yīng)的像素也由大到小賦予新值。即某種灰度值在圖像中所占面積越大,其對應(yīng)的像素的新值就越大;反之就越小。
void calcBackProject( const Mat* images, //源數(shù)組/圖像;有相同的大小和深度(CV_8U或CV_32F)。 int nimages,//源圖像的數(shù)量 const int* channels, //計算反投影的通道列表;通道數(shù)量必須與直方圖維度相匹配。 InputArray hist,//輸入直方圖。 OutputArray backProject, //目標(biāo)反向投影數(shù)組,與images[0]大小、深度相同的單通道數(shù)組。 const float** ranges,//每個維度的直方圖bin邊界數(shù)組。 double scale = 1, //輸出反向投影的可選比例因子。 bool uniform = true //直方圖是否均勻的標(biāo)志。 );
示例:
獲取測試圖像中每個像素的hue數(shù)據(jù) hi,j,并找到 hi,j 在hue直方圖中的bin的位置
#include<opencv2/opencv.hpp> using namespace cv; Mat hue; int bins = 10; void histBackprojection(int, void*); int main() { Mat src, hsv; src = imread("E:/image/image/shape.jpg"); if (src.empty()) { printf("can not load image \n"); return -1; } namedWindow("input", WINDOW_AUTOSIZE); imshow("input", src); cvtColor(src, hsv, COLOR_BGR2HSV); hue.create(hsv.size(), hsv.depth()); int ch[] = {0, 0}; //分離Hue通道:色相通道 mixChannels(&hsv, 1, &hue, 1, ch, 1); //創(chuàng)建Trackbar來輸入bin的數(shù)目 createTrackbar("bins:", "input", &bins, 255, histBackprojection); histBackprojection(0, 0); waitKey(0); return 0; } void histBackprojection(int, void*) { MatND hist, backproj; int histSize = max(bins, 2); float range[] = {0, 255}; const float *ranges = {range}; //計算直方圖 calcHist(&hue, 1, 0, Mat(), hist,1, &histSize, &ranges, true, false); //將直方圖bin的數(shù)值歸一化到0-255 normalize(hist, hist, 0, 255, NORM_MINMAX, -1, Mat()); //計算反向投影 calcBackProject(&hue, 1, 0, hist, backproj, &ranges, 1, true); namedWindow("backprogection", WINDOW_AUTOSIZE); imshow("backprogection", backproj); //顯示直方圖 int binsW = cvRound((double)500/histSize); Mat histImg = Mat::zeros(500, 500, CV_8UC3); RNG rng(123); for (int i = 0; i < bins; i++) { Scalar color = Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)); rectangle(histImg, Point(i*binsW, 500), Point((i+1)*binsW, 500 - cvRound(hist.at<float>(i) * 500 / 255.0)), color, -1); } namedWindow("histogram", WINDOW_AUTOSIZE); imshow("histogram", histImg); }
以上這篇opencv3/C++ 直方圖反向投影實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- C++利用opencv實現(xiàn)人臉檢測
- opencv3/C++圖像像素操作詳解
- opencv3/C++圖像邊緣提取方式
- opencv3/C++關(guān)于移動對象的輪廓的跟蹤詳解
- opencv3/C++實現(xiàn)霍夫圓/直線檢測
- opencv3/C++圖像濾波實現(xiàn)方式
- opencv3/C++ PHash算法圖像檢索詳解
- opencv3/C++ 平面對象識別&透視變換方式
- 基于C++實現(xiàn)kinect+opencv 獲取深度及彩色數(shù)據(jù)
- opencv3/C++視頻中疊加透明圖片的實現(xiàn)
- C++使用OpenCV實現(xiàn)證件照藍(lán)底換成白底功能(或其他顏色如紅色)詳解
相關(guān)文章
C++實現(xiàn)修改函數(shù)代碼HOOK的封裝方法
這篇文章主要介紹了C++實現(xiàn)修改函數(shù)代碼HOOK的封裝方法,有助于深入了解C++的HOOK原理,需要的朋友可以參考下2014-10-10淺析c#中如何在form的webbrowser控件中獲得鼠標(biāo)坐標(biāo)
以下是對c#中如何在form的webbrowser控件中獲得鼠標(biāo)坐標(biāo)的實現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07C語言從猜數(shù)字游戲中理解數(shù)據(jù)結(jié)構(gòu)
猜數(shù)字是興起于英國的益智類小游戲,起源于20世紀(jì)中期,一般由兩個人或多人玩,也可以由一個人和電腦玩。游戲規(guī)則為一方出數(shù)字,一方猜,今天我們來用這個游戲案例理解數(shù)據(jù)結(jié)構(gòu)2022-04-04C語言模擬實現(xiàn)strstr函數(shù)的示例代碼
strstr是C語言中的函數(shù),作用是返回字符串中首次出現(xiàn)子串的地址。本文將用C語言模擬實現(xiàn)strstr函數(shù),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-07-07C語言實現(xiàn)中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-04-04C語言用fun函數(shù)實現(xiàn)兩個數(shù)的交換方式
這篇文章主要介紹了C語言用fun函數(shù)實現(xiàn)兩個數(shù)的交換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12vscode使用cmake時將命令行參數(shù)傳遞給調(diào)試目標(biāo)的方法
這篇文章主要介紹了vscode使用cmake時將命令行參數(shù)傳遞給調(diào)試目標(biāo),下面介紹了一個示例,將參數(shù)first_arg, second-arg和third arg傳遞給程序(此處需要注意,third arg中間雖然存在空格,但是仍然被視作一個參數(shù)),需要的朋友參考下吧2024-03-03