cvCalcHist和calcHist的区别

difference between cvCalcHist and calcHist

本文关键字:区别 calcHist cvCalcHist      更新时间:2023-10-16

我试图理解cvCalcHist之间的区别,openCV c versioncalcHist中计算图像直方图的方法,openCV c++ version中计算图像直方图的方法。

openCV c version code:

    // load the color image
    IplImage* im = cvLoadImage("2.png");
    // get the color histogram
    IplImage* im32f = cvCreateImage(cvGetSize(im), IPL_DEPTH_32F, 3);
    cvConvertScale(im, im32f);
    int histSize[] = {32, 32, 32};
    float rgbRange[] = {0, 256};
    float* ranges[] = {rgbRange, rgbRange, rgbRange};
    CvHistogram* hist = cvCreateHist(3, histSize, CV_HIST_ARRAY, ranges);
    IplImage* b = cvCreateImage(cvGetSize(im32f), IPL_DEPTH_32F, 1);
    IplImage* g = cvCreateImage(cvGetSize(im32f), IPL_DEPTH_32F, 1);
    IplImage* r = cvCreateImage(cvGetSize(im32f), IPL_DEPTH_32F, 1);
    cvSplit(im32f, b, g, r, NULL);
    IplImage* planes[] = {b, g, r};
    cvCalcHist(planes, hist);
    // find min and max values of histogram bins
    float minval, maxval;
    cvGetMinMaxHistValue(hist, &minval, &maxval);
    cout << "Min : " << minval << " / Max : " << maxval << endl;
    //OUTPUT: Min : 0 / Max : 177617 

openCV c++ version code:

    const int channels[] = {0, 1, 2};
    const int histSize[] = {32, 32, 32};
    const float rgbRange[] = {0, 256};
    const float* ranges[] = {rgbRange, rgbRange, rgbRange};
    Mat im = imread("2.png",IMREAD_COLOR);
    MatND hist;
    Mat im32fc3, backpr32f(im.cols, im.rows, CV_32F), backpr8u(im.cols, im.rows, CV_8U), backprBw;
    im.convertTo(im32fc3, CV_32F);
    // compute histogram, scale it to 0-255 range and backproject
    calcHist( &im32fc3, 1, channels, Mat(), hist, 1, histSize, ranges, true, false);
    // find min and max values of histogram bins
    double minval, maxval;
    cv::minMaxIdx(hist, &minval, &maxval);
    cout << "Min : " << minval << " / Max : " << maxval << endl;
    //OUTPUT: Min : 455 / Max : 476732

正如您在上面代码部分的//OUTPUT注释中看到的那样,我认为我应该得到相同结果的2段代码之间的值不同。有什么线索吗?

既然你是在B,G,R中创建3D直方图,你需要告诉calcHist正确的维度数:3。所以基本上你需要从:

calcHist( &im32fc3, 1, channels, Mat(), hist, 1, histSize, ranges, true, false);
//                                            ^
//                                       one dimension

与正确的维度数:

calcHist( &im32fc3, 1, channels, Mat(), hist, 3, histSize, ranges, true, false);
//                                            ^
//                                       three dimensions