使用 OpenCV 和 Matplotlib:绘制其彩色直方图以及拓展

news2025/1/9 16:58:20

如何使用 OpenCV 和 Matplotlib 读取、处理并显示图像。即将为您解答:

16c94443403f46aa9833abb977c67253.jpeg

绘制其彩色直方图

代码解释

  1. 读取图像并转换颜色空间

     
    image = cv2.imread('001.jpg')
    image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    

    • cv2.imread('001.jpg'):从文件中读取图像,图像默认以 BGR 格式加载。
    • cv2.cvtColor(image, cv2.COLOR_BGR2RGB):将图像从 BGR 格式转换为 RGB 格式,便于 Matplotlib 正确显示。
  2. 拆分通道

     
    channels = cv2.split(image)
    colors = ('b', 'g', 'r')
    

    • cv2.split(image):将图像的 BGR 三个通道分开,分别对应蓝色、绿色、红色。
    • colors:定义颜色顺序,用于在直方图中标记不同通道。
  3. 创建图形和子图

     
    fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8), gridspec_kw={'height_ratios': [1, 3]})
    

    • plt.subplots(2, 1):创建一个包含两个子图的图形,图像的布局为上下结构。
    • figsize=(10, 8):设置图形的大小,宽度为 10 英寸,高度为 8 英寸。
    • gridspec_kw={'height_ratios': [1, 3]}:设置子图的高度比例,上方直方图高度为 1,图像高度为 3。
  4. 绘制彩色直方图

     
    for (channel, color) in zip(channels, colors):
        hist = cv2.calcHist([channel], [0], None, [256], [0, 256])
        ax1.plot(hist, color=color, linewidth=2.5, alpha=0.75)
    

    • cv2.calcHist([channel], [0], None, [256], [0, 256]):计算每个颜色通道的直方图,256 个 bins 表示像素值范围从 0 到 255。
    • ax1.plot(hist, color=color, linewidth=2.5, alpha=0.75):在 ax1 子图上绘制每个通道的直方图,不同颜色曲线对应不同通道。
  5. 设置直方图子图

     
    ax1.set_title('Color Histogram', fontsize=15)
    ax1.set_xlabel('Bins', fontsize=12)
    ax1.set_ylabel('# of Pixels', fontsize=12)
    ax1.grid(color='gray', linestyle='--', linewidth=0.5)
    ax1.set_xlim([0, 256])
    ax1.set_xticks([])
    ax1.set_yticks([])
    

    • 设置标题、轴标签、网格线,并移除坐标轴的刻度。
  6. 显示图像

     
    ax2.imshow(image_rgb)
    ax2.set_title('Original Image', fontsize=15)
    ax2.axis('off')
    

    • ax2 子图上显示原始图像,并设置标题,移除坐标轴。
  7. 调整布局并显示

     
    plt.tight_layout()
    plt.show()
    

    • plt.tight_layout():自动调整子图之间的间距,使图形布局更加紧凑。
    • plt.show():显示图形。

总结

  • 功能:该代码实现了图像的读取、颜色直方图的计算与绘制,并将图像和直方图在同一个图形中显示。
  • 目的:直方图提供了图像像素值的分布情况,而图像显示则有助于直观理解图像内容,两者结合能够更好地分析图像的颜色信息。

整体代码

import cv2
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread('001.jpg')
# 将图像从 BGR 转换为 RGB 格式
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 拆分通道
channels = cv2.split(image)
colors = ('b', 'g', 'r')

# 创建一个包含两个子图的图形
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8), gridspec_kw={'height_ratios': [1, 3]})

# 绘制直方图在第一个子图
ax1.set_title('Color Histogram', fontsize=15)
ax1.set_xlabel('Bins', fontsize=12)
ax1.set_ylabel('# of Pixels', fontsize=12)
ax1.grid(color='gray', linestyle='--', linewidth=0.5)

for (channel, color) in zip(channels, colors):
    hist = cv2.calcHist([channel], [0], None, [256], [0, 256])
    ax1.plot(hist, color=color, linewidth=2.5, alpha=0.75)

ax1.set_xlim([0, 256])
ax1.set_xticks([])
ax1.set_yticks([])

