# Python图像处理丨如何调用OpenCV绘制直方图

## 一. 灰度直方图基本概念

### 什么是灰度直方图？

[En]

For continuous images, it changes smoothly from a high grayscale in the center to a low grayscale at the edge. The histogram is defined as:

1、初始化 hist[k]=0; k=0,…,L-1
2、统计 hist[f(x,y)]++; x=0,…,M-1, y =0,…,N-1
3、归一化 hist[f(x,y)]/=M*N

[En]

So after all that has been said, what is the use of histograms?

## 二. 绘制直方图

### 1.基础概念

[En]

In the histogram, the Abscissa represents the gray level of each pixel in the image, and the ordinate represents the number of pixels with that gray level.

x = [1, 2, 3, 4, 5]
y = [3, 1, 2, 1, 2]

### 2.归一化直方图

[En]

The Abscissa of the histogram represents the gray level of each pixel in the image, and the ordinate represents the probability of this gray level. The calculation method is as follows:

(1) 先计算灰度级及对应像素的个数
x = [1, 2, 3, 4, 5]
t = [3, 1, 2, 1, 2]

(2) 统计总的像素个数
n = (3 + 1 + 2 + 1 +2) = 9

(3) 统计各个灰度级的出现概率
y = t / n = [3/9, 1/9, 2/9, 1/9, 2/9]

### 3.绘制直方图

import matplotlib.pyplot as plt


hist(数据源, 像素级)参数：数据源必须是一维数组，通常需要通过函数ravel()拉直图像像素级一般是256，表示[0, 255]


## 4.代码实现

#encoding:utf-8import cv2  import numpy as npimport matplotlib.pyplot as pltsrc = cv2.imread('test01.jpg')cv2.imshow("src", src)cv2.waitKey(0)cv2.destroyAllWindows()plt.hist(src.ravel(), 256)plt.show()


## 三. 使用OpenCV统计绘制直方图

### 1.函数原型

[En]

Histogram Abscissa: the grayscale of each pixel in an image

[En]

Histogram ordinate: the number of pixels with this gray level

hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)

• hist表示直方图，返回的是一个二维数组
• images表示原始图像
• channels表示指定通道，通道编号需要用中括号括起，输入图像是灰度图像时，它的值为[0]，彩色图像则为[0]、[1]、[2]，分别表示B、G、R
• histSize表示BINS的数量，参数子集的数目，如下图当bins=3表示三个灰度级

• ranges表示像素值范围，例如[0, 255]
• accumulate表示累计叠加标识，默认为false，如果被设置为true，则直方图在开始分配时不会被清零，该参数允许从多个对象中计算单个直方图，或者用于实时更新直方图；多个直方图的累积结果用于对一组图像的直方图计算

### 2.代码实现

[En]

First of all, the basic size, shape and content of the gray level of the image are calculated.

#encoding:utf-8import cv2  import numpy as npimport matplotlib.pyplot as pltsrc = cv2.imread('test01.jpg')#参数:原图像 通道[0]-B 掩码 BINS为256 像素范围0-255 hist = cv2.calcHist([src], [0], None, [256], [0,255])print(type(hist))print(hist.size)print(hist.shape)print(hist)


​[Python数据挖掘课程] 六.Numpy、Pandas和Matplotlib包基础知识​

#encoding:utf-8import cv2  import numpy as npimport matplotlib.pyplot as plt#绘制sin函数曲线x1 = np.arange(0, 6, 0.1)y1 = np.sin(x1)plt.plot(x1, y1)#绘制坐标点折现x2 = [0, 1, 2, 3, 4, 5, 6]y2 = [0.3, 0.4, 2.5, 3.4, 4, 5.8, 7.2]plt.plot(x2, y2)#省略有规则递增的x2参数 y3 = [0, 0.5, 1.5, 2.4, 4.6, 8]plt.plot(y3, color="r")plt.show()


[En]

The output has three lines, as shown below:

#encoding:utf-8import cv2  import numpy as npimport matplotlib.pyplot as pltsrc = cv2.imread('test01.jpg')histb = cv2.calcHist([src], [0], None, [256], [0,255])histg = cv2.calcHist([src], [1], None, [256], [0,255])histr = cv2.calcHist([src], [2], None, [256], [0,255])cv2.imshow("src", src)cv2.waitKey(0)cv2.destroyAllWindows()plt.plot(histb, color='b')plt.plot(histg, color='g')plt.plot(histr, color='r')plt.show()


Original: https://blog.51cto.com/u_15214399/5548199
Author: 华为云开发者联盟
Title: Python图像处理丨如何调用OpenCV绘制直方图

(0)

### 大家都在看

