OpenCV(8):图像直方图

        在图像处理中,直方图是一种非常重要的工具,它可以帮助我们了解图像的像素分布情况。通过分析图像的直方图,我们可以进行图像增强、对比度调整、图像分割等操作。

1 什么是图像直方图?

        图像直方图是图像像素强度分布的图形表示,对于灰度图像,直方图显示了每个灰度级(0到255)在图像中出现的频率,对于彩色图像,我们可以分别计算每个通道(如R、G、B)的直方图。直方图可以帮助我们了解图像的亮度、对比度等信息。例如,如果直方图集中在低灰度区域,说明图像偏暗;如果直方图分布均匀,说明图像对比度较好。

  • 直方图: 表示图像中像素强度的分布情况,横轴表示像素强度值,纵轴表示该强度值的像素数量。
  • 灰度直方图: 针对灰度图像的直方图,表示每个灰度级的像素数量。
  • 颜色直方图: 针对彩色图像的直方图,分别表示每个颜色通道(如 BGR)的像素强度分布。
功能函数说明
计算直方图cv2.calcHist()计算图像的直方图。
直方图均衡化cv2.equalizeHist()增强图像的对比度。
直方图比较cv2.compareHist()比较两个直方图的相似度。
绘制直方图matplotlib.pyplot.plot()使用 Matplotlib 绘制直方图。

        直方图的应用 

  • 图像增强: 通过直方图均衡化,可以增强图像的对比度,使细节更加清晰。
  • 图像分割: 过分析直方图,可以确定阈值,用于图像分割。
  • 图像匹配: 通过比较直方图,可以判断两幅图像的相似度,用于图像匹配和检索。
  • 颜色分析: 通过颜色直方图,可以分析图像的颜色分布,用于颜色校正和风格化处理。

2 OpenCV 中的直方图计算函数

        在 OpenCV 中,我们可以使用 cv2.calcHist() 函数来计算图像的直方图。

cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
  • images: 输入的图像列表,通常是一个包含单通道或多通道图像的列表。例如 [img]
  • channels: 需要计算直方图的通道索引。对于灰度图像,使用 [0];对于彩色图像,可以使用 [0][1][2] 分别计算蓝色、绿色和红色通道的直方图。
  • mask: 掩码图像。如果指定了掩码,则只计算掩码区域内的像素。如果不需要掩码,可以传入 None
  • histSize: 直方图的 bin 数量。对于灰度图像,通常设置为 [256],表示将灰度级分为 256 个 bin。
  • ranges: 像素值的范围。对于灰度图像,通常设置为 [0, 256],表示像素值的范围是 0 到 255。
  • hist: 输出的直方图数组。
  • accumulate: 是否累积直方图。如果设置为 True,则直方图不会被清零,而是在每次调用时累积。

        假设我们有一张灰度图像 img,我们可以使用以下代码计算其直方图:

import cv2
import matplotlib.pyplot as plt# 读取图像
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 计算直方图
hist = cv2.calcHist([img], [0], None, [256], [0, 256])# 绘制直方图
plt.plot(hist)
plt.title('Grayscale Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')
plt.show()

3 直方图均衡化

        直方图均衡化是一种增强图像对比度的方法,通过重新分配像素强度值,使直方图更加均匀。

