CLAHE

CLAHE 是一种非常有效的直方图均衡算法, 目前网上已经有很多文章进行了说明, 这里说一下自己的理解.

CLAHE是怎么来的

直方图均衡是一种简单快速的图像增强方法, 其原理和实现过程以及改进可以查看这里: 一文搞懂直方图均衡_yfor1008-CSDN博客

目前存在一些问题:

  1. 直方图均衡是全局的, 对图像局部区域存在过亮或者过暗时, 效果不是很好;
  2. 直方图均衡会增强背景噪声, 如下图所示为 CLAHE 中的示例:

为了解决上述2个问题, 就有2方面的解决方法: 一是解决全局性问题, 二是解决背景噪声增强问题.

  • 针对全局性问题: 有人提出了对图像分块的方法, 每块区域单独进行直方图均衡, 这样就可以利用局部信息来增强图像, 这样就可以解决全局性问题;
  • 针对背景噪声增强问题: 主要背景增强太过了, 因而有人提出了对对比度进行限制的方法, 这样就可以解决背景噪声增强问题;

将上述二者相结合就是 CLAHE 方法, 其全称为: Contrast Limited Adaptive Histogram Equalization.

CLAHE 算法流程

CLAHE 算法流程主要有以下几个步骤:

  1. 预处理, 如图像分块填充等;
  2. 对每个分块处理, 计算映射关系, 计算映射关系时使用了对比度限制;
  3. 使用插值方法得到最后的增强图像;

其处理流程可以用如下示意图表示:

实现及效果

这里使用matlab实现了该算法, 实现过程参考了: Contrast Limited Adaptive Histogram Equalization (CLAHE) - File Exchange - MATLAB Central (mathworks.com) 及matlab源码 adapthisteq.

