利用OpenCV的函数calcHist()计算出图像的直方图数据后绘制图像的直方图

news2025/4/7 3:53:55

利用OpenCV的函数calcHist()计算出图像的直方图数据后绘制图像的直方图

在上一篇博文 https://www.hhai.cc/thread-200-1-1.html 中已经对OpenCV的直方图计算函数calcHist()进行了详细介绍。
这篇博文介绍如何用直方图数据绘制直方图。

OpenCV是没有统计图绘制的相关函数的,所以要么用第三方库,要么想另外的办法。

先说Python-OpenCV中如何用直方图数据绘制直方图,由于Python安装和导入扩展库是非常方便简单的,所以我们用扩展库Matplotlib来绘制图像的直方图。

关于扩展库Matplotlib的安装大家可以参见下面这篇博文:
https://www.hhai.cc/thread-64-1-1.html

关于扩展库Matplotlib的使用示例可以参考下面这篇博文:
https://www.hhai.cc/thread-210-1-1.html

示例代码如下:

# -*- coding: utf-8 -*-
# 出处:昊虹AI笔记网(hhai.cc)
# 用心记录计算机视觉和AI技术

# OpenCV的版本为4.4.0

import cv2 as cv
import matplotlib.pyplot as plt
import sys

if __name__ == '__main__':
    # 读取图像并判断是否读取成功
    img = cv.imread('E:/material/images/2022/2022-12/view1.jpg', 0)
    if img is None:
        print('Failed to read img.')
        sys.exit()

    cv.imshow('img', img)

    hist1 = cv.calcHist([img], [0], None, [256], [0, 256])

    plt.plot(hist1)

    cv.waitKey(0)
    cv.destroyAllWindows()


运行结果如下:
在这里插入图片描述
在这里插入图片描述
从上面的直方图中,我们可以清晰的看出,图像的灰度数据值主要集中在40-70的范围内,所以整幅图像是偏暗的。

虽然C++中也有专门绘制统计图的库,但显然没有Python导入扩展库那么简单,并且在使用上数据的引用传递也是个麻烦事,所以在C++中,我们就用OpenCV自带的线段绘制函数line()进行图像直方图的绘制了。示例代码如下:

//出处:昊虹AI笔记网(hhai.cc)
//用心记录计算机视觉和AI技术

//OpenCV版本 OpenCV3.0

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

using namespace std;
using namespace cv;


int main()
{
    // 图像获取及判断 
    cv::Mat Image, ImageGray;
    Image = cv::imread("E:/material/images/2022/2022-12/view1.jpg"); 
    if(Image.empty()) 
      return -1;
    cv::imshow("Image",Image);
    // 转换为灰度图像
    cv::cvtColor(Image,ImageGray,CV_BGR2GRAY);
    // 定义直方图参数
    const int channels[1]={0};
    const int histSize[1]={256};
    float pranges[2]={0,256};
    const float* ranges[1]={pranges};
    cv::MatND hist;
    // 计算直方图
    cv::calcHist(&ImageGray,1,channels,cv::Mat(),hist,1,
    histSize,ranges);
    // 初始化画布参数
    int hist_w = 500; 
    int hist_h = 500;
    int nHistSize = 255;
    // 区间
    int bin_w = cvRound( (double) hist_w / nHistSize );
    cv::Mat histImage( hist_w, hist_h,
             CV_8UC3,   cv::Scalar( 0,0,0) );
	  // 将直方图归一化到范围 [ 0, histImage.rows ]
	  normalize(hist, hist, 0, histImage.rows, 
               cv::NORM_MINMAX,  -1, cv::Mat() );
	  // 在直方图画布上画出直方图
    for( int i = 1; i < nHistSize; i++ )
    {
      line( histImage, cv::Point(bin_w*(i-1),
             hist_h-cvRound(hist.at<float>(i-1)) ) ,
             cv::Point( bin_w*(i), 
             hist_h - cvRound(hist.at<float>(i)) ),
             cv::Scalar( 0, 0, 255), 2, 8, 0  );
    }
    // 显示直方图
    cv::imshow("histImage", histImage);
    cv::waitKey();
    return 0;
}

