首页 > 其他分享 >opencv学习:calcHist 函数绘制图像直方图及代码实现

opencv学习:calcHist 函数绘制图像直方图及代码实现

时间:2024-09-15 20:21:34浏览次数:13  
标签:phone cv2 calcHist opencv 直方图 灰度 图像 256

cv2.calcHist 函数是 OpenCV 库中用于计算图像直方图的函数。直方图是一种统计图像中像素值分布的工具,它可以提供图像的亮度、颜色等信息。这个函数可以用于灰度图像和彩色图像。

函数语法

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

参数

  • images: 图像数组或图像列表。对于单通道图像(如灰度图像),只需一个图像;对于多通道图像(如彩色图像),可以传入多个图像。
  • channels: 需要计算直方图的通道索引列表。对于灰度图像,通常传入 [0];对于彩色图像,可以传入 [0](蓝色通道)、[1](绿色通道)、[2](红色通道)。
  • mask: 可选参数,用于指定计算直方图的区域。如果为 None,则计算整个图像的直方图。如果提供了掩码图像,直方图将只计算掩码非零区域的像素值。
  • histSize: 直方图的大小,即直方图的“bin”数量。对于灰度图像,通常设置为 [256],因为像素值的范围是 0 到 255。
  • ranges: 像素值的范围。对于灰度图像,通常设置为 [0, 256]
  • accumulate: 可选参数,用于指定是否在现有的直方图上累加。默认为 False

返回值

  • hist: 计算得到的直方图,是一个一维数组。

代码步骤

  1. 读取灰度图像

    • 使用 cv2.imread 读取图像,并将其转换为灰度图像。
    • cv2.IMREAD_GRAYSCALE 指定读取图像时将其转换为灰度图像。
      phone=cv2.imread("phone.png",cv2.IMREAD_GRAYSCALE)
  2. 展平灰度图像

    • 使用 numpy.ravel 将灰度图像的二维数组展平为一维数组,以便绘制直方图。
      a=phone.ravel()
  3. 绘制灰度图像直方图

    • 使用 matplotlib.pyplot.hist 绘制灰度图像的直方图,其中 bins=256 表示将直方图分为256个区间。
      # 使用 matplotlib 绘制灰度图像的直方图
      # bins=256 表示将直方图分为256个区间
      plt.hist(a, bins=256)
      plt.show()
  4. 计算灰度图像直方图(OpenCV方法)

    • 使用 cv2.calcHist 计算灰度图像的直方图,其中直方图分为16个区间。
      # 使用 OpenCV 计算灰度图像的直方图
      # 直方图分为16个区间
      phone_hist = cv2.calcHist([phone], [0], None, [16], [0, 256])
  5. 绘制灰度图像直方图(OpenCV方法)

    • 使用 matplotlib.pyplot.plot 绘制计算得到的灰度图像直方图。
      # 绘制计算得到的灰度图像直方图
      plt.plot(phone_hist)
      plt.show()
      
  6. 读取彩色图像

    • 使用 cv2.imread 读取彩色图像。
      # 读取名为 "phone.png" 的彩色图像
      img = cv2.imread("phone.png")
  7. 定义颜色通道列表

    • 定义一个包含蓝色、绿色和红色通道的列表。
      # 定义颜色通道的列表
      color = ('b', 'g', 'r')
      
  8. 计算并绘制彩色图像直方图

    • 遍历每个颜色通道,使用 cv2.calcHist 计算每个通道的直方图,并将直方图分为256个区间。
    • 使用 matplotlib.pyplot.plot 绘制每个通道的直方图,并使用对应的颜色绘制。
      
      # 遍历每个颜色通道
      for i, col in enumerate(color):
          # 计算每个颜色通道的直方图
          # 直方图分为256个区间
          histr = cv2.calcHist([img], [i], None, [256], [0, 256])
          
          # 绘制每个颜色通道的直方图
          # 使用对应的颜色绘制
          plt.plot(histr, color=col)
  9. 显示彩色图像直方图

    • 使用 matplotlib.pyplot.show 显示绘制的彩色图像直方图。
      # 显示绘制的彩色图像直方图
      plt.show()

完整代码

import cv2
import matplotlib.pyplot as plt
import numpy as np

# 读取名为 "phone.png" 的图像,并将其转换为灰度图像
phone = cv2.imread("phone.png", cv2.IMREAD_GRAYSCALE)

# 将灰度图像的二维数组展平为一维数组
a = phone.ravel()

# 使用 matplotlib 绘制灰度图像的直方图
# bins=256 表示将直方图分为256个区间
plt.hist(a, bins=256)
plt.show()

# 使用 OpenCV 计算灰度图像的直方图
# 直方图分为16个区间
phone_hist = cv2.calcHist([phone], [0], None, [16], [0, 256])

