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