运行结果如下图所示:
在这里插入图片描述
把Python代码的运行结果和C++代码的运行结果放在一起对比如下:
在这里插入图片描述
从上图可以看出,二者其实是相同的,只是因为Python的Matplotlib库是专业的统计绘图库,所以显然要专业的多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/146254.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Verilog语法笔记(夏宇闻第三版)-循环语句

目录 forever语句: repeat语句: while语句: for语句: 在Verilog HDL中存在着四种类型的循环语句&#xff0c;用来控制执行语句的执行次数。 1) forever 连续的执行语句。 2) repeat 连续执行一条语句 n 次。 3) while 执行一条语句直到某个条件不满足。如果一开始条件即…

数据异动分析方法论

注&#xff1a;本文首发于公众号&#xff1a;书剑双修&#xff0c;欢迎关注。 数据异动分析是一类典型的数据分析问题&#xff0c;也是分析师日常工作中会频繁遇到的问题。很多的数据分析面试过程中&#xff0c;都会对这个方面进行考察&#xff0c;以此来判断分析师思考问题的全…

使用IIS服务器搭建一个网站

1、什么是IISIIS全称为Internet Information Services&#xff0c;是一种Web服务组件。通过在自己电脑上安装好IIS服务&#xff0c;就可以把你自己的电脑当作一个网站的服务器。2、搭建一个IIS2.1、开启windows的IIS服务Step1、控制面板——程序——程序和功能——启用或关闭wi…

微软的COM、DOM和COM+

纯粹的为了记录一下 COM 组件对象模型&#xff08;COM&#xff09;&#xff0c;是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下&#xff0c;人们可以开发出各种各样的功能专一的组件&#xff0c;然后将它们按照需要组合起…

大数据NiFi(九):NiFi集群页面的添加、配置处理器操作

文章目录 NiFi集群页面的添加、配置处理器操作

jdb2/kworker

测试代码出自&#xff1a;块设备IO优化的典型案例分析_papaofdoudou的博客-CSDN博客_kworker/u2:2-2- #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <unistd.h&g…

基础算法 - 常见算法模板题(最简洁写法)【下】

目录 双指针 最长连续不重复子序列​编辑 二进制中1的个数 离散化 区间和 区间合并 双指针 最长连续不重复子序列 思路&#xff1a; 设左右指针 j&#xff0c;i&#xff1b;用 i 遍历数组&#xff0c;对【j&#xff0c;i】范围路径数值出现次数记录若次数大于1&#xff0c;则…

Seata-go 发布 1.0.3,补齐 AT 模式

文&#xff5c;赵新&#xff08;花名&#xff1a;于雨 )蚂蚁集团 Seata 项目开源负责人本文 3902 字 阅读 10 分钟发布概览Seata-go 1.0.3 版本补齐了 AT 模式下对 Insert/Delete 的支持&#xff0c;这意味着除了 “select for update” 外&#xff0c;Seata-go 的 AT 模式与 S…

【c++】 STL的组件简介与容器的使用时机

STL六大组件简介 STL提供了六大组件&#xff0c;彼此之间可以组合套用&#xff0c;这六大组件分别是:容器、算法、迭代器、仿函数、适配器&#xff08;配接器&#xff09;、空间配置器。 容器&#xff1a;各种数据结构&#xff0c;如vector、list、deque、set、map等,用来存放…

ECS概述

1.ECS概述ECS全称Entity-Component-System&#xff08;实体-组件-系统&#xff09;&#xff0c;是基于组合优于继承&#xff08;将不变的部分使用继承以方便复用&#xff0c; 将多变的部分用组合来方便拓展&#xff09;的原则的一种模式&#xff0c;游戏中的每一个单元&#xf…

使用Redis踩过的16个坑

