关注:决策智能与机器学习,深耕AI脱水干货

者 |  机器学习炼丹术

来源 |  机器学习炼丹术

1 基本概述

CLAHE是一个比较有意思的图像增强的方法,主要用在医学图像上面。之前的比赛中,用到了这个,但是对其算法原理不甚了解。在这里做一个复盘。

CLAHE起到的作用简单来说就是增强图像的对比度的同时可以抑制噪声

CLAHE的英文是Contrast Limited Adaptive Histogram Equalization 限制对比度的自适应直方图均衡。在学习这个之前,我们要先学习一下下面的前置算法:

  1. 【Contrast Stretching】:对比度拉伸;

  2. 【HE】:直方图均衡;

  3. 【CLHE】:对比度限制的HE

  4. 【AHE】:自适应直方图均衡化

2 竞赛中的CLAHE实现

在比赛中,我们往往使用albumentations库函数进行图像的预处理,因为这个预处理库的运行速度非常的快,而且封装了大量的图像增强的方法。图像任务的话这个库函数非常滴奈斯。

本文中会介绍一下albumentations库函数实现CLAHE的代码,然后再用openCV实现。

import albumentations
RESIZE_SIZE = 1024 # or 768
train_transform = albumentations.Compose([albumentations.Resize(RESIZE_SIZE, RESIZE_SIZE),albumentations.OneOf([albumentations.RandomGamma(gamma_limit=(60, 120), p=0.9),albumentations.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.2, p=0.9),albumentations.CLAHE(clip_limit=4.0, tile_grid_size=(4, 4), p=0.9),]),albumentations.HorizontalFlip(p=0.5),albumentations.ShiftScaleRotate(shift_limit=0.2, scale_limit=0.2, rotate_limit=20,interpolation=cv2.INTER_LINEAR, border_mode=cv2.BORDER_CONSTANT, p=1),albumentations.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225), max_pixel_value=255.0, p=1.0)])

这是一个图像增强的pipline,其中的流程是:

  • Resize就是拉伸图片修改尺寸

  • RandomGamma就是使用gamma变换

  • RandomBrightnessContrast就是随机选择图片的对比度和亮度

  • CLAHE是一种对比度受限情况下的自适应直方图均衡化算法

  • HorizontalFlip水平翻转

  • ShiftScaleRotate这个就是平移缩放旋转三合一,给力!

  • Normalize这个就是图像归一化了。

本文主要讲解的就是CLAHE这个直方图均衡化的算法。

3 openCV绘制直方图

使用openCV的代码来获取一个图片的灰度直方图:

import cv2
import numpy as np
import matplotlib.pyplot as pltdef plot(grayHist):plt.plot(range(256), grayHist, 'r', linewidth=1.5, c='red')y_maxValue = np.max(grayHist)plt.axis([0, 255, 0, y_maxValue]) # x和y的范围plt.xlabel("gray Level")plt.ylabel("Number Of Pixels")plt.show()if __name__ == "__main__":# 读取图像并转换为灰度图img = cv2.imread(r'E:\dog.jpg', 0)# 图像的灰度级范围是0~255grayHist = cv2.calcHist([img], [0], None, [256], [0, 256])# 绘制直方图plot(grayHist)

狗子的图片就是左边的这个,发现灰度值在100左右的像素个数最多:

4 对比度Contrast

在生活中,我们在PS图片的时候,往往会用到图片对比度,那么这个究竟是什么东西呢?

图片对比度指的是一幅图片中最亮的白和最暗的黑之间的反差大小。常用的定量度量方法是Michelson对比度:

  • 当一幅图像最白和最黑像素灰度都是128时,图像对比度最低,C=0;

  • 当一幅图像最白像素灰度=255,最黑像素灰度=0时,图像对比度最高,C=1.0。

【英文中如何描述高对比度与低对比度的?】

当一幅图像最白和最黑像素灰度都在128附近浮动时,图像的直方图集中在中间的几个桶,图像看起来灰蒙蒙的,英语中使用dull描述这种效果。相反,如果图像中黑白像素的跨度较大,则图像富有通透感,英语中使用clarity描述这种效果。

图片中左边的图片就是dull,灰度直方图也是集中在中间区域,这就是低对比度;最右边的图片是clarity,直方图感觉是被拉开了、舒展了,这就是高对比度

5 Contrast Stretching

我们已经搞懂了图片不通透的原因,就是灰度直方图不够舒展,集中在了一个小区域,这样我们可以通过数学的方法把低对比度的图像提高对比度。最简单的方法就是对比度拉伸(Contrast Stretching)

现在有这样的一个低对比度的图片,其灰度直方图集中在中间的区域。然后我们想把这个灰度直方图拉伸到整个0~255的区间,我们怎么做呢?(这里假设这个低对比度的图片的灰度集中在100到200之间好了)

用一个这样的分段线性函数,来处理上面那个低对比度图片的时候,可以把(r2,s2)极端的设置成(100,0),把(r3,s3)设置成(200,255),这样把原来的直方图通过这个函数映射,其实就是把100~200范围线性拉伸到0~255这么大。

