当前位置 主页 > 网站技术 > 代码类 >

    opencv3/C++ 直方图反向投影实例

    栏目:代码类 时间:2019-12-11 21:06

    直方图反向投影:

    即取直方图中的值,按直方图面积由大到小,对其对应的像素也由大到小赋予新值。即某种灰度值在图像中所占面积越大,其对应的像素的新值就越大;反之就越小。

    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++ 直方图反向投影实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持IIS7站长之家。