C++ OpenCV绘制简易直方图DrawHistImg

yizhihongxing

下面是对于C++ OpenCV绘制简易直方图的完整攻略。

什么是直方图?

直方图是一种图表,用于表示数据集中各元素频度分布情况的统计表。在计算机视觉中,直方图一般用来表示一幅图像中各个像素值所占的比例。

OpenCV绘制简易直方图的函数

在OpenCV中,我们可以使用 cv::calcHist 函数来计算图像的直方图,然后使用 cv::normalize 函数对直方图做归一化处理,最后使用 cv::imshow 函数展示出直方图。

函数原型:

void cv::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 )

函数参数说明:

  • images:输入图像的数组,可以包含一个或多个图像。
  • nimages:输入图像的数量。
  • channels:希望处理的通道,要传入一个数组。
  • mask:图像掩码,指定了感兴趣区域。
  • hist:输出直方图。
  • dims:直方图的维度。
  • histSize:直方图每个维度的划分数量。
  • ranges:数组大小和 dims 相同,用来表示每个维度的取值范围。
  • uniform:是否对每个 bin 进行归一化处理。
  • accumulate:是否累计计算直方图。

示例1:

下面是一个简单的例子,展示如何使用 cv::calcHist 计算图像的直方图,并使用 cv::normalize 进行归一化处理,最后使用 cv::imshow 函数展示出直方图。

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char** argv) {
    if (argc != 2) {
        cerr << "usage: ./hist <image_path>" << endl;
        return -1;
    }

    string image_path(argv[1]);

    Mat image = imread(image_path, IMREAD_COLOR);
    if (image.empty()) {
        cerr << "failed to read image: " << image_path << endl;
        return -1;
    }

    vector<Mat> channels;
    split(image, channels); // 将彩色图像拆分成三个通道

    int histSize = 256;
    float range[] = {0, 256};
    const float* histRanges[] = {range};

    Mat hist;
    calcHist(&channels[0], 1, 0, Mat(), hist, 1, &histSize, histRanges, true, false);

    normalize(hist, hist, 0, image.rows, NORM_MINMAX, -1, Mat());

    int histWidth = 512;
    int histHeight = 400;
    int binWidth = cvRound((double) histWidth / histSize);

    Mat histImage(histHeight, histWidth, CV_8UC1, Scalar(0));
    for (int i = 0; i < histSize; i++) {
        line(histImage, Point(binWidth * i, histHeight), Point(binWidth * i, histHeight - cvRound(hist.at<float>(i))), Scalar(255), binWidth);
    }

    imshow("Histogram", histImage);
    waitKey(0);

    return 0;
}

这个例子展示了如何将一个彩色图像拆分成三个通道,并计算每个通道的直方图。最后将三个通道的直方图相加并对结果进行归一化处理,然后展示出直方图。

示例2:

