图像直方图计算

news2024/11/17 1:31:03

1. 图像直方图(Image histogram)

图像直方图,又叫影像直方图,是一种用来表现数位影像中像素分布的直方图,根据统计影像中不同亮度的像素总数,我们可以画出一张代表这张影像的影像直方图,透过这张直方图我们可以一眼就看出这张图中像素的分布情形。

图像直方图由于其计算代价较小,且具有图像平移、旋转、缩放不变性等众多优点,广泛地应用于图像处理的各个领域,特别是灰度图像的阈值分割、基于颜色的图像检索以及图像分类。

2 图像直方图的计算

直方图计算,即计算图像中每个像素值的出现次数,然后根据像素值范围,将像素值分成一定数量的区间,然后计算每个区间内的像素值出现次数,最后将这些出现次数绘制在一张直方图上。

2.1 彩色图像的直方图

使用 OpenCV-Python 的 calcHist 以及 matplotlib 库,我们可以这样计算并绘制一个彩色图像的直方图。

import cv2
import matplotlib.pyplot as plt

# 读取图像
img = cv2.imread('../data/park.jpg')

# 分离BGR颜色通道
b, g, r = cv2.split(img)

# 设置直方图大小
hist_size = 256

# 设置直方图范围,左闭右开区间,最大值为255
hist_range = [0, 256]

# 计算直方图
b_hist = cv2.calcHist([b], [0], None, [hist_size], hist_range)
g_hist = cv2.calcHist([g], [0], None, [hist_size], hist_range)  
r_hist = cv2.calcHist([r], [0], None, [hist_size], hist_range)

# 绘制直方图
fig, ax = plt.subplots(1, 1)    # 创建一个子图及布局,BGR三个通道都绘制到一个图上
ax.plot(b_hist, color='b', label='B')
ax.plot(g_hist, color='g', label='G')
ax.plot(r_hist, color='r', label='R')
ax.set_xlim(hist_range)   # 设置x轴范围
ax.legend() # 显示图例  
plt.show()  # 显示图像

直方图曲线

以条形图方式表达直方图:

import cv2
import matplotlib.pyplot as plt

# 读取图像
image_path = '../data/park.jpg'
image = cv2.imread(image_path)  # 读取彩色图像

# 计算直方图
b_hist = cv2.calcHist([image], [0], None, [256], [0, 256])
g_hist = cv2.calcHist([image], [1], None, [256], [0, 256])
r_hist = cv2.calcHist([image], [2], None, [256], [0, 256])

# 绘制直方图
plt.figure(figsize=(10, 6))

# 使用bar函数绘制直方图
plt.bar(range(256), b_hist.ravel(), color='blue', alpha=0.7)
plt.bar(range(256), g_hist.ravel(), color='green', alpha=0.7)
plt.bar(range(256), r_hist.ravel(), color='red', alpha=0.7)

# 设置标题和轴标签
plt.title('Histogram of the Image')
plt.xlabel('Intensity Value')
plt.ylabel('Frequency')

# 显示网格
plt.grid(axis='y', linestyle='--', alpha=0.7)

# 显示图表
plt.show()

BGR直方图

2.2 灰度图像直方图

灰度图像的直方图计算与彩色图像的直方图计算类似,可以读入灰度图进行计算。但是对于一个彩色图像,我们既可以通过 cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) 直接读入灰度图,也可以通过 cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 将彩色图转化为灰度图。通过比较,这两个方法得到的灰度图可能非常相似(本例相似度为0.9996933300209153),但事实上并不一致。

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

# 读取图像
image_path = '../data/park.jpg'
image = cv2.imread(image_path) 
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
read_gray = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)

# 计算直方图
b_hist = cv2.calcHist([image], [0], None, [256], [0, 256])
g_hist = cv2.calcHist([image], [1], None, [256], [0, 256])
r_hist = cv2.calcHist([image], [2], None, [256], [0, 256])

cvt_gray_hist = cv2.calcHist([image_gray], [0], None, [256], [0, 256])
read_gray_hist = cv2.calcHist([read_gray], [0], None, [256], [0, 256])

# 绘制直方图
fig, axes = plt.subplots(3, 2, figsize=(15, 15))

# 显示图像
axes[0, 0].imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
axes[1, 0].imshow(image_gray, cmap='gray')
axes[2, 0].imshow(read_gray, cmap='gray')

# 使用bar函数绘制直方图
axes[0, 1].bar(range(256), b_hist.ravel(), color='blue', alpha=0.7)
axes[0, 1].bar(range(256), g_hist.ravel(), color='green', alpha=0.7)
axes[0, 1].bar(range(256), r_hist.ravel(), color='red', alpha=0.7)

axes[1, 1].bar(range(256), cvt_gray_hist.ravel(), color='gray')

