详解OpenCV自适应直方图均衡化的应用

目录
  • 介绍
  • 主要代码
  • 比较 CLAHE 和直方图均衡化

介绍

在《直方图均衡化详解》中,我们已经了解的直方图均衡化的基本概念,并且可以使用 cv2.equalizeHist() 函数执行直方图均衡。

在本节中,将介绍如何应用对比度受限的自适应直方图均衡化 ( Contrast Limited Adaptive Histogram Equalization, CLAHE ) 来均衡图像,CLAHE 是自适应直方图均衡化( Adaptive Histogram Equalization, AHE )的一种变体,区别在于其对比度的增大是受限的。图像相对均匀区域中的噪声被 AHE 过度放大,而 CLAHE 通过限制对比度增大来解决这个问题。该算法通过创建原始图像的多个直方图,并使用这些直方图来重新分配图像的亮度,用于提高图像的对比度。

主要代码

接下来,将 CLAHE 应用于灰度和彩色图像。应用 CLAHE 时,有两个重要参数,第一个是 clipLimit,它设置对比度限制的阈值,默认值为 40;第二个是 tileGridSize ,它设置行和列中的 tiles 数量。应用 CLAHE 时,图像被分成称为 tiles (默认为 8 x 8 )的小块以执行其计算。 将 CLAHE 应用于灰度图像,需要使用以下代码:

# 加载图像
image = cv2.imread('example.png')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 灰度图像应用 CLAHE
clahe = cv2.createCLAHE(clipLimit=2.0)
gray_image_clahe = clahe.apply(gray_image)
# 使用不同 clipLimit 值
clahe.setClipLimit(5.0)
gray_image_clahe_2 = clahe.apply(gray_image)
clahe.setClipLimit(10.0)
gray_image_clahe_3 = clahe.apply(gray_image)
clahe.setClipLimit(20.0)
gray_image_clahe_4 = clahe.apply(gray_image)

然后,我们将 CLAHE 应用于彩色图像,类似于彩色图像对比度均衡的方法,创建四个函数以仅在不同颜色空间的亮度通道上使用 CLAHE 来均衡化彩色图像:

def equalize_clahe_color_hsv(img):
    cla = cv2.createCLAHE(clipLimit=4.0)
    H, S, V = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2HSV))
    eq_V = cla.apply(V)
    eq_image = cv2.cvtColor(cv2.merge([H, S, eq_V]), cv2.COLOR_HSV2BGR)
    return eq_image

def equalize_clahe_color_lab(img):
    cla = cv2.createCLAHE(clipLimit=4.0)
    L, a, b = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2Lab))
    eq_L = cla.apply(L)
    eq_image = cv2.cvtColor(cv2.merge([eq_L, a, b]), cv2.COLOR_Lab2BGR)
    return eq_image

def equalize_clahe_color_yuv(img):
    cla = cv2.createCLAHE(clipLimit=4.0)
    Y, U, V = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2YUV))
    eq_Y = cla.apply(Y)
    eq_image = cv2.cvtColor(cv2.merge([eq_Y, U, V]), cv2.COLOR_YUV2BGR)
    return eq_image

def equalize_clahe_color(img):
    cla = cv2.createCLAHE(clipLimit=4.0)
    channels = cv2.split(img)
    eq_channels = []
    for ch in channels:
        eq_channels.append(cla.apply(ch))
    eq_image = cv2.merge(eq_channels)
    return eq_image
# 彩色图像应用 CLAHE
image_clahe_color = equalize_clahe_color(image)
image_clahe_color_lab = equalize_clahe_color_lab(image)
image_clahe_color_hsv = equalize_clahe_color_hsv(image)
image_clahe_color_yuv = equalize_clahe_color_yuv(image)

# 可视化
show_img_with_matplotlib(cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR), "gray", 1)
show_img_with_matplotlib(cv2.cvtColor(gray_image_clahe, cv2.COLOR_GRAY2BGR), "gray CLAHE clipLimit=2.0", 2)
show_img_with_matplotlib(cv2.cvtColor(gray_image_clahe_2, cv2.COLOR_GRAY2BGR), "gray CLAHE clipLimit=5.0", 3)
# 其他图像的可视化方法类似,不再赘述
# ...

将所有这些函数应用于测试图像后比较结果,如下图所示:

在上图中,我们可以看到改变 clipLimit 参数在测试图像上应用 CLAHE 后的不同效果,同时也可以看到在不同颜色空间( LAB、HSV 和 YUV )的亮度通道上应用 CLAHE 后的不同结果。其中,可以看到在 BGR 图像的三个通道上应用 CLAHE 与仅在不同颜色空间的亮度通道上使用 CLAHE 的不同效果。

比较 CLAHE 和直方图均衡化

为了更好地展示 CLAHE 的效果,接下来对比 CLAHE 和直方图均衡化 (cv2.equalizeHist()) 在同一图像上的效果,同时可视化生成的图像和生成的直方图。

image = cv2.imread('example.png')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