下面是另一个例子,更加详细地展示了如何绘制彩色图像的直方图。

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char** argv) {
    if (argc != 2) {
        cerr << "usage: ./hist <image_path>" << endl;
        return -1;
    }

    string image_path(argv[1]);

    Mat image = imread(image_path, IMREAD_COLOR);
    if (image.empty()) {
        cerr << "failed to read image: " << image_path << endl;
        return -1;
    }

    vector<Mat> bgr_planes;
    split(image, bgr_planes);

    int histSize = 256;
    float range[] = {0, 256};
    const float* histRanges[] = {range};

    Mat b_hist, g_hist, r_hist;

    calcHist(&bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, histRanges, true, false);
    calcHist(&bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, histRanges, true, false);
    calcHist(&bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, histRanges, true, false);

    int hist_w = 512, hist_h = 400;
    int bin_w = cvRound((double) hist_w / histSize);

    Mat histImage(hist_h, hist_w, CV_8UC3, Scalar(0, 0, 0));

    normalize(b_hist, b_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
    normalize(g_hist, g_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
    normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());

    for (int i = 1; i < histSize; i++) {
        line(histImage, Point(bin_w * (i - 1), hist_h - cvRound(b_hist.at<float>(i - 1))), Point(bin_w * (i), hist_h - cvRound(b_hist.at<float>(i))), Scalar(255, 0, 0), 2, LINE_AA);
        line(histImage, Point(bin_w * (i - 1), hist_h - cvRound(g_hist.at<float>(i - 1))), Point(bin_w * (i), hist_h - cvRound(g_hist.at<float>(i))), Scalar(0, 255, 0), 2, LINE_AA);
        line(histImage, Point(bin_w * (i - 1), hist_h - cvRound(r_hist.at<float>(i - 1))), Point(bin_w * (i), hist_h - cvRound(r_hist.at<float>(i))), Scalar(0, 0, 255), 2, LINE_AA);
    }

    imshow("Histogram of a Color Image", histImage);

    waitKey(0);

    return 0;
}

这个例子展示了如何绘制彩色图像的直方图。跟第一个例子一样,首先将彩色图像拆分成三个通道,计算每个通道的直方图,然后将三个通道的直方图绘制到一张三通道的图像上。最后展示出图像即可。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ OpenCV绘制简易直方图DrawHistImg - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • 在Django中进行用户注册和邮箱验证的方法

    在Django中进行用户注册和邮箱验证的方法可以分为以下几个步骤: 安装所需要的包 Django自带的认证模块不支持邮箱验证,需要安装第三方包进行扩展。常用的包有django-registration和django-allauth,可以通过pip进行安装。 示例代码: //安装django-registration pip install django-re…

    人工智能概论 2023年5月25日
    00
  • python实现MongoDB的双活示例

    下面是“Python实现MongoDB的双活示例”的完整攻略: 1. 环境准备 在开始之前,我们需要完成以下环境配置: 安装Python 3.x版本。 安装pymongo模块,在命令行中运行 pip install pymongo 命令即可。 安装MongoDB数据库,版本号为4.0或以上。 配置MongoDB实例,建议使用副本集(replica set)或…

    人工智能概论 2023年5月25日
    00
  • 图片文字识别(OCR)插件Ocrad.js教程

    图片文字识别(OCR)插件Ocrad.js教程 简介 Ocrad.js是一款基于Javascript的图像识别(OCR)库,可以用于识别不同类型的数字和字母的图像,包括但不限于印刷体和手写体。Ocrad.js库可以在浏览器和服务器中使用。 安装和使用 前置要求 在使用Ocrad.js之前,您需要确保您的项目中安装了Node.js和NPM包管理器。 安装 您可…

    人工智能概论 2023年5月25日
    00
  • windows下nginx的安装使用及解决80端口被占用nginx不能启动的问题

    下面是Windows下Nginx的安装使用及解决80端口被占用Nginx不能启动的问题的完整攻略。 一、安装Nginx 1.1 下载Nginx 到Nginx官网下载最新版本的Nginx,选择Windows的zip压缩包。 1.2 解压Nginx 将下载好的zip压缩包解压到你想要安装的目录下。 1.3 配置Nginx 打开解压后的Nginx文件夹,找到con…

    人工智能概览 2023年5月25日
    00
  • Django集成CAS单点登录的方法示例

    下面我将详细讲解“Django集成CAS单点登录的方法示例”的完整攻略: 1. 什么是CAS单点登录? CAS(Central Authentication Service) 是一种单点登录协议,它可以让用户在一次登录之后访问多个应用而不需要重复认证。CAS通过把用户的身份在 CAS Server 上进行认证并生成 Service Ticket,然后将它发送…

    人工智能概览 2023年5月25日
    00
  • nginx rtmp模块编译 arm版本的问题

    编译NGINX RTMP模块是在ARM平台上部署直播服务的一项必要步骤。这个过程需要先编译NGINX,然后加上RTMP模块再进行ARM版本编译。以下是详细的步骤: 1. 安装必要的依赖 在开始编译之前,需要安装一些必要的依赖库: sudo apt-get update sudo apt-get -y install build-essential libpc…

    人工智能概览 2023年5月25日
    00
  • vue.js项目nginx部署教程

    下面提供一份Vue.js项目Nginx部署的攻略,包含了具体的步骤和两条示例说明: 1. 环境准备 安装Vue CLI 根据Vue官方文档的指引,使用npm命令全局安装Vue CLI: npm install -g @vue/cli 构建Vue.js项目 使用Vue CLI构建一个Vue.js项目,在该项目中创建示例代码,确保能够在开发环境中成功运行。 安装…

    人工智能概览 2023年5月25日
    00
  • Pytorch中的自动求梯度机制和Variable类实例

    Pytorch中的自动求梯度机制和Variable类实例是深度学习中非常重要的概念。在本篇文章中,我们将介绍Pytorch的自动求梯度机制和Variable类实例,以及如何利用它们来构建深度学习模型。 自动求梯度机制 自动求梯度机制是指Pytorch可以自动计算张量(Tensor)的梯度。在深度学习中,梯度在反向传播(backpropagation)中起着非…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部