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.

以下为几组测试结果:

从左往右以此为: 原图, 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是一个比较有意思的图像增强的方法,主要用在医学图像上面.之前的比赛中,用到了这个,但是对其算法原理不甚了解.在这里做一个复盘. CLAHE起到的作用简单来说就是增强图像的对比度 ...

  2. 【图像增强】CLAHE 限制对比度自适应直方图均衡化

    文章目录: 目录 1 基本概述 2 竞赛中的CLAHE实现 3 openCV绘制直方图 4 对比度Contrast 5 Contrast Stretching 6 Histogram Equaliza ...

  3. 理解CSS视觉格式化

    前面的话   CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应 ...

  4. 彻底理解AC多模式匹配算法

    (本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...

  5. 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信

    接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...

  6. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  7. 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念

    一.前言     DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了.自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平 ...

  8. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

  9. ThreadLocal简单理解

    在java开源项目的代码中看到一个类里ThreadLocal的属性: private static ThreadLocal<Boolean> clientMode = new Thread ...

随机推荐

  1. A Telnet Client Using Expect

    The following expect script achieves a simple telnet client: login -> send command -> exit. Th ...

  2. Vue 实现微信提示浏览器转跳功能

    <template> <div class="main"> <div :class="show==true ? 'block':'block ...

  3. 【笔记】SVM思想解决回归问题

    使用svm思想解决回归问题 使用svm思想解决是如何解决回归问题,其中回归问题的本质就是找一条线,能够最好的拟合数据点 怎么定义拟合就是回归算法的关键,线性回归算法就是让预测的直线的MSE的值最小,对 ...

  4. 08-SpringCloud Consul

    Consul简介 官网 Consul下载地址 What is Consul? Consul is a service mesh solution providing a full featured c ...

  5. 我的微服务之路,看我搭建dapr趟过的坑

    前言 自从上周看了一个Dapr的视频,知道原来自己离微服务很近,简直触手可及. 心痒痒好久了,不动手实践验证一下简直是寝食难安.先是看官网的文档,可能是因为被墙了,有些网址是不能访问的,那安装搭建环境 ...

  6. NOIP 模拟 $15\; \text{夜莺与玫瑰}$

    题解 一道很妙的题,让求对于一个矩阵中,两点相连成线,有多少条直线,他们的交集是有限集. 转化一下题目,发现水平和竖直的只有 \(n+m\) 条,而左斜和右斜的条数是相同的,所以我们只需求出左或右中的 ...

  7. java集成网站微信,微博,qq登录

    微信 WechatConfig.java package com.meeno.chemical.common.sdk.wechat.config; import org.springframework ...

  8. java操作excel 工具类

    java操作excel 可参考https://blog.csdn.net/xunwei0303/article/details/53213130 直接上代码: 一.java生成excel文件: pac ...

  9. js判断checkbox是否选中 .checked不管用

    今天开发遇到一个小问题,记小本本记小本本 document.getElementById("id").checked //正确 //如果返回值为true代表选中 //如果返回值为f ...

  10. java 循环移位输出全排列

    //题目:利用1.2.2.3.4这4个数字,用java写一个main函数打印出所有不同的排列,如12234,,2234等,要求打印出来不能有重复 1 package test123; 2 3 impo ...