当前位置: 首页 > web >正文

OpenCV进阶操作:图像直方图、直方图均衡化

文章目录

  • 一、图像直方图
  • 二、图像直方图的作用
  • 三、使用matplotlib方法绘制直方图
    • 2.使用opencv的方法绘制直方图(划分16个小的子亮度区间)
    • 3、绘制彩色图像的直方图
  • 四、直方图均衡化
    • 1、绘制原图的直方图
    • 2、绘制经过直方图均衡化后的图片的直方图
    • 3、自适应直方图均衡化
      • 1)概念
      • 2)步骤
      • 3)代码实现


一、图像直方图

图像直方图是描述图像像素值分布情况的统计图形。它表示了图像中不同像素值的数量或频率。
在这里插入图片描述

在图像直方图中,横轴表示像素值的范围,通常为0-255,纵轴表示像素值的数量或频率。直方图的每一个条柱代表某个像素值范围内像素的数量或频率。例如,柱子的高度表示图像中具有该像素值的像素的数量或出现的频率。
在这里插入图片描述
在这里插入图片描述

二、图像直方图的作用

  • 分析图像的亮度分布
    通过直方图可以了解图像中不同亮度值的像素数量,从而判断图像的亮度分布情况。例如,如果直方图中灰度级别集中在低亮度区域,说明图像较暗;如果直方图分布在高亮度区域,则说明图像较亮。

  • 判断图像的对比度
    直方图的宽度反映了图像的对比度。直方图宽度越大,表示图像中像素值分布越分散,对比度越高;相反,直方图宽度越窄,表示图像中像素值分布越集中,对比度越低。

  • 检测图像的亮度和色彩偏移
    通过比较不同颜色通道的直方图,可以判断图像是否存在亮度或色彩偏移。例如,如果红色通道的直方图偏向左侧,则说明图像偏向较暗的红色,存在亮度偏移。

  • 图像增强和调整
    通过分析直方图,可以根据图像的特点进行增强和调整。例如,可以通过直方图均衡化来增强图像的对比度;可以通过直方图匹配来调整图像的色彩和亮度分布。

  • 阈值分割
    直方图可以用于确定图像的阈值,用于分割图像中的目标物体和背景。通过直方图的谷底或者双峰可以确定一个适合的阈值值,将图像分成两个部分。

三、使用matplotlib方法绘制直方图

img =cv2.imread('../data/310.jpg',cv2.IMREAD_GRAYSCALE)# 转成一维
a=img.ravel()# 使用 matplotlib 的 hist 函数绘制直方图。
plt.hist(a,bins=256)
plt.show()# 参数解释:
# - a:一维数组,即图像的像素值组成的数组。
# - bins=256:指定直方图的条数,即灰度级的数量。

在这里插入图片描述

2.使用opencv的方法绘制直方图(划分16个小的子亮度区间)

#这里的calcHist参数在上面有介绍,这里是对img图片做直方图统计,采用灰度图,即零通道,未设置掩膜,划分为16个区间,亮度值统计[0,256]的值
phone_hist = cv2.calcHist([img],[0],None,[16],[0,256])
plt.plot(phone_hist)#使用calcHist的值绘制曲线图
plt.show()

统计的值为每个亮度区间内属于该亮度值的像素点个数。
在这里插入图片描述

3、绘制彩色图像的直方图

img=cv2.imread('zl.jpg')
color=('b','g','r')    #设置绘制的折线图每条线的颜色
for i,col in enumerate(color):    #依次遍历三个颜色通道histr=cv2.calcHist([img],[i],None,[256],[0,256])    #依次计算每个通道的直方图值plt.plot(histr,color=col)    #绘制折线图
plt.show()

分别统计了不同颜色通道下的直方图
在这里插入图片描述

四、直方图均衡化

直方图均衡化:直方图均衡化是一种图像增强技术,它可以通过增加图像的对比度和亮度来改善图像的质量。直方图均衡化通过将图像的像素值分布均匀化来实现这一目标。
在这里插入图片描述