# 绘制图像在第二个子图
ax2.imshow(image_rgb)
ax2.set_title('Original Image', fontsize=15)
ax2.axis('off')

# 调整布局,使图形更加紧凑
plt.tight_layout()

plt.show()

效果展示

477f722a415c45058c5faa2046437223.png


a3a1b42fd86a41919f4e1c72cbb0b965.jpeg

衍生操作

1.色彩平衡和直方图均衡化

代码说明

  • 图像读取与颜色空间转换

    • 首先,使用 cv2.imread() 函数读取图像,并将其从 BGR 格式转换为 RGB 格式,以便使用 Matplotlib 显示。
  • 通道分离与直方图均衡化

    • 将图像的 RGB 通道分离出来,并对每个通道单独进行直方图均衡化处理,以平衡颜色和改善对比度。
  • 图像合并与显示

    • 将均衡化后的通道合并成一张图像,并使用 Matplotlib 显示原始图像、均衡化图像以及它们对应的直方图。

整体代码

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

# 读取图像
image = cv2.imread('001.jpg')

# 将图像从 BGR 转换为 RGB 格式
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# 分离图像的三个通道
r, g, b = cv2.split(image_rgb)

# 对每个通道应用直方图均衡化
r_equalized = cv2.equalizeHist(r)
g_equalized = cv2.equalizeHist(g)
b_equalized = cv2.equalizeHist(b)

# 合并均衡化后的通道
equalized_image = cv2.merge((r_equalized, g_equalized, b_equalized))

# 创建一个包含原始图像和均衡化图像的图形
plt.figure(figsize=(12, 6))

# 显示原始图像
plt.subplot(2, 2, 1)
plt.imshow(image_rgb)
plt.title('Original Image')
plt.axis('off')

# 显示均衡化图像
plt.subplot(2, 2, 2)
plt.imshow(equalized_image)
plt.title('Histogram Equalized Image')
plt.axis('off')

# 显示原始图像的直方图
plt.subplot(2, 2, 3)
for channel, color in zip([r, g, b], ['r', 'g', 'b']):
    hist = cv2.calcHist([channel], [0], None, [256], [0, 256])
    plt.plot(hist, color=color)
plt.title('Original Histogram')
plt.xlim([0, 256])
plt.xlabel('Pixel Intensity')
plt.ylabel('Frequency')

# 显示均衡化图像的直方图
plt.subplot(2, 2, 4)
for channel, color in zip([r_equalized, g_equalized, b_equalized], ['r', 'g', 'b']):
    hist = cv2.calcHist([channel], [0], None, [256], [0, 256])
    plt.plot(hist, color=color)
plt.title('Equalized Histogram')
plt.xlim([0, 256])
plt.xlabel('Pixel Intensity')
plt.ylabel('Frequency')

# 调整布局并显示图像
plt.tight_layout()
plt.show()

效果展示

905476b436784265b65441c8e50c2843.png


2.动态直方图和实时摄像头图像分析

代码说明

  • 摄像头初始化

    • cap = cv2.VideoCapture(0) 用于初始化摄像头。参数 0 表示使用默认摄像头。
  • 实时视频捕捉

    • 使用 cap.read() 从摄像头捕捉实时视频帧。
  • 颜色空间转换

    • 使用 cv2.cvtColor() 将 BGR 图像转换为 RGB 格式,以便 Matplotlib 正确显示颜色。
  • 直方图计算

    • 将图像的 RGB 通道分离,并使用 cv2.calcHist() 计算每个通道的直方图。
  • 动态更新图像和直方图

    • 使用 Matplotlib 的交互模式 (plt.ion()) 实时更新图像和直方图。
    • 每次读取一帧图像时,先清除之前的图像和直方图,然后重新绘制。
  • 按键退出

    • 在循环中检测键盘按键,如果按下 q 键,则退出循环,停止视频捕捉并关闭窗口。

整体代码

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

# 初始化摄像头
cap = cv2.VideoCapture(0)

# 创建一个窗口来显示视频流和直方图
plt.ion()  # 打开交互模式
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8), gridspec_kw={'height_ratios': [1, 3]})