axes[2, 1].bar(range(256), read_gray_hist.ravel(), color='gray')

# 显示网格
axes[0, 1].grid(axis='y', linestyle='--', alpha=0.7)
axes[1, 1].grid(axis='y', linestyle='--', alpha=0.7)
axes[2, 1].grid(axis='y', linestyle='--', alpha=0.7)

# 设置图表标题和坐标轴标签
axes[0, 0].set_title('Original Image')
axes[1, 0].set_title('Gray Image')
axes[2, 0].set_title('Read Gray Image')
axes[0, 1].set_title('BGR Histogram')
axes[1, 1].set_title('Converted Gray Histogram')
axes[2, 1].set_title('Read Gray Histogram')

# 显示图表
plt.show()

similarity = cv2.compareHist(cvt_gray_hist, read_gray_hist, cv2.HISTCMP_CORREL)
print(f"The similarity between the two images is:{similarity} ")

diff = cv2.absdiff(image_gray, read_gray)
plt.plot(diff)
plt.show()
total_nonzero = np.count_nonzero(diff)
print("Total non-zero elements:", total_nonzero)

图像比较

The similarity between the two images is:0.9996933300209153 

两种灰度图差异情况

Total non-zero elements: 16351

因此,直接通过 cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) 读入的灰度图和 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 转换的灰度图,是不一样的,在开发时需要注意这个问题。

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

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

相关文章

排序算法【快速排序】

一、快速排序算法原理 直接采用实际的例子解释原理&#xff0c;实际的数组如下图所示。 排序算法流程如下所示 然后按照上面顺序递归下去&#xff0c;直到排序完成推出。 二、算法代码 #include <stdio.h> #include "test.h"/* 快速排序算法 */ void quick_s…

Camera基础知识系列(1)——凸\凹透镜

目录 前言 一. 凸\凹透镜 1 凸透镜 1.1 凸透镜成像 1.2 物距\像距 1.3 凸透镜成像规律 2. 凹透镜 2.1 凹透镜成像规律 二. 相机 相机镜头 前言 平日里总是时不时地听到别人讲起一些摄影相关的术语&#xff0c;比如&#xff1a;光圈、焦距、等效焦距、EV、画幅、景深、快门…

使用Qdrant+FastText实现向量存储和检索

1 概述 在《使用FastText库训练词向量》一文中&#xff0c;已经训练并保存好了一个用 FastText 训练的词向量模型-model_0809_001。在接下来的实践中&#xff0c;将直接使用该词向量模型来生成对应数据的向量&#xff0c;然后将向量和对应的负载存储到 Qdrant 中&#xff0c;然…

基于Conda的Python版本管理与Python包管理

文章目录 前言Conda是什么Conda与Anaconda安装Anaconda安装包windows v2024.06-1安装包更多版本安装包(Windows/Mac/Linux) 安装 使用步骤创建Python环境激活Python环境安装Python包列出和切换 Python 版本管理多个环境 总结 前言 开发环境中&#xff0c;需要使用不同的Python…

eNSP 华为三层交换机配置DHCP

华为三层交换机配置DHCP 华为DHCP原理&#xff1a;&#xff08;思科四个都是广播包&#xff09; 1、客户端广播发送DHCP Discover包。用于发现当前局域网中的DHCP服务器。 2、DHCP服务器单播发送DHCP Offer包给客户端。携带分配给客户端的IP地址。 3、客户端广播发送DHCP Resqe…

如何给Airtest脚本/报告增加log记录

1. 前言 尽管Airtest脚本运行过程中会输出非常丰富的log信息&#xff0c;并且Airtest报告也会把我们脚本的的运行步骤显示出来&#xff0c;但有时候&#xff0c;我们会需要在脚本里面&#xff0c;插入一些自定义的log内容&#xff08;比如某些关键点&#xff09;&#xff0c;并…

UR5e机器人Gazebo仿真模拟

Gazebo仿真环境 Gazebo是一款开源的机器人仿真平台&#xff0c;基于物理引擎&#xff0c;能够模拟机器人在真实世界中的运动和交互。它支持多种机器人模型与传感器&#xff0c;以及丰富的环境场景&#xff0c;为机器人研发提供了便捷的测试平台。 UR5e机器人Gazebo仿真模拟步骤…

基于Windows系统和‌Linux系统,以tomcat为案例,讲解如何新增自启动服务。

文章目录 引言‌I Linux系统‌(以CentOS为例)基础知识:运行级别(run level)基于chkconfig 工具,设置服务启动类型。基于systemctl 新增系统服务制定定时任务优化停止Tomcat服务命令II 基于Windows系统设置服务自启动的常规操作安装多个tomcat服务,并设置自启动。引言 场景…

IDEA中@Test测试时无法通过键盘输入