# 绘制计算得到的灰度图像直方图
plt.plot(phone_hist)
plt.show()

# 读取名为 "phone.png" 的彩色图像
img = cv2.imread("phone.png")

# 定义颜色通道的列表
color = ('b', 'g', 'r')

# 遍历每个颜色通道
for i, col in enumerate(color):
    # 计算每个颜色通道的直方图
    # 直方图分为256个区间
    histr = cv2.calcHist([img], [i], None, [256], [0, 256])
    
    # 绘制每个颜色通道的直方图
    # 使用对应的颜色绘制
    plt.plot(histr, color=col)

# 显示绘制的彩色图像直方图
plt.show()

实验结果

标签:phone,cv2,calcHist,opencv,直方图,灰度,图像,256
From: https://blog.csdn.net/mohanyelong/article/details/142218526

相关文章

  • opencv学习:图像下采样和上采样及拉普拉斯金字塔
    图像下采样和上采样OpenCV(OpenSourceComputerVisionLibrary)是一个开源的计算机视觉和机器学习软件库,它提供了大量的图像处理功能,包括图像的上采样和下采样。下采样(Downsampling)下采样是减少图像分辨率的过程,通常用于图像压缩、图像分析等场景。在OpenCV中,下采样可以通过......
  • opencv学习:图像旋转的两种方法,旋转后的图片进行模板匹配代码实现
    图像旋转在图像处理中,rotate和rot90是两种常见的图像旋转方法,它们在功能和使用上有一些区别。下面我将分别介绍这两种方法,并解释它们的主要区别rot90 方法rot90方法是NumPy提供的一种数组旋转函数,它主要用于对二维数组(如图像)进行90度的旋转。这个方法比较简单,只支持9......
  • opencv学习:信用卡卡号识别
    该代码用于从信用卡图像中自动识别和提取数字信息。该系统将识别信用卡类型,并输出信用卡上的数字序列。1.创建命令行参数数字模板信用卡#创建命令行参数解析器ap=argparse.ArgumentParser()#添加命令行参数-i/--image,指定输入图像路径ap.add_argument("-i","--i......
  • OpenCV和Tesseract OCR识别复杂验证码喽~~
    目录代码实现思路流程:主要流程:整体代码效果展示原图处理之后的图总结流程图代码实现思路使用OpenCV进行图像预处理,并通过TesseractOCR来识别验证码中的字符。以下是其实现思路的详细讲解:流程:加载验证码图像:使用cv2.imread()读取验证码图片,将其加载为......
  • OpenCV运动分析和目标跟踪(1)累积操作函数accumulate()的使用
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述将一个图像添加到累积图像中。该函数将src或其部分元素添加到dst中:dst(......
  • 新电脑安装和配置pytorch、anaconda、CUDA、cuDNN、pycharm、OpenCV的过程记录
    显卡驱动和CUDA一、升级显卡驱动到官方最新版    1、打开英伟达官网,输入显卡芯片型号,手动搜索并下载显卡驱动。 NVIDIA官方驱动 ​    2、下载完成后安装驱动。 二、确认显卡支持的最高CUDA版本    1、键盘"win+R",调出运行输入cmd后点”......
  • OpenCV(cv::split())
    目录1.函数定义2.工作原理3.示例4.使用场景5.注意事项cv::split()是OpenCV提供的一个函数,用于将多通道图像分割成其各个单通道。该函数主要用于处理彩色图像和多通道矩阵,通常用于对图像中的每个颜色通道单独进行处理。1.函数定义voidcv::split(constMat&src,s......
  • OpenCV添加中文文字
    代码如下,随机在摄像头中添加文字importcv2importnumpyasnpfromrandomimportrandintfromPILimportImage,ImageDraw,ImageFontCOLOR=(255,0,0)font_size=24cap=cv2.VideoCapture(0)whilecap.isOpened():ret,frame=cap.read()width,height......
  • OpenCV(cv::dilate())
    目录1.函数定义2.工作原理3.示例4.应用场景5.膨胀和腐蚀的对比总结cv::dilate()是OpenCV中用于图像形态学变换的函数之一,与cv::erode()相对,它执行图像的膨胀操作。膨胀是一种将图像中的前景(白色区域)扩展的操作,通常用于填补图像中的小孔洞、连接分离的物体、或增强图......
  • OpenCV(cv::erode())
    目录1.函数定义2.工作原理3.示例4.应用场景总结cv::erode()是OpenCV中的图像形态学变换函数之一,用于执行图像的腐蚀操作。腐蚀是一种将图像中的白色区域缩小的操作,通常用于去除噪声、分离相邻的物体,或将小的图像细节消除。1.函数定义voidcv::erode(InputArraysrc......