如果你在使用 Redis 时,也遇到过以下这些「诡异」的场景,那很大概率是踩到「坑」了: 明明一个 key 设置了过期时间,怎么变成不过期了? 使用 O(1) 复杂度的 SETBIT 命令,Redis 竟然被 OOM 了? 执行 RANDOMKEY 随机拿出一个 key,竟然也会阻塞 Redis? 同样的命令,为什么…

Linux基础命令学习(Bandit通关)(未完成)

一、前言 Bandit是一个学习Linux的网站&#xff0c;它采用游戏通关的方式来帮助我们学习linux基本使用的命令&#xff0c;十分适合没有基础或基础较弱的同学学习。【虽然是英文但是很容易&#xff0c;用翻译也可】 官网地址是&#xff1a;OverTheWire: Bandit 二、第一~六关…

自从用了这个良心浏览器后,我卸载了UC,太香了

要是以前如果有人问我手机上用什么浏览器好&#xff0c;我肯定一律无脑推荐UC浏览器。一方面它确实功能强大&#xff0c;另一方面是用了很多年已经习惯了&#xff0c;有感情因素在。然而&#xff0c;这次可能要打自己的脸了。 最近&#xff0c;有了个“新欢”&#xff0c;其实…

线程3

一.阻塞队列阻塞队列&#xff0c;也是特殊的队列&#xff0c;虽然也是先进先出的&#xff0c;但是带有特殊功能。阻塞&#xff1a;1.如果队列为空&#xff0c;执行出队列操作&#xff0c;就会阻塞&#xff0c;阻塞到另一个线程往队列中添加元素&#xff08;队列不空为止&#x…

C程序设计笔记(上篇)

笔记正文 第一模块 C基础知识 考试大纲的要求 &#xff08;1&#xff09;掌握数据类型、变量和赋值&#xff1b; &#xff08;2&#xff09;掌握输入和输出&#xff1b; &#xff08;3&#xff09;掌握基本运算符和表达式&#xff1b; &#xff08;4&#xff09;了解简单控制…

米尔国产开发平台T507-H之Android系统发布说明

安卓系统作为目前世界上最受欢迎的移动操作系统&#xff0c;它可以在大量的设备上使用&#xff0c;它正在接管平板电脑、汽车、智能电视、可穿戴设备、家用电器、游戏机等市场&#xff0c;它为嵌入式平台提供了独特而熟悉的体验&#xff0c;从小的手机屏幕到显示器&#xff0c;…

SpringCloud 网关组件 Gateway 原理深度解析

引入网关的必要性 在微服务架构下&#xff0c;我们一般会把相对独立的业务或功能划分为不同的服务&#xff0c;不同服务之间相互隔离&#xff0c;独立部署。这些微服务由服务注册中心集中管理。对于来自外部的用户请求来说&#xff0c;在处理请求的核心业务逻辑之前&#xff0…

Vector - VT System - 模拟输入仿真_VT2004

在我们的测试工作中&#xff0c;经常会遇到一些模拟信号的输入&#xff0c;如果我们使用实际的样件的话一个成本过高&#xff0c;另外一个就是对我们测试人员对环境搭建要求过高&#xff0c;因此最好的办法就是有一个设备能够模拟我们需要的任意信号&#xff0c;这样就能完美的…

Pytorch TextCNN实现中文文本分类(附完整训练代码)

Pytorch TextCNN实现中文文本分类(附完整训练代码) 目录 Pytorch TextCNN实现中文文本分类(附完整训练代码) 一、项目介绍 二、中文文本数据集 &#xff08;1&#xff09;THUCNews文本数据集 &#xff08;2&#xff09; 今日头条文本数据集 &#xff08;3&#xff09;自…

字节跳动青训营笔试题解

文章目录前言一、单选题二、多选题三、编程题T1.旋转数组最大值题目思路代码T2.社交圈题目思路代码四、简答题题目思路前言 第五届字节跳动青训营-后端专场笔试题解&#xff0c;简单做了一下&#xff0c;选择题和简答题不知道是否正确&#xff0c;编程题是通过了的&#xff0c…