在Python OpenCV中,可以使用cv2.equalizeHist()函数来实现直方图均衡化。该函数将输入图像转换为灰度图像,并将其像素值分布均匀化,从而增强图像的对比度和亮度。下面是将不均衡的直方图均衡化之后的结果。

1、绘制原图的直方图

woman = cv2.imread('ja.jpg',cv2.IMREAD_GRAYSCALE)
# # # phone_hist = cv2.calcHist([phone],[0],None,[256],[0,256])
plt.hist(woman.ravel(), bins=256)#numpy中的ravel将数组多维度拉成一维数组
plt.show()

在这里插入图片描述

2、绘制经过直方图均衡化后的图片的直方图

phone_equalize = cv2.equalizeHist(woman)
plt.hist(phone_equalize.ravel(), bins=256)#numpy中的ravel将数组多维度拉成一维数组
plt.show()

在这里插入图片描述
在这里插入图片描述

3、自适应直方图均衡化

1)概念

传统的直方图均衡化方法是将整个图像的直方图变成均匀分布,但在某些情况下,图像的局部区域可能存在过亮或过暗的问题。自适应直方图均衡化通过将图像分成多个小的局部区域,并对每个局部区域进行直方图均衡化,从而避免了全局均衡化带来的问题。

2)步骤

  • 将图像分成多个不重叠的小块,每个小块称为一个局部区域。
  • 对每个局部区域进行直方图均衡化,得到均衡化后的局部区域。
  • 将均衡化后的局部区域重新拼合,得到最终的均衡化图像。

3)代码实现

(接上面代码)

clahe = cv2.createCLAHE(clipLimit=1,tileGridSize=(16,16))   # 通过类创建了一个均衡化对象
# clipLimit表示对比度的限制,tileGridSize表示图像均匀划分的小块大小
phone_clahe = clahe.apply(phone)  # 将均衡化对象应用到图片phone上得到均衡化处理后的图片phone_clahe
res = np.hstack((phone,phone_equalize,phone_clahe))  # 将原图、直方图均衡化后的图像、自适应直方图均衡化后的图像,水平方向合并
cv2.imshow("phone_equalize",res)
cv2.waitKey(0)

在这里插入图片描述


http://www.xdnf.cn/news/3961.html

相关文章:

  • 2.CFD 计算过程概述:Fluent在散热计算中的优势
  • 【Linux】linux入门——基本指令
  • Qt 信号槽机制底层原理学习
  • C++笔记之模板与可变参数模板
  • 动态链接库(DLL)
  • 网狐飞云娱乐三端源码深度实测:组件结构拆解与部署Bug复盘指南(附代码分析)
  • LeetCode 热题 100 17. 电话号码的字母组合
  • 分布式事物
  • VTK 系统架构
  • 【NLP】33. Pinecone + OpenAI :构建自定义语义搜索系统
  • 五一作业-day04
  • 解决跨域的4种方法
  • CRS 16 slot 设备硬件架构
  • 【RK3588嵌入式图形编程】-Cairo-Cairo图形库支持后端
  • 嵌入式Linux驱动学习
  • 哈希算法、搜索算法与二分查找算法在 C# 中的实现与应用
  • 基于机器学习算法预测二手车市场数据清洗与分析平台(源码+定制+讲解) 基于Python的数据挖掘与可视化 二手车数据处理与分析系统开发 (机器学习算法预测)
  • 深入理解 Bash 中的 $‘...‘ 字符串语法糖
  • 浅拷贝和深拷贝的区别
  • Android控件View、ImageView、WebView用法
  • 14.网络钓鱼实战
  • 【论文阅读】DETR+Deformable DETR
  • 【现代深度学习技术】现代循环神经网络07:序列到序列学习(seq2seq)
  • [学成在线]23-面试题总结
  • AIGC学术时代:DeepSeek如何助力实验与数值模拟
  • 基于PPO的自动驾驶小车绕圈任务
  • Photo-SLAM论文理解、环境搭建、代码理解与实测效果
  • Kubernetes 虚拟机安全关机操作流程
  • 生成式AI服务内容被滥用的法律责任划分
  • Matlab实现CNN-BiLSTM时间序列预测未来