OpenCV2.4版本中calcHist()的用法示例

#include <iostream>
#include <cv.h>
#include <highgui.h>
using namespace cv;
int main( int argc, char** argv )
{
    Mat src, hsv;
    src=imread("f.jpg");
    cvtColor(src, hsv, CV_BGR2HSV);
    // Quantize the hue to 30 levels
    // and the saturation to 32 levels
    int hbins = 30, sbins = 32;
    int histSize[] = {hbins, sbins};
    // hue varies from 0 to 179, see cvtColor
    float hranges[] = { 0, 180 };
    // saturation varies from 0 (black-gray-white) to
    // 255 (pure spectrum color)
    float sranges[] = { 0, 256 };
    const float *ranges[] = { hranges, sranges };
    MatND hist;
    // we compute the histogram from the 0-th and 1-st channels
    int channels[] = {0, 1};
    calcHist( &hsv, 1, channels, Mat(), // do not use mask
               hist, 2, histSize, ranges,
               true, // the histogram is uniform
               false );
    //这里查看hist直方图的长和高,可以看出rows=30,cols=32
    std::cout<<hist.rows<<std::endl;
    std::cout<<hist.cols<<std::endl;
    //下面是怎样显示直方图
    double maxVal=0;
    minMaxLoc(hist, 0, &maxVal, 0, 0);
    int scale = 10;
    Mat histImg = Mat::zeros(sbins*scale, hbins*10, CV_8UC3);
    for( int h = 0; h < hbins; h++ )
        for( int s = 0; s < sbins; s++ )
        {
            float binVal = hist.at<float>(h, s);
            int intensity = cvRound(binVal*255/maxVal);
            rectangle( histImg, Point(h*scale, s*scale),Point( (h+1)*scale - 1, (s+1)*scale - 1),
                        Scalar::all(intensity),CV_FILLED );
        }
    namedWindow( "Source", 1 );
    imshow( "Source", src );
    namedWindow( "H-S Histogram", 1 );
    imshow( "H-S Histogram", histImg );
    waitKey();
}


 hue色彩

saturation饱和度

minMaxLoc用来最小和最大的元素值以及它们各自的位置。

你可能感兴趣的:(OpenCV2.4版本中calcHist()的用法示例)