Python与OpenCV实现图像灰度直方图绘制详解

陆景行
陆景行
发布时间:2026-10-15| 5人浏览过
原创

本文详解如何利用Python和OpenCV库绘制图像灰度直方图。内容涵盖直方图的基本概念、归一化计算方法,并通过完整代码示例展示如何使用matplotlib和cv2.calcHist函数生成灰度及RGB通道直方图,帮助开发者直观理解图像像素分布特征。

直方图基本概念

1.直方图的概念

图像直方图是用于统计图像像素分布情况的图表。其横坐标表示像素的类别,既可以是灰度值,也可以是彩色通道的分量;纵坐标则表示每种颜色或灰度值在图像中出现的像素总数,或者其占总像素数量的百分比。由于图像由像素构成,直方图能够直观反映像素的分布状态,因此成为图像处理中一个重要的分析特征。

灰度直方图与归一化

图像灰度直方图:

一幅图像由具有不同灰度值的像素组成,灰度的分布情况是图像的关键特征之一。图像灰度直方图描述了图像中各灰度级的分布情况,直观展示各级灰度所占的比例。该直方图是灰度级的函数,表示具有特定灰度级的像素数量:横坐标代表灰度级,纵坐标代表该灰度级出现的频率。

归一化直方图:

通常需要将纵坐标归一化至[0,1]区间,即将灰度级出现的频率(像素个数)除以图像的总像素数。灰度直方图的计算公式如下:

其中,rk表示像素的灰度级,nk表示具有灰度rk的像素个数,MN表示图像中总的像素个数。

代码

Python代码实现与可视化

import cv2 as cv
import numpy as np
 
from matplotlib import pyplot as plt
#%matplotlib inline
 
def plot_demo(image):
    plt.hist(image.ravel(), 256, [0, 256]) #image.ravel()#ravel函数功能是将多维数组降为一维数组,统计各个bin的频次,256:bin的个数,[0, 256]:范围
    plt.show("直方图") #和OpenCV中的想要的直方图不同
"""
画灰度图直方图:
绘图都可以调用matplotlib.pyplot库来进行,其中的hist函数可以直接绘制直方图。
plt.hist(arr, bins=50, normed=1, facecolor='green', alpha=0.75)
hist的参数非常多,但常用的就这五个,只有第一个是必须的,后面四个可选
arr: 需要计算直方图的一维数组
bins: 直方图的柱数,可选项,默认为10
normed: 是否将得到的直方图向量归一化。默认为0
range参数表示箱子的下限和上限。即横坐标显示的范围,范围之外的将被舍弃
"""
 
def image_hist(image):
    color = ('blue', 'green', 'red')  #图像三通道
    for i, color in enumerate(color):
        hist = cv.calcHist([image], [i], None, [256], [0, 256]) #绘制各个通道的直方图
        plt.plot(hist, color=color) #定义线的颜色
        plt.xlim([0, 256]) #x轴的范围
    plt.show()
"""
calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) 
images参数表示输入图像,传入时应该用中括号[ ]括起来
channels参数表示传入图像的通道,如果是灰度图像,那就不用说了,只有一个通道,值为0,
如果是彩色图像(有3个通道),那么值为0,1,2,中选择一个,对应着BGR各个通道。这个值也得用[ ]传入。
mask参数表示掩膜图像。如果统计整幅图,那么为None。
主要是如果要统计部分图的直方图,就得构造相应的掩膜来计算。
histSize参数表示灰度级的个数,需要中括号,比如[256]
ranges参数表示像素值的范围,通常[0,256]。此外,假如channels为[0,1],ranges为[0,256,0,180],
则代表0通道范围是0-256,1通道范围0-180。
hist参数表示计算出来的直方图。
"""
 
 
src = cv.imread("F:/images/lena.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
plot_demo(src)
image_hist(src)
cv.waitKey(0)
 
cv.destroyAllWindows()

原图

二维直返图

RGB直方图

到此这篇关于Python+OpenCV绘制灰度直方图详解的文章就介绍到这了,更多相关Python OpenCV灰度直方图内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。