图像增强 | CLAHE 限制对比度自适应直方图平衡化

admin/2020-07-27/ 分类:科技/阅读:

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 plt def 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~255 grayHist = cv2.calcHist([img], [0], None, [256], [0, 256]) # 绘制直方图 plot(grayHist) 

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

4 对比度Contrast

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

图片对比度指的是一幅图片中最亮的白和最暗的黑之间的反差巨细。常用的定量器量方式是Michelson对比度
(C = frac{I_{max}-I_{min}}{I_{max} I_{min}})

  • 当一幅图像最白和最黑像素灰度都是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也是做的一样的事情,只是它用的简朴的分段线性函数来重新映射灰度,现在用更巧妙地方式。

【界说一些数学符号】

  • (p(x)):调整之前的直方图的概率密度函数
  • (q(y)):调整之后的直方图的概率密度函数,可以看出来,是一个常数,以是用C来示意

由于不管怎么转换,概率密度函数的累积总是1,而转换前后的取值局限都是[0,1],以是可以获得:
(int_0^1{p(x)dx=int_0^1Cdy=1})
(固然,这里可以很快的算出来,C=1)

我们希望找到,一个x和y的映射关系,也就是(y=f(x))不难想到,这个(f(x))就应该是(p(x))的累积漫衍函数,也就是:
(f(x)=int_0^xp(u)du)


这个图中,直观的展示了,任何一个直方图,只要根据该直方图的累积漫衍函数举行拉伸,就可以获得一个矩形的直方图。

下面是一个行使这样的方式增强对比度的例子:

可以发现,在直方图麋集的地方,就会被拉的松散

再看另外一个例子:

可以发现,使用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. 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/



,

联博

www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。

TAG:
阅读:
广告 330*360
广告 330*360

热门文章

HOT NEWS
  • 周榜
  • 月榜
Sunbet_进入申博sunbet官网
微信二维码扫一扫
关注微信公众号
新闻自媒体 Copyright © 2002-2019 Sunbet 版权所有
二维码
意见反馈 二维码