Python+OpenCV绘制灰度直方图详解

1.直方图的概念

图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比。图像是由像素构成,因为反映像素分布的直方图往往可以作为图像一个很重要的特征。

图像灰度直方图:

一幅图像由不同灰度值的像素组成,图像中灰度的分布情况是该图像的一个重要特征。图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少。图像的灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像素的个数:其中,横坐标是灰度级,纵坐标是该灰度级出现的频率

归一化直方图:

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

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

代码

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灰度直方图内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python matplotlib绘制灰度和彩色直方图

    目录 一.Matplotlib.Pyplot简介 1.Matplotlib 2.Pyplot 二.灰度直方图 1.主要函数 2.实现代码 3.效果示例 三.彩色直方图 1.实现代码 2.效果示例 一.Matplotlib.Pyplot简介 1.Matplotlib Matplotlib 是 Python 的绘图库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式. Matplotlib 可以用来绘制各种静态,动态,交互式的图表. Matplotlib 是一个非常强大的 Python 画

  • Python cv2 图像自适应灰度直方图均衡化处理方法

    __author__ = 'Administrator' import numpy as np import cv2 mri_img = np.load('mri_img.npy') # normalization mri_max = np.amax(mri_img) mri_min = np.amin(mri_img) mri_img = ((mri_img-mri_min)/(mri_max-mri_min))*255 mri_img = mri_img.astype('uint8') r,

  • python 对一幅灰度图像进行直方图均衡化

    from PIL import Image from pylab import * from numpy import * def histeq(im,nbr_bins = 256): """对一幅灰度图像进行直方图均衡化""" #计算图像的直方图 #在numpy中,也提供了一个计算直方图的函数histogram(),第一个返回的是直方图的统计量,第二个为每个bins的中间值 imhist,bins = histogram(im.flatten(

  • python3+opencv 使用灰度直方图来判断图片的亮暗操作

    1.如何让计算机自动判断一张图是否偏暗?或是判断一张图是否是处于夜晚?我们可以先把图片转换为灰度图,然后根据灰度值的分布来判断,如: 我们可以从上图看到,晚上的图片的灰度值是集中在前段的,如0~30多左右,我们再看一张比较明亮的图片: 明亮的图片的灰度直方图是比较靠后的. 因此要判断图片的亮暗,只需要统计偏暗的像素个数,再除以图片像素的总个数,得到百分比p即可,至于p大于多少即判断为暗,则可以由你自己设置.下面给出代码,此代码可以在装满图片的目录里选出偏暗的图片,然后把这些图片保存下来. 2.代

  • Python+OpenCV绘制灰度直方图详解

    1.直方图的概念 图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的.纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比.图像是由像素构成,因为反映像素分布的直方图往往可以作为图像一个很重要的特征. 图像灰度直方图: 一幅图像由不同灰度值的像素组成,图像中灰度的分布情况是该图像的一个重要特征.图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少.图像的灰度直方图是灰度级的函数,描述的是图像中

  • Python OpenCV绘制各类几何图形详解

    目录 一.绘制直线 二.绘制矩形 三.绘制圆形 四.绘制椭圆 五.绘制多边形 六.绘制文字 七.总结 一.绘制直线 在OpenCV中,绘制直线需要获取直线的起点和终点坐标,调用cv2.line()函数实现该功能.该函数原型如下所示: img = line(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) – img表示需要绘制的那幅图像 – pt1表示线段第一个点的坐标 – pt2表示线段第二个点的坐标 – color表示线条颜色,需

  • Python数字图像处理基础直方图详解

    目录 直方图的定义 直方图的性质 直方图的应用 图像增强 图像分割 图像识别 Python直方图的计算 直方图的定义 直方图的性质 只统计某个灰度级出现的次数,图像的大小不一样的话, 某灰度值的像素出现的次数是不一样的. 那如果我们在这基础上除以像素总个数的话,那就是某一灰度级出现的概率,那么这样的话不同大小的同一内容图像其灰度直方图是一样的. 直方图的应用 图像增强 图像分割 图像识别 Python直方图的计算 import cv2 import numpy as np import matp

  • python OpenCV 实现高斯滤波详解

    目录 一.高斯滤波 二.C++代码 三.python代码 四.结果展示 1.原始图像 2.5x5卷积 3.9x9卷积 一.高斯滤波    高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程. [1] 通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到.高斯滤波的具体操作是:用一个模板(或称卷积.掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值. 二.C++代码

  • Python OpenCV机器学习之图像识别详解

    目录 背景 一.人脸识别 二.车牌识别 三.DNN图像分类 背景 OpenCV中也提供了一些机器学习的方法,例如DNN:本篇将简单介绍一下机器学习的一些应用,对比传统和前沿的算法,能从其中看出优劣: 一.人脸识别 主要有以下两种实现方法: 1.哈尔(Haar)级联法:专门解决人脸识别而推出的传统算法: 实现步骤: 创建Haar级联器: 导入图片并将其灰度化: 调用函数接口进行人脸识别: 函数原型: detectMultiScale(img,scaleFactor,minNeighbors) sc

  • Python+OpenCV之图像梯度详解

    目录 1. Sobel算子 1.1 Sobel介绍 1.2 横向Sobel算子 1.3 纵向Sobel算子 1.4 合并横纵向的方法提取更好的边缘的结果 1.5 利用1.3方法绘制素描风格 2. Scharr算子 3. Laplacian算子 1. Sobel算子 OpenCV系列—本文底页有多个常用方法链接 1.1 Sobel介绍 cv2.Sobel(src, ddepth, dx, dy, ksize) ddepth:图像的深度 dx和dy分别表示水平和竖直方向 ksize是Sobel算子的

  • Python+OpenCV之图像轮廓详解

    目录 1. 图像轮廓 1.1 findContours介绍 1.2 绘制轮廓 1.3 轮廓特征 2. 轮廓近似 2.1 轮廓 2.2 边界矩形 2.3 外界多边形及面积 1. 图像轮廓 1.1 findContours介绍 cv2.findContours(img, mode, method) mode:轮廓检索模式 RETR_EXTERNAL :只检索最外面的轮廓: RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中: RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是

  • python opencv图像处理基本操作示例详解

    目录 1.图像基本操作 ①读取图像 ②显示图像 ③视频读取 ④图像截取 ⑤颜色通道提取及还原 ⑥边界填充 ⑦数值计算 ⑧图像融合 2.阈值与平滑处理 ①设定阈值并对图像处理 ②图像平滑-均值滤波 ③图像平滑-方框滤波 ④图像平滑-高斯滤波 ⑤图像平滑-中值滤波 3.图像的形态学处理 ①腐蚀操作 ②膨胀操作 ③开运算和闭运算 4.图像梯度处理 ①梯度运算 ②礼帽与黑帽 ③图像的梯度处理 5.边缘检测 ①Canny边缘检测 1.图像基本操作 ①读取图像 ②显示图像 该函数中,name是显示窗口的名字

  • Python Matplotlib绘制多子图详解

    通过获取子图的label和线型来合并图例 注意添加label #导入数据(读者可忽略) pre_lp=total_res#组合模型 true=diff1[-pre_day:]#真实值 pre_ph=results_data["yhat"]#prophet pre_lstm=reslut#lstm pre_ari=data_ari['data_pre']#arima #设置中文字体 rcParams['font.sans-serif'] = 'kaiti' # 生成一个时间序列 (读者可

  • Python pyecharts绘制折线图详解

    一.绘制折线图 import seaborn as sns import numpy as np import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt %matplotlib inline plt.rcParams['font.sans-serif']=['Microsoft YaHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus']=False

随机推荐