【问题标题】:Draw Histogram of a colored Image with Opencv [closed]使用 Opencv 绘制彩色图像的直方图 [关闭]
【发布时间】:2011-06-30 08:28:49
【问题描述】:

谁能给出 C/C++ 中的代码示例,该代码为彩色图像 (RGB) 创建直方图并显示它们?

【问题讨论】:

    标签: c++ c image opencv histogram


    【解决方案1】:

    参见用 C++ 编写的 vz::plot_histogram()。 https://www.ccoderun.ca/programming/doxygen/vz_imagination/namespacevz.html#a4cf3b5cd26b8cc8ac28fdbb8355f56a5

    万一链接失效,相关代码如下:

    // "src" is the cv::Mat input image
    const size_t number_of_channels = src.channels();
    const cv::Scalar background_colour(0,0,0);
    
    std::vector<cv::Mat> split;
    cv::split(src, split);
    
    const int       height          = 480;
    const int       width           = 640;
    const int       histogram_size  = 256; // the number of "bins"
    const float     range[]         = {0, 256}; // upper bound is exclusive, meaning 0-255
    const float *   ranges          = {range};
    const bool      uniform         = true;
    const bool      accumulate      = false;
    cv::Mat         mask;
    
    // prepare the destination image
    const int margin        = 3;
    const int min_y         = margin;
    const int max_y         = height - margin;
    const int thickness     = 1;
    const int line_type     = cv::LINE_AA;
    const float bin_width   = static_cast<float>(width) / static_cast<float>(histogram_size);
    cv::Mat dst(height, width, CV_8UC3, background_colour); // create the output image, starting with a pure colour
    
    cv::Scalar colours[] =
    {
        {255, 0, 0},    // blue
        {0, 255, 0},    // green
        {0, 0, 255}     // red
    };
    if (number_of_channels == 1)
    {
        // for greyscale images, we only have a single colour channel, so ignore
        // the RGB colour definitions and use either black or white for the histogram
    
        colours[0] = (background_colour == cv::Scalar(0, 0, 0)) ?
                cv::Scalar(255, 255, 255) :
                cv::Scalar(0, 0, 0);
    }
    
    // iterate through all the channels in this image
    for (size_t idx=0; idx < split.size(); idx++)
    {
        const cv::Scalar colour = colours[idx % 3];
    
        cv::Mat & m = split[idx];
    
        cv::Mat histogram;
        cv::calcHist(&m, 1, 0, mask, histogram, 1, &histogram_size, &ranges, uniform, accumulate);
    
        cv::normalize(histogram, histogram, 0, dst.rows, cv::NORM_MINMAX);
    
        for (int i = 1; i < histogram_size; i++)
        {
            const int x1 = std::round(bin_width * (i - 1));
            const int x2 = std::round(bin_width * (i - 0));
    
            const int y1 = std::clamp(height - static_cast<int>(std::round(histogram.at<float>(i - 1))), min_y, max_y);
            const int y2 = std::clamp(height - static_cast<int>(std::round(histogram.at<float>(i - 0))), min_y, max_y);
    
            cv::line(dst, cv::Point(x1, y1), cv::Point(x2, y2), colour, thickness, line_type);
        }
    }
    
    // histogram is in "dst"
    

    生成的直方图应如下所示:

    【讨论】:

      猜你喜欢
      • 2015-01-24
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-31
      • 1970-01-01
      相关资源
      最近更新 更多