在IDEA中使用Test发现Scanner无法在控制台输入&#xff0c;如下所示&#xff1a; 发现这里是只读模式&#xff0c;无法进行输入。 解决方案&#xff1a; 找到编辑虚拟机选项&#xff0c;添加如下&#xff1a; -Deditable.java.test.consoletrue 如下所示:(重启一次IEDA)

R语言统计分析——多元线性回归

参考资料&#xff1a;R语言实战【第2版】 1、多元线性回归 当预测变量不止一个时&#xff0c;简单线性回归就变成了多元线性回归。从技术上来说&#xff0c;多项式回归可以算是多元线性回归的特例&#xff1a;二次回归有两个预测变量&#xff08;X和X^2&#xff09;。 以基础包…

使用DOM破坏启动xss

实验环境&#xff1a; Lab: Exploiting DOM clobbering to enable XSS | Web Security Academy (portswigger.net) 分析&#xff1a; 找破坏点&#xff1a; 第一个输入框可以看见是<texarrea>;不能插入语句.&#xff1a; 构造一个语句试试 <img src1 οnerrοraler…

深入理解HTTPS协议:CA证书的安全机制

文章目录 一、HTTP的不足二、HTTP 加密 证书 完整性保护 HTTPS三、加密与解密1、对称密钥加密2、非对称密钥加密3、证书 一、HTTP的不足 HTTP 主要有这些不足&#xff0c;例举如下&#xff1a; 通信使用明文&#xff08;不加密&#xff09;&#xff0c;内容可能会被窃听不…

kettle获取URL接口数据

使用kettle获取URL接口数据结果保留到文件里 1 生成记录里添加URL信息 2 使用Rest_Client组件处理URL数据结果保存到字段里&#xff08;json的&#xff09; 3 使用json_input 组件处理json数据 4 保存结果到文件里

【protobuf】ProtoBuf——proto3语法详解、字段规则、消息类型的定义与使用、通讯录的写入和读取功能实现

文章目录 ProtoBuf5. proto3语法详解5.1 字段规则5.2 消息类型的定义与使用 ProtoBuf 5. proto3语法详解 在语法详解部分&#xff0c;依旧通过项目推进的方式开展教学。此部分会对通讯录多次升级&#xff0c;用 2.x 表示升级的版本&#xff0c;最终将完成以下内容的升级&#x…

2 C 语言开发工具的选择、 MinGW 的安装与配置、VS Code 的安装与配置、插件推荐

目录 1 开发工具的选择 1.1 Visual Studio 1.2 Code::Block 1.3 Clion 1.4 VS Code 1.5 在线编辑工具 2 开发工具安装 2.1 安装 MinGW-w64 2.1.1 MinGW-w64 介绍 2.1.2 解压 MinGW 2.1.3 将 MinGW 添加至环境变量 2.1.4 验证安装 2.2 安装 VS Code 2.2.1 下载安装…

无刷直流电机的个人总结

电机分类 主要分为两大类&#xff1a;有刷电机&#xff0c;无刷电机 有刷电机 原理图截图来源&#xff0c;工作原理就是对转子线圈通电后产生磁性和外壳中的永磁体相互作用&#xff0c;导致转子转动。而在转子转动过程中如果不改变电流方向&#xff0c;那么磁性不变&#xf…

ROS机械臂——ROS结合OpenCV案例(含资源)

纲要 摄像头驱动 图像属性 图像压缩 ### Realsense摄像头 点云展示 ### 点云图像属性 ## 摄像头标定 摄像头标定流程 如何使用标定文件 OpenCV ROS与OpenCV的集成框架 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b0ff143b710543839325d19c7a3c04c5.png R…

【Mysql】Xtrabackup备份恢复(Mysql5.6/5.7/8.0)

目录 一、前言 二、Mysql8.0为例 1、安装Xtraback工具 1&#xff09;mysql8.0.x版本 2&#xff09;mysql5.6、5.7版本 2、备份操作 3、恢复操作 一、前言 官网下载地址&#xff1a;Software Downloads - Percona 本测试环境&#xff1a;centos_x86、mysql8.0.39、mysq…

Nginx的源码编译

一:Nginx 介绍 Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务 器 解决C10K问题&#xff08;10K Connections&#xff09; Nginx功能&#xff1a;静态的web资源服务器html&#xff0c;图片&#xff0c;js&#xff0c;css&#xff…

【记git 重命名文件失败,和正确方法】

【背景】 想要重命名一个文件&#xff0c;并同步到远程 【过程】 1.我是直接把 “驱动增加he.c” 文件重命名为 “驱动增加播放he接口方法” &#xff0c;想着直接提交就会同步重命名git仓记录的文件名。然后就可以推送到远程仓库&#xff0c;同步重命名远程仓库的文件名。 2.然…