这种方法最简单,简单的说就是线性拉伸直方图。对于某些图片可以起到效果:

但是对于比较复杂的图片,并没有什么效果:

6 Histogram Equalization

对比度解决不了的问题,我们来用HE试试。Histogram Equalization的思想就是用数学方法重新调整像素的亮度分布,来保证直方图具有最大的动态范围,也就是尽可能地让灰度直方图是一个矩形!

其实Contrast Stretching也是做的一样的事情,只是它用的简单的分段线性函数来重新映射灰度,现在用更巧妙地方法。

【定义一些数学符号】

  • :调整之前的直方图的概率密度函数

  • :调整之后的直方图的概率密度函数,可以看出来,是一个常数,所以用C来表示

因为**不管怎么转换,概率密度函数的累积总是1,而转换前后的取值范围都是[0,1],**所以可以得到:(当然,这里可以很快的算出来,C=1)

**我们希望找到,一个x和y的映射关系,也就是,**不难想到,这个就应该是的累积分布函数,也就是:

这个图中,直观的展示了,任何一个直方图,只要按照该直方图的累积分布函数进行拉伸,就可以得到一个矩形的直方图。

下面是一个利用这样的方法增强对比度的例子:可以发现,在直方图密集的地方,就会被拉的松散

再看另外一个例子:可以发现,使用HE之后的直方图的累积分布函数,是一个直线

7 CLAHE

HE算法在一种情况下,效果不好,如果一个图片中有大块的暗区或者亮区的话,效果非常不好。这个的原因,也非常好理解,因为HE其实要求一个图片中必须有10%的最亮的像素点,必须有10%第二亮的像素点,必须有10%第三亮的像素点……假设有一张纯黑的图片,你想想经过HE处理之后,会出现什么情况?答案就是一部分黑的像素也会被强行搞成白的

下面是一个例子,发现经过HE之后的图片出现了大量噪点:

【Histogram Equalization的缺点】

  1. 对于灰度非常集中的区域,直方图会被拉的非常稀疏,从而导致对比度增强过大,成为噪音;

  2. 一些区域调整后丢失细节

7.1 Contrast Limited HE

针对第一个问题,提出了CLHE,加入对比度限制,其实原理很简单置直方图分布的阈值,将超过该阈值的分布“均匀”分散至概率密度分布上,由此来限制转换函数(累计直方图)的增幅。

这样的话,直方图就不会出现概率密度函数过大的区域,从而避免了某些集中区域被拉得过于系数。

7.2 Adaptive HE

Adaptive HE的基本思想是将原始图片划分成子区域,然后对每个子区域进行HE变换。当然,这样做的问题应该是显而易见的:每一块区域之间都会有非常大的不连续。因此为了解决这个问题,提出了优化方案双线性插值的AHE,然后这个基础上再使用CLHE的截断对比度的思想,就变成了我们现在的CLAHE算法。

【使用双线性插值的方案】

  1. 将图像分为多个矩形块大小,对于每个矩形块子图,分别计算其灰度直方图和对应的变换函数(累积直方图)

  2. 将原始图像中的像素按照分布分为三种情况处理:

  • 红色区域中的像素按照其所在子图的变换函数进行灰度映射

  • 绿色区域中的像素按照所在的两个相邻子图变换函数变换后进行线性插值得到

  • 紫色区域中的像素按照其所在的四个相邻子图变换函数变换后双线性插值得到

8 结果对比与openCV实现

【这里是openCV实现HE的方法】

img = cv.imread(r'E:\dog.jpg', 0)
equ = cv.equalizeHist(img)  # 输入为灰度图
res = np.hstack((img, equ))  # stacking images side-by-side
cv.imwrite('res.png',res)

运行结果:【openCV实现CLAHE】

img = cv2.imread(r'E:\dog.jpg', 0)# create a CLAHE object
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)
res = np.hstack((img, cl1))
cv2.imwrite('res.jpg', res)

结果是:


【更多对比的例子】

  • 左边是原图

  • 中间是HE,有过亮过暗的区域;

  • 右边是CLAHE,没有过亮过暗的区域。

然后我在另外一个博文,找到了上面那个例子的彩色版本哈哈:

历史精华好文

  • 专辑1:AI产品/工程落地

  • 专辑2:AI核心算法

  • 专辑3:AI课程/资源/数据

交流合作

请加微信号:yan_kylin_phenix注明姓名+单位+从业方向+地点,非诚勿扰。

参考文章:

  1. https://zhuanlan.zhihu.com/p/98541241

  2. https://blog.csdn.net/lwx309025167/article/details/103770834

  3. https://blog.csdn.net/u013066730/article/details/82970380

  4. https://www.cnblogs.com/imageshop/archive/2013/04/07/

  5. http://helloworld2020.net/393/

