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

下面是对于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日

相关文章

  • 一篇文章搞懂K8S高级特性

    一篇文章搞懂K8S高级特性 Kubernetes(简称K8S)是一款用于容器编排和管理的开源平台,它已经成为了容器技术领域的事实标准。在使用K8S进行容器编排时,难免会遇到涉及到K8S高级特性的问题,如Pod亲和性、Pod反亲和性、HPA(Horizontal Pod Autoscaling)自动扩展等。本文将带领读者了解这些高级特性的使用方法和实例。 Po…

    人工智能概览 2023年5月25日
    00
  • OpenCV2学习笔记之视频流读取与处理

    OpenCV2学习笔记之视频流读取与处理 OpenCV是一种跨平台计算机视觉库,可用于开发实时计算机视觉应用程序。本文将介绍如何使用OpenCV2读取和处理视频流。 1. 安装和配置OpenCV2 首先,你需要安装OpenCV2。可以通过包管理器(如apt-get,yum等)进行安装,也可以从OpenCV官方网站进行手动安装。为了使用OpenCV在Pytho…

    人工智能概论 2023年5月24日
    00
  • 使用git代替FTP部署代码到服务器的例子

    使用git代替FTP部署代码到服务器的攻略如下: 配置服务器 注册一个服务器账户,并通过ssh连接到服务器。 安装git和web服务器。 如果你的服务器上还没有安装git,可以使用apt-get或yum等包管理工具安装。 安装web服务器,例如Apache或Nginx,用于服务于你的应用程序。 配置本地环境 确保本地电脑上已安装git。 在本地代码库中初始化…

    人工智能概论 2023年5月25日
    00
  • Ubuntu14.04 opencv2.4.8和opencv3.3.1多版本共存的实现方法

    实现Ubuntu14.04下的OpenCV 2.4.8和OpenCV 3.3.1多版本共存,可以采用以下方法: 环境要求 Ubuntu14.04 已经安装OpenCV 2.4.8 已经安装OpenCV 3.3.1(如果需要安装的话) 步骤 1.安装依赖库 sudo apt-get install build-essential cmake git libgt…

    人工智能概览 2023年5月25日
    00
  • 如何基于SpringBoot实现人脸识别功能

    下面我就为大家详细讲解基于SpringBoot实现人脸识别功能的完整攻略。 准备工作 在开始实现人脸识别功能前,需要完成以下的准备工作: 购买或租用摄像头,并安装在服务器或测试机上; 在项目中引入人脸识别的第三方API或SDK,例如Face++、百度AI等; 采用SpringBoot搭建服务器,并准备好对应的端口号和域名。 实现步骤 以下是基于SpringB…

    人工智能概览 2023年5月25日
    00
  • Django 响应数据response的返回源码详解

    Django 响应数据 response 的返回源码详解 在 Django 中,response 对象是控制网页响应的关键。它包含的元素很多,如状态码、响应头、响应正文等等。本文将详细介绍 response 的返回源码,帮助你更好地理解 Django 的网页响应机制。 Django 响应数据的基本结构 response 对象是在视图函数中生成的,通过 Htt…

    人工智能概论 2023年5月25日
    00
  • Java操作Mongodb数据库实现数据的增删查改功能示例

    下面是Java操作Mongodb数据库实现数据的增删查改功能示例的完整攻略: 一、准备工作 1. 安装Mongodb Mongodb是一款开源的面向文档的NoSQL数据库,它支持多种编程语言,同时也有官方的Java驱动,可以使用Maven进行依赖的引入,可以到官网进行下载和安装。 2. 引入依赖 可以在Java工程中使用Maven进行引入Mongodb Ja…

    人工智能概论 2023年5月25日
    00
  • Python OpenCV视频截取并保存实现代码

    下面针对Python OpenCV视频截取并保存实现代码的完整攻略进行详细讲解。 1. 导入OpenCV库 在Python中运用OpenCV库实现视频截取需要先导入相关库。使用以下代码实现: import cv2 2. 打开视频文件 使用OpenCV的VideoCapture函数打开视频文件,你可以将视频文件的地址作为参数向函数传递。 cap = cv2.V…

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