equalized_image = cv2.equalizeHist(image)
import cv2# 读取图像
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 直方图均衡化
equalized_image = cv2.equalizeHist(img)# 显示结果
cv2.imshow("Equalized Image", equalized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

4 颜色直方图

        对于彩色图像,可以分别计算每个颜色通道的直方图。

import cv2
from matplotlib import pyplot as plt# 读取图像
img = cv2.imread('image.jpg')# 计算 BGR 各通道的直方图
colors = ('b', 'g', 'r')
for i, color in enumerate(colors):hist = cv2.calcHist([img], [i], None, [256], [0, 256])plt.plot(hist, color=color)# 绘制直方图
plt.title("Color Histogram")
plt.xlabel("Pixel Intensity")
plt.ylabel("Pixel Count")
plt.show()

        对于彩色图像,可以对每个通道分别进行直方图均衡化。

import cv2# 读取图像
img = cv2.imread('image.jpg')# 分离通道
b, g, r = cv2.split(img)# 对每个通道进行直方图均衡化
b_eq = cv2.equalizeHist(b)
g_eq = cv2.equalizeHist(g)
r_eq = cv2.equalizeHist(r)# 合并通道
equalized_image = cv2.merge([b_eq, g_eq, r_eq])# 显示结果
cv2.imshow("Equalized Color Image", equalized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

5 直方图比较

        OpenCV 提供了 cv2.compareHist() 函数,用于比较两个直方图的相似度。

similarity = cv2.compareHist(hist1, hist2, method)
  • hist1: 第一个直方图。
  • hist2: 第二个直方图。
  • method: 比较方法,例如 cv2.HISTCMP_CORREL(相关性比较)。
import cv2# 读取图像
img = cv2.imread('image.jpg', 0)
image2 = cv2.imread('bird.jpg', 0)# 计算两个图像的直方图
hist1 = cv2.calcHist([img], [0], None, [256], [0, 256])
hist2 = cv2.calcHist([image2], [0], None, [256], [0, 256])# 比较直方图
similarity = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)
print("Histogram Similarity:", similarity)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

攻防世界 Reversing-x64Elf-100

进入题目,先下载附件 将下载好的RE文件拖入ExeinfoPE查看,有无壳 “Diagnose” 一栏的信息 “NOT WIN EXE -o - ELF executable [64bit obj. Exe file - CPU: AMD x86” 可知,这是一个 ELF 格式的可执行文件(通常用于 Linux 系统…

【C】堆的应用1 -- 堆排序

之前学习了堆,堆的一棵以顺序结构存储的完全二叉树,堆本身又氛围大根堆和小根堆,假设以大根堆为例,由于堆顶部元素是一棵二叉树里面最大的元素,所以如果每次都取堆顶的元素,那么取出的元素就是一个降序排列…

CentOS 7配置YOLOv8环境指南:无显卡版教程 - 幽络源

看本篇教程前请确保Centos7系统已安装配置Python3环境,参考幽络源上一篇文章>CentOS 7安装Python3环境详细指南:从源码编译到PIP配置 步骤1:建立python虚拟环境项目 在home目录下执行如下命令新建虚拟环境python项目 python3 -m venv y…

Confluence知识库管理系统安装步骤(Windows版本)

我们介绍的是安装7.15.1以下版本的安装方式,8.0以上的安装方式暂不支持。 如果你要安装8.0以上的版本,请参考本文末尾的附录中提供的相关网址。 首先我们安装之前需要准备安装所需文件以上文件可以在这里下载:【https://download.csdn.net/download/Elegant_Kevin/90412040】…

Uniapp 开发中遇到的坑与注意事项:全面指南

文章目录 1. 引言Uniapp 简介开发中的常见问题本文的目标与结构 2. 环境配置与项目初始化环境配置问题解决方案 项目初始化注意事项解决方案 常见错误与解决方案 3. 页面与组件开发页面生命周期注意事项示例代码 组件通信与复用注意事项示例代码 样式与布局问题注意事项示例代码…

学习笔记--电磁兼容性EMC

一、基本概念 电磁兼容性(Electromagnetic Compatibility,EMC)是电子电气设备在特定电磁环境中正常工作的能力,同时不会对其他设备产生不可接受的电磁干扰。其核心目标是确保设备在共享的电磁环境中既能抵抗干扰,又能避…

Unity百游修炼(2)——Brick_Breaker详细制作全流程

一、项目简介 Brick Breaker 是一款经典的打砖块游戏,本次案例将使用 Unity 引擎来实现该游戏的核心功能。 游戏画面如下: Brick_ breaker 二、项目结构概览和前期准备 (1)在 Unity 项目视图中,我们可以看到几个重要…

Java基础常见的面试题(易错!!)

面试题一:为什么 Java 不支持多继承 Java 不支持多继承主要是为避免 “菱形继承问题”(又称 “钻石问题”),即一个子类从多个父类继承到同名方法或属性时,编译器无法确定该调用哪个父类的成员。同时,多继承…

算法题(77):数组中的第k个最大元素

审题: 需要我们在时间复杂度O(n)的前提下找到数组中第k个最大元素 思路: 方法一:建堆实现 首先写一个dowmset函数,实现对第i个索引位置的向下调整。然后创建build函数,利用dowmset实现向下调整建堆,再根据k…

PCIe学习笔记1:PCIe体系架构——PCIe简介

目录 一、PCIe简介 1.1 串行传输 1.1.1 相对于并行传输的优化 1.1.2 带宽计算 1.1.3 差分信号传输 1.1.4 基于数据包的传输协议 1.2 PCIe的系统拓扑结构 1.2.1 根组件(Root Complex,RC) 1.2.2 上行端口与下行端口 1.2.3 交换机与桥 …

一天记20个忘10个之4:man

据说,给你一个支点,你就能撬起地球。 那好,今天,我给你一个 man,如果你能完成记20个忘10个的任务,你就真的很 man 了。 零、热身 young manold manmedical man 一、man之复合词 1.1 man复合词 chairm…

SpringBoot之自定义简单的注解和AOP

1.引入依赖 <!-- AOP依赖--> <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.8</version> </dependency>2.自定义一个注解 package com.example.springbootdemo3.an…

利用开源小智AI制作桌宠机器狗

本文主要介绍如何利用开源小智AI制作桌宠机器狗 1 源码下载 首先下载小智源码,下载地址, 下载源码后,使用vsCode打开,需要在vscode上安装esp-idf,安装方式请自己解决 2 源码修改 2.1添加机器狗控制代码 在目录main/iot/things下添加dog.cc文件,内容如下; #include…

深入理解IP子网掩码子网划分{作用} 以及 不同网段之间的ping的原理 以及子网掩码的区域划分

目录 子网掩码详解 子网掩码定义 子网掩码进一步解释 子网掩码的作用 计算总结表 子网掩码计算 子网掩码对应IP数量计算 判断IP是否在同一网段 1. 计算步骤 2. 示例 3. 关键点 总结 不同网段通信原理与Ping流程 1. 同网段通信 2. 跨网段通信 网段计算示例 3. P…

利用python和gpt写一个conda环境可视化管理工具

最近在学习python&#xff0c;由于不同的版本之间的差距较大&#xff0c;如果是用环境变量来配置python的话&#xff0c;会需要来回改&#xff0c;于是请教得知可以用conda来管理&#xff0c;但是conda在管理的时候老是要输入命令&#xff0c;感觉也很烦&#xff0c;于是让gpt帮…

Linux内核,slub分配流程

我们根据上面的流程图&#xff0c;依次看下slub是如何分配的 首先从kmem_cache_cpu中分配&#xff0c;如果没有则从kmem_cache_cpu的partial链表分配&#xff0c;如果还没有则从kmem_cache_node中分配&#xff0c;如果kmem_cache_node中也没有&#xff0c;则需要向伙伴系统申请…

使用Windbg调试目标进程排查C++软件异常的一般步骤与要点分享

目录 1、概述 2、将Windbg附加到已经启动起来的目标进程上&#xff0c;或者用Windbg启动目标程序 2.1、将Windbg附加到已经启动起来的目标进程上 2.2、用Windbg启动目标程序 2.3、Windbg关联到目标进程上会中断下来&#xff0c;输入g命令将该中断跳过去 3、分析实例说明 …

51单片机测试题AI作答测试(DeepSeek Kimi)

单片机测试题 DeepSeek Kimi 单项选择题 &#xff08;10道&#xff09; 6题8题判断有误 6题判断有误 智谱清言6题靠谱&#xff0c;但仔细斟酌&#xff0c;题目出的貌似有问题&#xff0c;详见 下方。 填空题 &#xff08;9道&#xff09; 脉宽调制&#xff08;Pulse …

模版语法vscode

这里注意&#xff1a;<template></template>里面只能写一个根标签&#xff0c;其他在嵌套&#xff1a; <script > export default {data(){return{tthtml:"<a hrefhttps://itbaizhan.com>百战程序员</a>"}} } </script><tem…

洛谷B3637 最长上升子序

B3637 最长上升子序列 - 洛谷 代码区&#xff1a; #include<bits/stdc.h>using namespace std;int main(){int n;cin >> n;int arry[n],dp[n];for(int i0;i<n;i){cin >>arry[i];dp[i]1;}/*在 i 之前可能存在多个 j 满足 arry[j] < arry[i]&#xff0c…