以下为几组测试结果:
![20180727214122483_HE_CLAHE](https://img-blog.csdnimg.cn/img_convert/f3ed4fcb18911e703ab9992081dde591.png

从左往右以此为: 原图, HE, CLAHE, 从图中可以看到, CLAHE不仅实现了图像细节的增强, 还抑制了背景噪声.

从左往右以此为: 原图, HE, CLAHE, 从图中可以看到, CLAHE实现了对细节的增强且没有使得图像过度增强.

关于关键步骤的说明

关于双线性插值

  1. 对于每个分块都是将其分成 4 个子块, 然后每个子块与其相邻块的子块重新构成一个分块;
  2. 对于新构成的块使用双线性插值得到增强后的图像;
  3. 对于第1行的上面一行子块仅需考虑相邻行的上面一行子块, 最后行, 第1列及最后列同理;
  4. 对于4个角上的子块, 直接使用本身所在块的映射关系, 不需要进行插值;

如下图所示:

关于限制对比度

CLAHE 中使用的方法是不断地循环, 直到将所有截断后多余的像素都添加到直方图中. 这种方法实现过程比较复杂, 个人认为可以简化, 如:

  1. 截断后直接丢弃;
  2. 截断后直接均匀添加到直方图所有的bin上;

上述2种方法对对比度影响不大, 但对图像亮度有一点点影响, 如下图所示为上述方法1与原始CLAHE方法的对比结果, 第1行为原始CLAHE, 第2行为截断后直接丢弃方法, 第1列到第3列使用的截断参数依次为: 0.01, 0.03, 0.05.

从图中可看到, 对图像结果影响较大的参数是截断阈值, 而不是是否将截断后的数据添加到直方图的每个bin上. 如下图所示为另外一组测试结果, 从左到右依次为: 原始图像, 阈值0.01, 阈值0.03, 阈值0.05.

关于预处理

需对图像进行填充, 为方便进行插值, 填充后图像的每个分块都必须为2的整数倍, 要不然不方便对每个块划分为4个子块.

关于直方图分布类型

在查看 matlab 源码时, 里面使用了3种分布类型:

  • uniform: CLAHE 使用的方法
  • rayleigh: 代码中说是适用于水下(underwater)图像
  • exponential: 没有相关说明

这里测试对比了 uniformrayleigh , 如下所示为水下图像测试结果(正常图像测试几乎没有差别, 这里不进行展示了):

从左到右依次为: 原图, uniformrayleigh , 目前没有看出二者的本质区别.

不过这张图像来源: Computer vision algorithm removes the water from underwater images » Behind the Headlines - MATLAB & Simulink (mathworks.com), 作者提出了一种 Sea-thru 方法, 效果不错, 这里下mark一下, 后面有时间在研究研究, 效果如下所示:

参考

  1. Contrast Limited Adaptive Histogram Equalization (CLAHE) - File Exchange - MATLAB Central (mathworks.com)
  2. Image Enhancement - CLAHE - 知乎 (zhihu.com)
  3. CLAHE (Contrast Limited Adaptive Histogram Equalization) (amroamroamro.github.io)
  4. wangyanckxx/Single-Underwater-Image-Enhancement-and-Color-Restoration: Single Underwater Image Enhancement and Color Restoration, which is Python implementation for a comprehensive review paper “An Experimental-based Review of Image Enhancement and Image Restoration Methods for Underwater Imaging” (github.com)

关于 CLAHE 的理解及实现相关推荐

  1. CLAHE中双线性插值理解

    参考链接: 1.关于 CLAHE 的理解及实现 2.CLAHE算法 3.图像增强 | CLAHE 限制对比度自适应直方图均衡化

  2. c++ 绘制函数图像_【图像增强】CLAHE 限制对比度自适应直方图均衡化

    文章来自:微信公众号[机器学习炼丹术]. 文章目录: 1 基本概述 2 竞赛中的CLAHE实现 3 openCV绘制直方图 4 对比度Contrast 5 Contrast Stretching 6 ...

  3. 基于直方图的图像增强算法(HE、CLAHE、Retinex)

    直方图是图像色彩统计特征的抽象表述.基于直方图可以实现很多有趣的算法.例如,图像增强中利用直方图来调整图像的对比度.有人利用直方图来进行大规模无损数据隐藏.还有人利用梯度直方图HOG来构建图像特征进而 ...

  4. 图像优化算法(HE、AHE、CLAHE)简单介绍

    一.灰度直方图均衡算法(HE) 1.1.算法简介 直方图均衡化通常用来增加许多图像的 全局对比度 ,尤其是当图像的有用数据的对比度相当接近的时候.通过这种方法,亮度可以更好地在直方图上分布.这样就可以 ...

  5. 基于python的对比度增强(线性变换、直方图正规化、直方图均衡化、CLAHE)

    线性变换 假设输入图像为I,宽为W,高为H,输出图像为O,图像的线性变换可以用以下公式定义: O(r,c)=a×I(r,c)+b,0≤r<H,0≤c<WO(r, c) = a × I(r, ...

  6. OpenCV-Python自适应直方图均衡类CLAHE及方法详解

    一.引言 对比度受限的自适应直方图均衡在OpenCV中是通过类CLAHE来提供实现的,老猿没研究过C++中的应用,但OpenCV-Python中应用时与普通的Python类构建对象的机制有所不同,老猿 ...

  7. OpenCV自适应直方图均衡CLAHE图像和分块大小不能整除的处理

    一.引言 最近一个月来都在研究OpenCV 中CLAHE算法的一些问题,如: 图像横向和纵向分块大小与图像的宽和高不能整除怎么处理? CLIP的剪裁是怎么实施的? 解决棋盘效应的具体插值处理过程怎样? ...

  8. CLAHE算法实现图像增强「AI工程论」

    关注:决策智能与机器学习,深耕AI脱水干货 作者 |  机器学习炼丹术 来源 |  机器学习炼丹术 1 基本概述 CLAHE是一个比较有意思的图像增强的方法,主要用在医学图像上面.之前的比赛中,用到了 ...

  9. 对比度受限直方图均衡化CLAHE算法原理及Opencv C++代码实现

    在上一篇博客中讲解了直方图均衡化的原理. 一文深入理解直方图均衡化的原理 虽然直方图均衡简单.高效:但是,图像中不同的区域灰度分布相差甚远,对它们使用同一种变换常常产生不理想的效果: 实际应用中,常常 ...

最新文章

  1. linux 服务器 iptables 防止arp病毒,Linux下防御ARP病毒攻击
  2. 计算机一级繁体字转换,繁体字转换器
  3. [转载] 将一个整数型字符串转换为一个整数
  4. 【转载】清华人都如此努力,那我们呢?
  5. python函数中变量的作用域_Python中变量的作用域(variable scope)
  6. Java Web底层(1)
  7. 2022年搜索引擎研究报告
  8. xdg在Linux中的用法,linux-如何使用sudo获取XDG变量?
  9. 4.29 C语言练习(宏定义练习:输入两个整数,求他们相除的余数。用带参的宏来实现,编程序。)
  10. 数据结构与算法实验4——字符串和数组 7-5 病毒变种
  11. 2012~2020年期货全品种TICK数据共享更新至2020.7.24
  12. Minio客户端操作
  13. Java之原子性-乐观锁与悲观锁
  14. Parse 教程:网络后台基础
  15. 师范生计算机软件技能怎么写,计算机与信息科学学院 软件学院第十三届 师范生课堂教学技能竞赛...
  16. 蓝桥杯【历届试题】九宫重排
  17. uni-app环境搭建
  18. 张驰(中国著名男装设计师) - 搜狗百科
  19. 灵光乍现:巧妙居中显示原始大图片!
  20. tf.data.Dataset与tfrecord学习笔记

热门文章

  1. 「津津乐道播客」#195. 996笼罩下的互联网“民工”
  2. 记一次kudu重启之后tablet都处于UNAVAILABLE
  3. jCore中文本地化工作札记 - 2
  4. 下载安装office2019
  5. 深圳学区房购买-查查吧深圳学区地图
  6. JAVA实现RS-485串口编程
  7. 【软件工程】药品存销信息管理系统
  8. tesseract4.1遇到奇怪的0xc000001d应用程序无法运行
  9. Windows 下 Gambit 启动脚本
  10. 贝叶斯优化BayesianOptimization