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

作者:Vertira 时间:2023-06-09 18:50:50 

1.直方图的概念

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

图像灰度直方图:

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

归一化直方图:

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

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

其中,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()

原图

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

二维直返图

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

RGB直方图

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

来源:https://blog.csdn.net/Vertira/article/details/123652469

标签:Python,OpenCV,灰度,直方图
0
投稿

猜你喜欢

  • python 机器学习之支持向量机非线性回归SVR模型

    2022-06-17 20:23:55
  • Python流程控制语句的深入讲解

    2023-12-01 00:06:31
  • Python基于pandas爬取网页表格数据

    2023-03-13 07:30:32
  • Python+Pytorch实战之彩色图片识别

    2022-09-12 13:57:39
  • nginx+uwsgi+django环境搭建的方法步骤

    2022-01-12 16:34:59
  • python切割图片的实现示例

    2023-05-14 12:42:19
  • 浅谈javascript中的作用域

    2024-05-11 09:31:22
  • PHP实现简单注册登录系统

    2024-05-02 17:34:13
  • Python object类中的特殊方法代码讲解

    2021-01-27 13:40:33
  • 详解Oracle在out参数中访问光标

    2024-01-12 21:17:50
  • Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答

    2023-05-18 19:52:33
  • Python图像处理之图像拼接

    2021-08-14 19:27:41
  • python 3调用百度OCR API实现剪贴板文字识别

    2022-12-13 19:01:14
  • 安装dbus-python的简要教程

    2021-09-07 10:09:43
  • Python实例练习水仙花数问题讲解

    2023-05-26 18:38:11
  • JS点击图片弹出文件选择框并覆盖原图功能的实现代码

    2024-02-26 07:17:33
  • asp 关键词高亮显示(不区分大小写)

    2011-04-07 10:55:00
  • 使用Vue自定义指令实现Select组件

    2024-05-09 15:26:41
  • Python+Delorean实现时间格式智能转换

    2021-08-13 12:05:41
  • Python OpenCV实现鼠标画框效果

    2022-03-02 10:45:15
  • asp之家 网络编程 m.aspxhome.com