在本教程中,您将学习使用OpenCV实现直方图均衡化和自适应直方图均衡化(CLAHE)。

直方图均衡化是一种基本的图像处理技术,通过更新图像直方图的像素强度分布来调整图像的全局对比度。这样做可以使低对比度的区域在输出图像中获得更高的对比度。

本质上,直方图均衡化的工作原理是:

  • 1.计算图像像素强度的直方图
  • 2.均匀展开并分布最频繁的像素值(即直方图中计数最大的像素值)
  • 3.给出累积分布函数(CDF)的线性趋势

应用直方图均衡化的结果是得到一幅全局对比度更高的图像。

我们可以进一步改进直方图均衡化,采用一种称为对比度有限自适应直方图均衡化(CLAHE)的算法,从而获得更高质量的输出图像。

除了摄影师使用直方图均衡化来校正曝光不足/过曝光的图像外,直方图均衡化使用最广泛的是在医疗领域。

你通常会看到直方图均衡化应用于x光扫描和CT扫描,以提高x光片的对比度。这样做可以帮助医生和放射科医生更好地解释扫描结果,做出准确的诊断。

在本教程结束时,您将能够成功地使用OpenCV将基本直方图均衡化和自适应直方图均衡化应用到图像。

1.OpenCV直方图均衡化和自适应直方图均衡化(CLAHE)

在本教程的第一部分,我们将讨论什么是直方图均衡化,以及如何使用OpenCV应用直方图均衡化。
代码地址:

链接:https://pan.baidu.com/s/19V6s7Ten6K9FfBpJTbZhAQ
提取码:123a

我们将实现两个Python脚本:

  • simple_equalization.py:使用OpenCV的cv2.equalizeHist()函数执行基本直方图均衡。
  • adaptive_equalization.py:使用OpenCV的cv2.createCLAHE()方法执行自适应直方图均衡化。

2.什么是直方图均衡化?

直方图均衡化是一种基本的图像处理技术,可以提高图像的整体对比度。

应用直方图均衡化首先计算输入灰度/单通道图像中像素强度的直方图:

左 : 我 们 的 原 始 输 入 灰 度 图 像 。 右 : 计 算 灰 度 图 像 的 直 方 图 。 左:我们的原始输入灰度图像。右:计算灰度图像的直方图。 左:我们的原始输入灰度图像。右:计算灰度图像的直方图。
请注意,我们的直方图有许多峰值,这表明有很多像素被归入到这些各自的bin中。使用直方图均衡化,我们的目标是将这些像素分散到没有太多像素的bin中。

从数学上来说,这意味着我们试图将线性趋势应用到累积分布函数(CDF)中:

直 方 图 均 衡 化 目 标 使 输 出 图 像 具 有 线 性 C D F 直方图均衡化目标使输出图像具有线性CDF 直方图均衡化目标使输出图像具有线性CDF

左 : 应 用 直 方 图 均 衡 化 之 前 的 原 始 输 入 图 像 。 右 : 应 用 直 方 图 均 衡 化 后 的 输 出 图 像 。 左:应用直方图均衡化之前的原始输入图像。右:应用直方图均衡化后的输出图像。 左:应用直方图均衡化之前的原始输入图像。右:应用直方图均衡化后的输出图像。
注意输入图像的对比度是如何显著提高的,但代价是也提高了输入图像中的噪声的对比度。

这就提出了一个问题:是否有可能在不增加噪声的同时提高图像对比度?
答案是“是的”,你只需要应用自适应直方图均衡化。

通过自适应直方图均衡化,我们将输入图像划分为M × N网格。然后我们对网格中的每个单元进行均衡处理,从而获得更高质量的输出图像:


左 : 基 本 直 方 图 均 衡 。 右 : 自 适 应 直 方 图 均 衡 化 左:基本直方图均衡。右:自适应直方图均衡化 左:基本直方图均衡。右:自适应直方图均衡化
缺点是,自适应直方图均衡化的计算复杂度更高(但考虑到现代硬件,这两种实现仍然相当快)。

3.如何使用OpenCV进行直方图均衡化?

OpenCV 包括通过以下两个函数实现基本直方图均衡和自适应直方图均衡:

  • cv2.equalizeHist
  • cv2.createCLAHE

应用cv2.equalizeHist()函数非常简单,只需将图像转换为灰度,然后调用cv2.equalizeHist即可:

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
equalized = cv2.equalizeHist(gray)

实现自适应直方图均衡化要求:

  • 1.将输入图像转换为灰度/从中提取单个通道
  • 2.使用cv2.createCLAHE实例化CLAHE算法
  • 3.在CLAHE对象上调用.apply()方法来应用直方图均衡化

