直方图反向投影:
即取直方图中的值,按直方图面积由大到小,对其对应的像素也由大到小赋予新值。即某种灰度值在图像中所占面积越大,其对应的像素的新值就越大;反之就越小。
- void calcBackProject(
- const Mat* images, //源数组/图像;有相同的大小和深度(CV_8U或CV_32F)。
- int nimages,//源图像的数量
- const int* channels, //计算反投影的通道列表;通道数量必须与直方图维度相匹配。
- InputArray hist,//输入直方图。
- OutputArray backProject, //目标反向投影数组,与images[0]大小、深度相同的单通道数组。
- const float** ranges,//每个维度的直方图bin边界数组。
- double scale = 1, //输出反向投影的可选比例因子。
- bool uniform = true //直方图是否均匀的标志。
- );
示例:
获取测试图像中每个像素的hue数据 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);
- //创建Trackbar来输入bin的数目
- 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的数值归一化到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++ 直方图反向投影实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。
原文链接:https://blog.csdn.net/akadiao/article/details/79007043