hist = cv2.calcHist([gray_image], [0], None, [256], [0, 256])
# 直方图均衡化
gray_image_eq = cv2.equalizeHist(gray_image)
# 计算直方图
hist_eq = cv2.calcHist([gray_image_eq], [0], None, [256], [0, 256])
# 创建 clahe:
clahe = cv2.createCLAHE(clipLimit=4.0)
# 在灰度图像上应用 clahe
gray_image_clahe = clahe.apply(gray_image)
# 计算直方图
hist_clahe = cv2.calcHist([gray_image_clahe], [0], None, [256], [0, 256])

可视化的结果如下图所示:

通过以上对比,可以肯定地说,在许多情况下,CLAHE 比应用直方图均衡化有更好的结果和性能。

到此这篇关于详解OpenCV自适应直方图均衡化的应用的文章就介绍到这了,更多相关OpenCV自适应直方图均衡化内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • OpenCV利用python来实现图像的直方图均衡化

    1.直方图 直方图: (1) 图像中不同像素等级出现的次数 (2) 图像中具有不同等级的像素关于总像素数目的比值. 我们使用cv2.calcHist方法得到直方图 cv2.calcHist(images, channels, mask, histSize, ranges): -img: 图像 -channels: 选取图像的哪个通道 -histSize: 直方图大小 -ranges: 直方图范围 cv2.minMaxLoc: 返回直方图的最大最小值,以及他们的索引 import cv2 impo

  • 详解python OpenCV学习笔记之直方图均衡化

    本文介绍了python OpenCV学习笔记之直方图均衡化,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/d5/daf/tutorial_py_histogram_equalization.html 考虑一个图像,其像素值仅限制在特定的值范围内.例如,更明亮的图像将使所有像素都限制在高值中.但是一个好的图像会有来自图像的所有区域的像素.所以你需要把这个直方图拉伸到两端(如下图所给出的),这就是直方图均衡的作用(用简单的话说).这通常会改善图像的

  • Python OpenCV直方图均衡化详解

    目录 前言 灰度直方图均衡化 颜色直方图均衡化 前言 图像处理技术是计算机视觉项目的核心,通常是计算机视觉项目中的关键工具,可以使用它们来完成各种计算机视觉任务.在本文中,将介绍如何使用 OpenCV 函数 cv2.equalizeHist() 执行直方图均衡,并将其应用于灰度和彩色图像,cv2.equalizeHist() 函数将亮度归一化并提高图像的对比度. 灰度直方图均衡化 使用 cv2.equalizeHist() 函数来均衡给定灰度图像的对比度: # 加载图像并转换为灰度图像 imag

  • OpenCV 直方图均衡化的实现原理解析

    目录 直方图均衡化介绍 图像的直方图是什么? 更形象解释 什么是直方图均衡化? 直方图均衡化是如何实现的? 直方图均衡化的作用 直方图均衡化步骤 相关API equalizeHist 代码示例 灰度图均值化 彩色图均值化 直方图均衡化介绍 图像的直方图是什么? 图像直方图,是指对整个图像像在灰度范围内的像素值(0~255)统计出现频率次数,据此生成的直方图,称为图像直方图-直方图.直方图反映了图像灰度的分布情况.是图像的统计学特征. 简单来说:直方图是图像中像素强度分布的图形表达方式,它统计了每

  • OpenCV-Python直方图均衡化实现图像去雾

    直方图均衡化 直方图均衡化的目的是将原始图像的灰度级均匀地映射到整个灰度级范围内,得到一个灰度级分布均衡的图像.这种均衡化,即实现了灰度值统计上的概率均衡,也实现了人类视觉系统上(HSV)的视觉均衡. 一般来说,直方图均衡化可以达到增强图像显示效果的目的.最常用的比如去雾.下面,我们来分别实现灰度图像去雾以及彩色图像去雾. 实现灰度图像去雾 在OpenCV中,它提供了函数cv2.equalizeHist()来实现直方图均衡化,该函数的完整定义如下: def equalizeHist(src, d

  • 详解OpenCV自适应直方图均衡化的应用

    目录 介绍 主要代码 比较 CLAHE 和直方图均衡化 介绍 在<直方图均衡化详解>中,我们已经了解的直方图均衡化的基本概念,并且可以使用 cv2.equalizeHist() 函数执行直方图均衡. 在本节中,将介绍如何应用对比度受限的自适应直方图均衡化 ( Contrast Limited Adaptive Histogram Equalization, CLAHE ) 来均衡图像,CLAHE 是自适应直方图均衡化( Adaptive Histogram Equalization, AHE

  • 详解OpenCV实现特征提取的方法

    目录 前言 1. 颜色 2. 形状 3. 纹理 a. GLCM b.  LBP 结论 前言 如何从图像中提取特征?第一次听说“特征提取”一词是在 YouTube 上的机器学习视频教程中,它清楚地解释了我们如何在大型数据集中提取特征. 很简单,数据集的列就是特征.然而,当我遇到计算机视觉主题时,当听说我们将从图像中提取特征时,吃了一惊.是否开始浏览图像的每一列并取出每个像素? 一段时间后,明白了特征提取在计算机视觉中的含义.特征提取是降维过程的一部分,其中,原始数据的初始集被划分并减少到更易于管理

  • 详解OpenCV和PIL读取和显示图像的差异

    本博客演示使用OpenCV和PIL读取和显示图像的差异. 首先来看一下原始的bgr图像 src.jpg 1. 使用cv2读取src.jpg并转为rgb格式的src_rgb.jpg并显示和保存 #首先读入并保存为rgb图像 src_path = 'C:\\Users\\Administrator\\Desktop\\cv2_PIL\\src.png' # bgr img = cv2.imread(src_path) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB

  • 详解OpenCV中简单的鼠标事件处理

    目录 cv2.setMouseCallback函数语法 回调函数 谈及鼠标事件,就是在触发鼠标按钮后程序所做出相应的反应,但是不影响程序的整个线程.这有些像异步处理.鼠标事件响应不会一直等着我们去按而后续程序不执行,这样会造成阻塞,而是在我们不按鼠标的时候程序也会正常进行,按的时候会调用鼠标的事件响应,这个过程就像程序一边正常运行一边等待鼠标响应. 为了将鼠标响应和操作画面进行绑定,我们要创建一个回调函数: cv2.setMouseCallback函数语法 cv2.setMouseCallbac

  • 详解OpenCV执行连通分量标记的方法和分析

    目录 1.OpenCV 连通分量标记和分析 1.1 OpenCV 连通分量标记和分析函数 1.2 项目结构 2.案例实现 2.1 使用 OpenCV 实现基本的连通分量标记 2.2 完整代码 2.3 过滤连通分量 2.4 C++代码案例 在本教程中,您将学习如何使用 OpenCV 执行连通分量标记和分析.具体来说,我们将重点介绍 OpenCV 最常用的连通分量标记函数:cv2.connectedComponentsWithStats. 连通分量标记(也称为连通分量分析.斑点提取或区域标记)是图论

  • 详解opencv去除背景算法的方法比较

    目录 背景减除法 (1)BackgroundSubtractorMOG (2)BackgroundSubtractorMOG2 (3)BackgroundSubtractorGMG 帧差法 最近做opencv项目时,使用肤色分割的方法检测目标物体时,背景带来的干扰非常让人头痛.于是先将背景分割出去,将影响降低甚至消除.由于初次接触opencv,叙述不当的地方还请指正. 背景减除法 (以下文字原文来源于https://docs.opencv.org/3.4.7/d8/d38/tutorial_bg

  • 详解OpenCV For Java环境搭建与功能演示

    OpenCV概述 OpenCV做为功能强大的计算机视觉开源框架,包含了500多个算法实现,而且还在不断增加,其最新版本已经更新到3.2.其SDK支持Android与Java平台开发,对于常见的图像处理需求几乎都可以满足,理应成为广大Java与Android程序员的首先的图像处理框架.Java中使用OpenCV的配置及其简单,可以毫不客气的说几乎是零配置都可以. 一:配置 配置引入OpenCV相关jar包,首先要下载OpenCV的自解压版本,下载地址: http://opencv.org/open

  • 详解opencv Python特征检测及K-最近邻匹配

    鉴于即将启程旅行,先上传篇简单的图像检索介绍,与各位一起学习opencv的同学共勉 一.特征检测 图片的特征主要分为角点,斑点,边,脊向等,都是常用特征检测算法所检测到的图像特征· 1.Harris角点检测 先将图片转换为灰度模式,再使用以下函数检测图片的角点特征: dst=cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]]) 重点关注第三个参数,这里使用了Sobel算子,简单来说,其取为3-31间的奇数,定义了角点检测的

  • 详解opencv中画圆circle函数和椭圆ellipse函数

    1.      void ellipse(InputOutputArray img, Point center, Size axes, double angle, double startAngle, double endAngle, const Scalar& color, int thickness = 1,   int lineType = LINE_8, int shift = 0); ellipse函数将椭圆画到图像 lmg 上, 椭圆中心为点center,并且大小位于矩形 axes

  • 图文详解OpenCV中光流以及视频特征点追踪

    目录 前言 1. 效果图 2. 原理 2.1 什么是光流?光流追踪的前提.原理 2.2 光流的应用 2.3 光流的2种方法 3. 源码 3.2 稀疏光流追踪 3.2 优化版稀疏光流追踪 3.3 密集光流追踪 总结 前言 这篇博客将介绍光流的概念以及如何使用 Lucas-Kanade 方法估计光流,并演示如何使用 cv2.calcOpticalFlowPyrLK() 来跟踪视频中的特征点. 1. 效果图 光流追踪效果图如下: 它显示了一个球在连续 5 帧中移动.箭头表示其位移矢量. 不是很严谨的-

随机推荐