这比听起来容易得多,只需要几行代码:

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
equalized = clahe.apply(gray)

注意,我们为cv2.createCLAHE提供了两个参数:

  • clipLimit:这是对比度限制的阈值
  • tileGridSize:将输入图像划分为M × N块,然后对每个局部块应用直方图均衡化

4.项目结构

在我们使用OpenCV实现直方图均衡化之前,让我们先回顾一下我们的项目目录结构。

5.代码实现

5.1 使用OpenCV实现标准直方图均衡化

#   用法
# python simple_equalization.py --image images/moon.png# 导入必要的库
import argparse
import cv2# 构造参数解析器并解析参数
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", type=str, required=True, help="Path to the input image")
args = vars(ap.parse_args())# 从磁盘加载输入图像并将其转换为灰度
print("[INFO] Loading input image...")
image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 运用直方图均衡化
print("[INFO] Performing histogram equalization...")
equalized = cv2.equalizeHist(gray)# 显示原始灰度图像和均衡后的图像
cv2.imshow("Input", gray)
cv2.imshow("Histogram Equalization", equalized)
cv2.waitKey(0)

5.2代码解析

首先导入我们需要的 Python 包,解析我们的命令行参数。这里我们只需要一个参数–image,它是磁盘上输入图像的路径,我们希望在这里应用直方图均衡化。

解析完命令行参数后,我们可以继续下一步:从磁盘加载图像,将图像从RGB转换为灰度。使用cv2.equalizeHist执行基本的直方图均衡化。我们必须传入的唯一必需参数是灰度/单通道图像。

注:使用OpenCV进行直方图均衡化时,必须提供灰度/单通道图像。如果我们试图传递一个多通道图像,OpenCV将抛出一个错误。要在多通道图像上执行直方图均衡化,您需要(1)将图像分割成各自的通道,(2)均衡每个通道,(3)合并通道。

5.3 使用OpenCV实现自适应直方图均衡

#   用法
# python adaptive_equalization.py --image images/boston.png
# 导入必要的库
import argparse
import cv2# 构造参数解析器并解析参数
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", type=str, required=True, help="Path to the input image")
ap.add_argument("-c", "--clip", type=float, default=2.0, help="Threshold for contrast limiting")
ap.add_argument("-t", "--tile", type=int, default=8,help="Tile grid size -- divides image into tile x tile cells")
args = vars(ap.parse_args())# 从磁盘加载输入图像并将其转换为灰度
print("[INFO] Loading input image...")
image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 应用CLAHE (Contrast Limited Adaptive Histogram Equalization)
print("[INFO] Applying CLAHE...")
clahe = cv2.createCLAHE(clipLimit=args["clip"], tileGridSize=(args["tile"], args["tile"]))
equalized = clahe.apply(gray)# 显示原始灰度图像和CLAHE输出图像
cv2.imshow("Input", gray)
cv2.imshow("CLAHE", equalized)
cv2.waitKey(0)


5.4代码解析

自适应直方图均衡化比简单直方图均衡化的计算代价高一些,但可以产生更好的结果。但是不要相信我的话——你应该自己看看结果。

我们有三个命令行参数,其中一个是必需的,二个是可选的(但在使用CLHE时很有用):

  • --image:磁盘上输入图像的路径,我们希望在其中应用直方图均衡化。
  • --clip:对比度限制的阈值。您通常希望将此值保留在 2-5 的范围内。如果您将该值设置得太大,那么实际上您所做的是最大化局部对比度,这反过来又会最大化噪声(这与您想要的相反),尽量保持该值尽可能低。
  • --tile:CLAHE 的网格大小。从概念上讲,我们在这里所做的是将输入图像划分为 tile x tile 单元格,然后对每个单元格应用直方图均衡(使用 CLAHE 提供的额外功能)。

从磁盘加载输入图像并将其转换为灰度,就像我们对基本直方图均衡化所做的那样。通过cv2.createCLAHE()函数初始化CLHE对象。这里,我们提供了clipLimittileGridSize,它们是通过命令行参数提供的。

调用.apply()方法将自适应直方图均衡化应用于灰度图像。

6.直方图均衡化的建议

在构建自己的图像处理管道并发现应该应用直方图均衡化时,我建议从使用 cv2.equalizeHist 的简单直方图均衡化开始。但是如果你发现结果很差,反而增加了输入图像的噪声,那么你应该尝试通过 cv2.createCLAHE 使用自适应直方图均衡化。

参考目录

https://www.pyimagesearch.com/2021/02/01/opencv-histogram-equalization-and-adaptive-histogram-equalization-clahe/