while True:
    # 读取摄像头的一帧
    ret, frame = cap.read()
    if not ret:
        break

    # 将图像从 BGR 转换为 RGB 格式
    image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    # 分离图像的三个通道
    r, g, b = cv2.split(image_rgb)

    # 清除之前的图像和直方图
    ax1.clear()
    ax2.clear()

    # 显示当前帧
    ax2.imshow(image_rgb)
    ax2.set_title('Real-Time Camera Feed', fontsize=15)
    ax2.axis('off')

    # 计算直方图并绘制
    ax1.set_title('Color Histogram', fontsize=15)
    ax1.set_xlabel('Bins', fontsize=12)
    ax1.set_ylabel('# of Pixels', fontsize=12)
    ax1.grid(color='gray', linestyle='--', linewidth=0.5)

    for (channel, color) in zip([r, g, b], ['r', 'g', 'b']):
        hist = cv2.calcHist([channel], [0], None, [256], [0, 256])
        ax1.plot(hist, color=color, linewidth=2.5, alpha=0.75)

    ax1.set_xlim([0, 256])

    # 刷新绘图窗口
    plt.pause(0.001)

    # 检测按键,按 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头并关闭所有窗口
cap.release()
cv2.destroyAllWindows()
plt.ioff()
plt.show()

 效果展示

5f62671e2990464ebb747f2d87209799.png

700d3bb1d84d46f6b96c20bebcba29d2.png


180a2519cc854002aefb334188fbf512.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2143322.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#基于SkiaSharp实现印章管理(7)

印章中的文本主要分为两种:1)从左向右水平绘制的文本;2)沿指定路径绘制的文本。前者使用SKCanvas的DrawText绘制文本,后者则使用SKCanvas的DrawTextOnPath绘制文本。   针对上述情况,调整SealElement类型…

Python编码系列—Python代理模式:为对象赋予超能力的魔法

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

【自学笔记】支持向量机(2)——核函数

引入 核函数的功能是将一组数据映射到更高维的特征空间,这样可以让在低维无法线性分类的数据能够在高维空间下被分类。   可以证明,如果原始数据是有限的维度,那么一定存在一个高维特征空间使得样本线性可分。 文章内容由《机器学习》相关内…

地平线秋招2025

【地平线秋招】 中秋卷起来!!! 内推码 kbrfck 内推码 kbrfck 内推码 kbrfck 投递链接:https://wecruit.hotjob.cn/SU62d915040dcad43c775ec12c/mc/position/campus?acotycoCodekbrfck&recruitType1&isLimitShowPostScope…

Ubantu和Centos7一键shell更换镜像源与Linux系统Python3环境安装

目录 前言 1.一键更换源 1.1 创建文件 1.2 向环境赋予可执行的权限 2.Linux系统配置Python3环境 2.1 查看当前python环境 2.2 更换源 2.3 安装所需的依赖 2.4.下载python环境文件 2.5.解压文件 2.6 进行编译 2.7 开始安装 2.8 设置软连接 2.9 测试是否安装成功…

苍穹外卖Day01-2

导入接口文档 yApi接口管理平台http://api.doc.jiyou-tech.com/ 创建项目 导入接口文件 导入结果界面 Swagger 介绍 使用Swagger你只需要按照它的规范去定义接口及接口相关的信息,就可以做到生成接口文档,以及在线接口调试页面。 官网:ht…

计算机人工智能前沿进展-大语言模型方向-2024-09-16

计算机人工智能前沿进展-大语言模型方向-2024-09-16 1. Securing Large Language Models: Addressing Bias, Misinformation, and Prompt Attacks B Peng, K Chen, M Li, P Feng, Z Bi, J Liu, Q Niu - arXiv preprint arXiv:2409.08087, 2024 保护大型语言模型:…

走进低代码表单开发(三):高效业务功能构建

前面我们已经介绍了勤研低代码开发平台的页面设计相关的内容,当页面设计完成后,我们将继续进行表单的功能开发,接下来,我们一起走进勤研低代码开发平台高效便捷的表单功能设计,来看看勤研低代码平台如何为用户带来全新…

MFC实现对话框与控件的自适应调节

一.对话框属性设置 先将对话框的Border属性由Dialog Frame设置为Resizing。 二.添加消息处理函数 类向导 -> 消息(WM-SIZE)添加处理函数->void COnshowDlg::OnSize(UINT nType, int cx, int cy)。 三.添加代码 在.h文件中声明: vo…