• #### YOLO Air一款面向科研小白的YOLO项目 | 包含大量改进方式教程

YOLO Air一款面向科研小白的YOLO项目|包含大量改进方式教程|适用YOLOv5,YOLOv7,YOLOX,YOLOv4,YOLOR,YOLOv3,transformer等算…

Python 2023年9月16日
071
• #### 【CSS记录】隐藏式图文介绍框：鼠标放上后展示更多内容

<!DOCTYPE html> <html> <head> </head> <body> <div class=&…

Python 2023年6月3日
091
• #### JavaScript事件

404. 抱歉，您访问的资源不存在。 可能是网址有误，或者对应的内容被删除，或者处于私有状态。 代码改变世界，联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

Python 2023年6月9日
0129
• #### Linux0.11 考古笔记

Linux0.11 考古笔记 最近读完《Linux 内核完全注释》和《品读 Linux0.11 核心代码》，大致理解下 Linux0.11 内核的全貌。在我理解这些属于计算机基础类…

Python 2023年9月30日
0114
• #### 第2关：Numpy数组的基本运算

任务描述本关的小目标是，学会Numpy二维数组的一些基本操作。相关知识Numpy库可以直接进行一些四则运算，快速的处理两个Numpy数组： a = np.array([[1,2,3…

Python 2023年8月24日
088
• #### 2022年最新全国城市/县/区天气查询API接口分享

2022年最新全国城市/县/区天气查询API接口分享 原创 wx62dd0c4cdc5b12022-07-24 17:14:03©著作权 文章标签 json 文章分类 Python…

Python 2023年5月25日
0124
• #### 用Python批量爬取快手视频，实现自动关注/点赞/评论

获取视频的代码 import requests # 发送请求 第三方模块(第三方应用 pip) import re 伪装 1. 选中要替换的代码 2. ctrl + R 3. 第一…

Python 2023年11月2日
0142
• #### 爬虫课程笔记（七）scrapy入门与深入

爬虫课程笔记 Scrapy * 异步与非阻塞区别 爬虫流程 入门 – 创建一个scrapy项目 生成一个爬虫 提取数据 保存数据 logging 实现翻页请求 深入sc…

Python 2023年10月2日
092
• #### 【Pandas分组聚合】进阶：透视表、交叉表（pivot_table() 、crosstab()）

Pandas透视表、交叉表 创建DataFrame结构 透视表 pivot_table() * 单列聚合 多列聚合 交叉表 crosstab() * 计算分组频率 两列分组后求第三…

Python 2023年8月8日
0101
• #### Python实现批量将文件按分类保存，文件再多，只需一秒钟解决

当我们的计算机中有太多的文本或文件夹时，有时我们只有搜索文件名才能找到我们想要的文件。如果名字被忘记了，你就不能搜索它，当然，你可以搜索后缀名称。但通过搜索出来的文件只会更多，这只…

Python 2023年5月24日
0131
• #### 用matplotlib库将形状为（4418，3，150，27，1）的数据进行可视化

经检查发现我生成的valjoint数据与作者提供的不同。所以我想可视化看一下究竟是哪里不同。决定用matplotlib库来将valjoint形状为（4418，3，150，27，1）…

Python 2023年8月28日
094
• #### 设计模式之备忘录模式

无论是我们在使用word还是记事本，系统都会为我们提供撤销的功能，这几乎是人人都会使用到的功能，而在我们实际开发中，会不会存在一个很复杂的对象，当更改了其中的某一个属性以后，也提供…

Python 2023年10月21日
081
• #### [django项目实战1]图书管理系统

在上周经过了Django的学习后，（没看到可以点击此处）深入理解一个框架的意义就是直接使用其来进行开发。这里以简单的图书管理系统为例。其中，前端使用的是比较流行的Bootstrap…

Python 2023年8月1日
0114
• #### 什么是VHDL？一文带你了解VHDL语言

基于FPGA的SOC在嵌入式系统应用越来越广了，比较流行的硬件描述语言有两种Verilog HDL/VHDL，均为IEEE标准。VHDL如果有C语言基础的话就会比较容易上手。而VH…

Python 2023年10月1日
0108
• #### conda创建虚拟环境

1、创建conda环境 conda create -n yolov5 python=3.8 2、清除conda安装失败的缓存（若安装失败，可以用这个清除缓存） conda clea…

Python 2023年9月8日
093
• #### Scrapy爬虫基本使用和技巧

Scrapy是什么? Scrapy是一个由Python编写的开源协作爬虫框架，可以快速的从网站中提取需要的数据。Scrapy基础爬虫部分内部已经实现，只需编写采集规则即可，简单易用…

Python 2023年10月4日
077