OpenCV基础(16)OpenCV直方图均衡化和自适应直方图均衡化(CLAHE)相关推荐

  1. 直方图均衡化、自适应直方图均衡化

    一.直方图均衡化 简述 直方图均衡化的英文名称是:Histogram Equalization.  图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法.直方图拉伸和 ...

  2. opencv如何把一个矩阵不同列分离开_【opencv基础】OpenCV从Mat中提取某些行或列

    前言 Opencv中可以调用函数提取某些连续的行或者列,Mat的rowRange和colRange可以获取某些范围内行或列的指针: 这两个函数返回的是指向原矩阵内部位置的指针,类似于浅拷贝: exam ...

  3. OpenCV(十九)直方图(直方图计算、掩膜、均衡化、自适应均衡化)

    目录 一.基础理论 1.原理及作用 2.专业术语 二.直方图计算 函数介绍: 1.灰度图 代码: 效果: 2.彩色图 代码: 三.直方图掩膜的应用(mask) 1.基础理论 2.代码 3.效果 四.直 ...

  4. python opencv 直方图均衡_Python+OpenCV:全局直方图均衡化、局部直方图自适应均衡化、直方图比较(Python版)...

    1. 全局直方图均衡化 cv2.equalizeHist(src, dst=None)函数只能处理单通道的数据,src为输入图像对象矩阵,必须为单通道的uint8类型的矩阵数据.直方图均衡化可以看作是 ...

  5. opencv python 实现灰度图像和彩色图像直方图全局均衡化和自适应均衡化

    首先进行简单的灰度图像的全局均衡化和自适应均衡化 import cv2 as cv import numpy as npimg = cv.imread('cun.jpg',0)# 全局直方图均衡化 i ...

  6. OpenCv:直方图均衡化(HE),自适应直方图均衡化(AHE),限制对比度自适应直方图均衡化(CLAHE)

    总结了使用Python OpenCv处理图像直方图均衡化(HE),自适应直方图均衡化(AHE),限制对比度自适应直方图均衡化(CLAHE)的方法. 目录 直方图均衡化(HE) 自适应直方图均衡化(AH ...

  7. Python+OpenCV:图像对比度受限自适应直方图均衡化(CLAHE, Contrast Limited Adaptive Histogram Equalization)

    Python+OpenCV:图像对比度受限自适应直方图均衡化(CLAHE, Contrast Limited Adaptive Histogram Equalization) ############ ...

  8. OpenCV之imgproc 模块. 图像处理(4)直方图均衡化 直方图计算 直方图对比 反向投影 模板匹配

    直方图均衡化 目标 在这个教程中你将学到: 什么是图像的直方图和为什么图像的直方图很有用 用OpenCV函数 equalizeHist 对图像进行直方图均衡化 原理 图像的直方图是什么? 直方图是图像 ...

  9. [Python图像处理] 三十八.OpenCV图像增强和图像去雾万字详解(直方图均衡化、局部直方图均衡化、自动色彩均衡化)

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

最新文章

  1. VMware学习使用笔记
  2. pip在windows下安装配件/宏包
  3. 杜伦大学提出GANomaly:无需负例样本实现异常检测
  4. Django入门(七)   django的缓存
  5. 一个编程菜鸟的进阶之路(C/C++)
  6. TensorFlow官方入门实操课程-全连接神经网络分类
  7. 汇报时,如何让老板快速抓住重点?—— 黄金三步法
  8. slam 无人车 融合imu 后手动调整小车位姿,不受里程计影响
  9. android 菜鸟面单打印_菜鸟Android
  10. Filter 敏感词汇过滤案例
  11. Linux 进程通信
  12. 为什么地球上只有一个硅谷?
  13. 宠物卡牌大赛奖励发放结束公告
  14. computer science 经典书籍及书评
  15. csol c语言运行错误,CSOL非常卡之控制台优化.doc
  16. 企业邮箱退信提示:“550 5.1.1 User unknown.”
  17. Linux文件和目录管理(3)
  18. 有赞Java面试经验_有赞面试记录二
  19. 付费率、月活增速不敌网易云音乐的腾讯音乐,还有什么故事能说?
  20. mac-pip3换源

热门文章

  1. Json与聚合数据不解之缘-
  2. linux aapt 加path,Mac配置AAPT环境变量
  3. gemfire java_gemfire基本使用以及spring-data-gemfire的使用
  4. js: 添加事件监听addEventListener、移除事件监听removeEventListener
  5. 手写Callable
  6. 台式计算机的主流配置,目前台式电脑的主流配置有哪些?
  7. win10磁盘管理_「电脑硬盘」Win10系统中的基本磁盘和动态磁盘详解
  8. 第四阶段---day02
  9. ShareObject使用
  10. App混合开发-前端小白理解