• 【Opencv】直方图函数 calchist()


    calchist函数需要包含头文件

    #include <opencv2/imgproc/imgproc.hpp>

    函数声明(三个重载 calchist函数):

    //! computes the joint dense histogram for a set of images.
    CV_EXPORTS void calcHist( const Mat* images, int nimages,
                              const int* channels, InputArray mask,
                              OutputArray hist, int dims, const int* histSize,
                              const float** ranges, bool uniform=true, bool accumulate=false );
    
    //! computes the joint sparse histogram for a set of images.
    CV_EXPORTS void calcHist( const Mat* images, int nimages,
                              const int* channels, InputArray mask,
                              SparseMat& hist, int dims,
                              const int* histSize, const float** ranges,
                              bool uniform=true, bool accumulate=false );
    
    CV_EXPORTS_W void calcHist( InputArrayOfArrays images,
                                const vector<int>& channels,
                                InputArray mask, OutputArray hist,
                                const vector<int>& histSize,
                                const vector<float>& ranges,
                                bool accumulate=false );
    

    官方文档:

    The functions calcHist calculate the histogram of one or more arrays. The elements of a tuple used to increment a histogram bin are taken from the corresponding input arrays at the same location. The sample below shows how to compute a 2D Hue-Saturation histogram for a color image.

    Parameters:
    • images – Source arrays. They all should have the same depth, CV_8U or CV_32F , and the same size. Each of them can have an arbitrary number of channels.
    • nimages – Number of source images.
    • channels – List of the dims channels used to compute the histogram. The first array channels are numerated from 0 to images[0].channels()-1 , the second array channels are counted from images[0].channels() to images[0].channels() images[1].channels()-1, and so on.
    • mask – Optional mask. If the matrix is not empty, it must be an 8-bit array of the same size as images[i] . The non-zero mask elements mark the array elements counted in the histogram.
    • hist – Output histogram, which is a dense or sparse dims -dimensional array.
    • dims – Histogram dimensionality that must be positive and not greater than CV_MAX_DIMS (equal to 32 in the current OpenCV version).
    • histSize – Array of histogram sizes in each dimension.
    • ranges – Array of the dims arrays of the histogram bin boundaries in each dimension. When the histogram is uniform ( uniform =true), then for each dimension i it is enough to specify the lower (inclusive) boundary L_0 of the 0-th histogram bin and the upper (exclusive) boundary U_{	exttt{histSize}[i]-1} for the last histogram bin histSize[i]-1 . That is, in case of a uniform histogram each of ranges[i] is an array of 2 elements. When the histogram is not uniform ( uniform=false ), then each of ranges[i] contains histSize[i]+1 elements:L_0, U_0=L_1, U_1=L_2, ..., U_{	exttt{histSize[i]}-2}=L_{	exttt{histSize[i]}-1}, U_{	exttt{histSize[i]}-1} . The array elements, that are not between L_0 and U_{	exttt{histSize[i]}-1} , are not counted in the histogram.
    • uniform – Flag indicating whether the histogram is uniform or not (see above).
    • accumulate – Accumulation flag. If it is set, the histogram is not cleared in the beginning when it is allocated. This feature enables you to compute a single histogram from several sets of arrays, or to update the histogram in time.

    释义:

    images:源图像矩阵(可以多个,但必须满足一定条件:同等深度,同等大小,同种数据类型:CV_8U或CV_32F,通道数不需要一致)

    nimages:源图像个数

    channels:用来计算直方图

    例程:

    #include <cv.h>
    #include <highgui.h>
    
    using namespace cv;
    
    int main( int argc, char** argv )
    {
        Mat src, hsv;
        if( argc != 2 || !(src=imread(argv[1], 1)).data )
            return -1;
    
        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 );
        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();
    }
  • 相关阅读:
    C++实现多项式曲线拟合--polyfit-超定方程
    C# XmlDocument操作XML
    C#下使用XmlDocument详解
    前端常见的9种设计模式
    前端常用的设计模式
    前端需要了解的9种设计模式
    TCP协议详解
    请UI小姐姐喝了一杯奶茶要来的网站
    nodemon 基本配置与使用
    wireshark抓包新手使用教程
  • 原文地址:https://www.cnblogs.com/Atanisi/p/6910125.html
Copyright © 2020-2023  润新知