c++ - 使用 Opencv 绘制彩色图像的直方图

标签 c++ c image opencv histogram

<分区>

谁能给出一个用 C/C++ 编写的代码示例,它可以为彩色图像 (RGB) 创建直方图并显示它们?

最佳答案

参见用 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"

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

关于c++ - 使用 Opencv 绘制彩色图像的直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5050612/

相关文章:

c++ - 将特征矩阵转换为三元组形式 C++

c++ - C++ 中的静态与动态类型检查

javascript - 如何获取一个数在矩阵中的位置?

python - 如何使用OpenCV在几乎圆形的孔中找到各种圆弧的不同中心?

c++ - C++ 中两个指针 vector 的减法和交集

c++ - 如何从 TBitmap 获取像素数组?

php - 使用 popen 执行多处理脚本时输出困惑

c - Listen() 的队列大小如何工作?

php - 图片无法在 Firefox 中加载

image - 如何通过向量表示图像或音频以获得余弦相似度?