CLAHE算法实现图像增强「AI工程论」相关推荐

  1. 自动驾驶 | 全面解读小马智驾的解决方案「AI工程落地」

    关注:耕智能,深耕AI脱水干货 作者:Pony.ai  来源:汽车电子与软件 转载请联系作者 "我们相信保持谨慎.严谨的理念与做法是通往未来的唯一正途,没有捷径.这种信仰正是指引我们研发.测 ...

  2. 「重磅」轮式机器人自平衡+足式机器人走梅花桩「腾讯AI」「AI工程落地」

    关注:决策智能与机器学习,深耕AI脱水干货 作者:腾讯AI实验室 来源:腾讯AI实验室 转载请联系作者 近日,腾讯公布了其在移动机器人研究方面的新进展:四足移动机器人 Jamoca 和自平衡轮式移动机 ...

  3. 「谷歌等」四足机器人2020重要研究进展+宇树狗舞蹈放送「AI工程落地」

    作者:小A  来源:Unitree宇树科技   转载请联系作者 舞蹈时间-来自宇树科技的A1小狗 2020重要研究进展 一.谷歌和加利福尼亚大学伯克利分校(Berkeley)深入研究了四足生物的运动姿 ...

  4. 全流程设计自动驾驶「AI工程落地」

    关注:决策智能与机器学习,深耕AI脱水干货 作者:Aimee  来源:焉知自动驾驶 转载请联系作者 提要:面向自动驾驶,本文用基于模型的系统工程思维梳理了从需求到产品.从逻辑架构到物理架构的设计全过程 ...

  5. 复杂环境下的高精度定位「自动驾驶」「AI工程落地」

    关注:决策智能与机器学习,深耕AI脱水干货 作者:DataFun&小马智行  来源:焉知自动驾驶 转载请联系作者 首先,定位(Location)和导航(Navigation)技术是负责实时提供 ...

  6. 低成本高精度导航定位技术 | 自动驾驶「AI工程论」

    关注:决策智能与机器学习,深耕AI脱水干货 作者 |  子路 来源 |  高德技术 导读 地图软件现在已成为人们出行必备的重要辅助工具.为了实现准确的导航,首先必须准确确定人或车的当前位置.因此,定位 ...

  7. DEMO | AI预测股票短期走势「AI工程论」

    关注:决策智能与机器学习,深耕AI脱水干货 作者 | Mat Steininger 来源 |  Towards data science 前言 你有没有听人说过,他们多么希望能回到过去,投资苹果或亚马 ...

  8. 腾讯 | 自动驾驶仿真平台TAD Sim 2.0「AI工程论」

    关注:决策智能与机器学习,深耕AI脱水干货 作者 | 易车 来源 |  自动驾驶测试验证技术创新论坛 报道 |  GRCC 随着自动驾驶领域硬件.算法等方面的快速发展,虚拟仿真技术在自动驾驶研发和测试 ...

  9. 「AI不惑境」数据压榨有多狠,人工智能就有多成功

    https://www.toutiao.com/a6703348023008690701/ 大家好,今天开始就进入了专栏<AI不惑境>的更新了,这是第一篇文章,讲述数据如何驱动深度学习. ...

最新文章

  1. 计算机管理器中没有停止共享,域客户端默认共享关闭讨论.
  2. JZOJ 5977. 【清华2019冬令营模拟12.15】堆
  3. 集合转数组的toArray()和toArray(T[] a)方法
  4. centos 7mysql加tomcat_CentOS 7环境搭建(JDK、Tomcat、Mysql)
  5. web前端工作笔记008---js延迟执行代码
  6. Intel的X86芯片段式管理历史起源(CS、DS、ES、SS)——避免产品公司的小九九
  7. 【JAVA错误笔记】 - Unable add facets project AnnotationWebService CXF 2-x Web Services
  8. C语言中的一些基本函数说明及使用
  9. java 取色器_Arava: 用 swing 写一个取色器
  10. 花花省淘宝客APP源码带淘宝京东拼多多唯品会优惠券自营商城本地生活CPS外卖优惠电影票话费
  11. PS2021下载Photoshop2021下载安装详细步骤
  12. 利用Linux查找重复文件(shell脚本)
  13. 《周一清晨的领导课》笔记-NO.1
  14. android 打开摄像头
  15. 关于 RT-Thread 内核调度算法中 __rt_ffs函数为什么要检测 value值是否为0的疑问
  16. 虚拟机在线迁移Vmotion
  17. 有些爱意,在岁月中飘遥
  18. 积分竟然比微分早了1300年!一文讲清积分的历史
  19. 好东西下载Download
  20. 奥比中光网络深度摄像头——人脸活体检测

热门文章

  1. C Note(NO.7)
  2. linux常用命令(自我积累)
  3. init: cannot execve(‘XXX’):Permission denied问题
  4. QQ影音文件无法渲染
  5. 测试英语口语标准的软件,最客观的英语口语APP亲身测评,这3款软件让你的口语脱颖而出...
  6. CGAL 点云数据读取与保存
  7. 机器学习之KMeans聚类算法原理(附案例实战)
  8. python 字典嵌套学习
  9. 复数complex的magnitude是什么
  10. dart语言基础_变量声明