每日一题——第九十九题

// PrintUniqueChart.cpp : 此文件包含 “main” 函数。程序执行将在此处开始并结束。 // // 设计算法&#xff0c;打印如下图案&#xff1a; #include<stdio.h>int main() {int i, j;for (i 0; i < 5; i){//每行开始先打印空格//控制每行前的空格for (int space 0…

gitee远程仓库OPEN GIT BASH HERE从错误中学习

推荐一个ai软件&#xff08;搜索器搜索kimi&#xff09;&#xff0c;是一个ai&#xff0c;有什么错误跟着一步步解决就可以了 当你创建一个仓库 会出现这些 打开这个窗口跟着敲就行了 到这里为止我还没出现错误&#xff0c;后面我把remote add添加远程仓库的地址输错地址了 所…

网络安全-ssrf

目录 一、环境 二、漏洞讲解 三、靶场讲解 四、可利用协议 4.1 dict协议 4.2 file协议 4.3 gopher协议 五、看一道ctf题吧&#xff08;长亭的比赛&#xff09; 5.1环境 5.2开始测试 ​编辑 一、环境 pikachu&#xff0c;这里我直接docker拉取的&#xff0c;我只写原…

【H2O2|全栈】关于CSS(5)如何制作一个搜索网页的首页?

目录 CSS基础知识 前言 准备工作 简单网页的组成部分 案例 浏览器的窗口大小 划分主要部分 固定定位 头部导航&#xff08;左侧&#xff09; 头部导航&#xff08;右侧&#xff09; LOGO ​编辑搜索框 热搜标题 热搜内容 文字简介 资源 预告和回顾 后话 CSS…

孙怡带你深度学习(2)--PyTorch框架认识

文章目录 PyTorch框架认识1. Tensor张量定义与特性创建方式 2. 下载数据集下载测试展现下载内容 3. 创建DataLoader&#xff08;数据加载器&#xff09;4. 选择处理器5. 神经网络模型构建模型 6. 训练数据训练集数据测试集数据 7. 提高模型学习率 总结 PyTorch框架认识 PyTorc…

Visual Studio 2019/2022 IntelliCode(AI辅助IntelliSense)功能介绍

IntelliCode 不知在多久以前&#xff0c;我装上了Visual Studio 2019&#xff0c;写代码时&#xff0c;就注意到了下面这样的东西&#xff1a;带五角星的提示。 这个带五角星的提示功能叫做IntelliCode。 我们知道Visual Studio 有个强大的功能叫做Intellisense(智能感知)&am…

【Linux系统编程】信号的保存与处理

目录 一&#xff0c;信号的保存 1-1&#xff0c;core与Term终止信号 1-2&#xff0c;进程退出与信号的关系 1-3&#xff0c;信号在内核中的表示 1-4&#xff0c;信号操作函数 二&#xff0c;信号的处理 2-1&#xff0c;信号被处理的时期 2-2&#xff0c;内核实现信号的…

马匹行为识别系统源码分享

马匹行为识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

C++ Primer Plus(速记版)-高级主题

第十七章 用于大型程序的工具 C 解决问题规模多样&#xff0c;对复杂问题尤其需用异常处理、命名空间和多重继承增强代码管理、库整合和概念表达&#xff0c;以适应大规模编程对错误处理、模块组合及高级功能设计的高要求。 17.1. 异常处理 异常处理允许C程序中不同部分通过抛…

解决Tez报错问题

在启动hive的时候&#xff0c;发现该报错 1、检测HADOOP_PATH环境变量 echo $HADOOP_CLASSPATH 如果没有输出&#xff0c;说明我们的配置文件没有生效&#xff0c;这时候需要重写source一下 2、刷新配置文件生效 source /etc/profile 有输出&#xff0c;环境生效 3、再次运…

Matlab simulink建模与仿真 第十八章(Stateflow状态机)

参考视频&#xff1a;Simulink/stateflow的入门培训_哔哩哔哩_bilibili 一、概述 Stateflow是集成于Simulink中的图形化设计与开发工具&#xff0c;主要用于针对控制系统中的复杂控制逻辑进行建模与仿真&#xff0c;或者说&#xff0c;Stateflow适用于针对事件响应系统进行建模…