图像增强是图像处理中的一个重要领域,旨在改善图像的视觉效果或提取更有用的信息。
对比度增强是图像增强中的一种常见技术,通过调整图像的对比度来增强图像的细节和清晰度。本文将介绍几种常见的对比度增强算法,并提供相关的代码资源。
文章最后还有关于无代码的图像增强算法即点即用说明!
对比度增强算法的目标是通过调整图像的像素值分布,使得图像的亮暗区域更加分明,从而增强图像的细节和视觉效果。常见的对比度增强算法包括直方图均衡化、自适应直方图均衡化、伽马变换、对比度拉伸等。
直方图是一个统计学上的概念,它通过一系列水平条形来展示数据的分布情况。在图像处理中,直方图用来表示图像中像素强度分布的图表,其中横轴代表像素强度值(通常是0到255的整数),纵轴代表具有该强度值的像素数量。直方图可以展示图像的亮度分布,帮助我们理解图像的整体亮度水平,以及图像中亮部和暗部的相对比重。
直方图通过统计图像中各个亮度级别的像素数量,能够直观地显示出图像亮度的分布情况。例如,在一个完全黑暗的图像中,所有的像素值都会集中在直方图的最左边,而在一个全白的图像中,直方图则会向最右边倾斜。一个具有均衡亮度的图像,其直方图将接近均匀分布,这意味着各个亮度级别的像素数量大致相同。
算法步骤:
计算图像的灰度直方图。
计算累积分布函数(CDF)。
使用CDF对图像像素进行映射。
代码示例:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
img = cv2.imread('image.jpg', 0)
# 直方图均衡化
equ = cv2.equalizeHist(img)
# 显示结果
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(img, cmap='gray')
plt.subplot(1, 2, 2)
plt.title('Histogram Equalized')
plt.imshow(equ, cmap='gray')
plt.show()
自适应直方图均衡化是对直方图均衡化的改进,它将图像分成若干个小区域,对每个区域分别进行直方图均衡化。这种方法可以更好地增强局部对比度,但可能会引入噪声。
在CLAHE提出以前,学者还提出了自适应直方图均衡Adaptive Histogram Equalization。自适应直方图均衡化(AHE)用来提升图像的对比度的一种计算机图像处理技术。和普通的直方图均衡算法不同,AHE算法通过计算图像的局部直方图,然后重新分布亮度来来改变图像对比度。因此,该算法更适合于改进图像的局部对比度以及获得更多的图像细节。
AHE的思想很简单:为了改善局部对比度,我们采用块操作。此时HE在每一个块上都会最优,从而实现各个局部最优。进一步,为了避免边界效应,我们组合块时采用双线性插值法,而不是简单的合并。
代码示例:
from skimage import exposure
import matplotlib.pyplot as plt
# 读取图像
img = cv2.imread('image.jpg', 0)
# 自适应直方图均衡化
adaptive_equalized = exposure.equalize_adapthist(img, clip_limit=0.03)
# 显示结果
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(img, cmap='gray')
plt.subplot(1, 2, 2)
plt.title('Adaptive Histogram Equalized')
plt.imshow(adaptive_equalized, cmap='gray')
plt.show()
CLAHE是AHE的改进版本,通过限制对比度来避免噪声的过度放大。它在增强局部对比度的同时,能够有效控制噪声。
CLAHE同普通的自适应直方图均衡不同的地方主要是其对比度限幅。这个特性也可以应用到全局直方图均衡化中,即构成所谓的限制对比度直方图均衡(CLAHE),但这在实际中很少使用。在CLAHE中,对于每个小区域都必须使用对比度限幅。CLAHE主要是用来克服AHE的过度放大噪音的问题。
这主要是通过限制AHE算法的对比提高程度来达到的。在指定的像素值周边的对比度放大主要是由变换函数的斜度决定的。这个斜度和领域的累积直方图的斜度成比例。CLAHE通过在计算CDF前用预先定义的阈值来裁剪直方图以达到限制放大幅度的目的。这限制了CDF的斜度。因此,也限制了变换函数的斜度。直方图被裁剪的值,也就是所谓的裁剪限幅,取决于直方图的分布因此也取决于领域大小的取值。
代码示例:
import cv2
import matplotlib.pyplot as plt
# 读取图像
img = cv2.imread('image.jpg', 0)
# CLAHE
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
clahe_img = clahe.apply(img)
# 显示结果
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(img, cmap='gray')
plt.subplot(1, 2, 2)
plt.title('CLAHE Image')
plt.imshow(clahe_img, cmap='gray')
plt.show()
Gamma变换是图像处理中用以调整图像的亮度和对比度来改善图像质量的。Gamma变换是基于人眼对亮度的感知非线性,人眼对亮度的敏感度随着亮度的增加而减少,也就是人眼在图像亮度较低时,人眼对亮度的变换更敏感。例如:人眼在夜晚很容易看见萤火虫,而在白天不容易看到天空中飞翔的鸟。
Gamma 变换本质上是一种对图像进行非线性亮度变换的过程,目的是为了更好地匹配人眼对光线强度的非线性响应特性。人的视觉系统对光照强度的反应并不是线性的,这意味着一个线性变化的光强,人眼感知起来却并非如此。
算法步骤:
对图像像素值进行归一化。
应用伽马变换:
I_out = I_in ^ gamma
将像素值重新映射到原始范围。
代码示例:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
img = cv2.imread('image.jpg', 0)
# 伽马校正
gamma = 1.5
gamma_corrected = np.power(img / 255.0, gamma) * 255.0
gamma_corrected = np.uint8(gamma_corrected)
# 显示结果
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(img, cmap='gray')
plt.subplot(1, 2, 2)
plt.title('Gamma Corrected Image')
plt.imshow(gamma_corrected, cmap='gray')
plt.show()
对比度拉伸通过线性变换将图像的像素值范围扩展到整个动态范围,从而增强图像的对比度。
代码示例:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
img = cv2.imread('image.jpg', 0)
# 对比度拉伸
min_val = np.min(img)
max_val = np.max(img)
stretched_img = (img - min_val) * (255.0 / (max_val - min_val))
stretched_img = np.uint8(stretched_img)
# 显示结果
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(img, cmap='gray')
plt.subplot(1, 2, 2)
plt.title('Contrast Stretched Image')
plt.imshow(stretched_img, cmap='gray')
plt.show()
图像的对比度增强算法在很多场合都有着重要的应用,特别是在医学图像上,这是因为在众多疾病的诊断中,医学图像的视觉检查是很有必要的。而医学图像由于本身及成像条件的限制,图像的对比度很低。因此,在这个方面已经开展了很多的研究。这种增强算法一般都遵循一定的视觉原则。众所周知,人眼对高频信号(边缘处等)比较敏感。虽然细节信息往往是高频信号,但是他们时常嵌入在大量的低频背景信号中,从而使得其视觉可见性降低。因此适当的提高高频部分能够提高视觉效果并有利于诊断。
局部对比度增强(Local Contrast Enhancement, LCE)是一种图像处理技术,旨在通过调整图像的局部区域对比度,增强图像细节和视觉效果。
在局部对比度增强方面,有两种方式是最为有名的,一种是自适应直方图均衡化(AHE),还有一种就是自适应对比度增强(ACE)。AHE算法使用局部的直方图的相关信息对数据进行映射。这改变了图像的对比度,但是需要大量的计算。后来有人利用了双线性差值技术克服了这个问题,首先将图像分块,然后分别计算这些块内部的映射关系。为了增强某一个像素点的值,映射关系通过与这个像素所在块相邻的四个块的映射关系差值获得。在这个算法中,仅仅需要一个块大小的参数。
ACE算法采用了反锐化掩模技术,我们对此过程解释如下:首先图像被分成两个部分。一是低频的反锐化掩模(unsharp mask)部分,可以通过图像的低通滤波(平滑,模糊技术)获得。二是高频成分,可以过原图减去反锐化掩模获取。然后高频部分被放大(放大系数集为对比度增益CG)并加入到反锐化掩模中去,最后得到增强的图像。
代码示例:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
img = cv2.imread('image.jpg', 0)
# 局部对比度增强
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])
local_enhanced = cv2.filter2D(img, -1, kernel)
# 显示结果
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(img, cmap='gray')
plt.subplot(1, 2, 2)
plt.title('Local Contrast Enhanced Image')
plt.imshow(local_enhanced, cmap='gray')
plt.show()
对比度增强是图像处理中的一个重要技术,能够有效提升图像的视觉效果和细节。本文介绍了几种常见的对比度增强算法,包括直方图均衡化、自适应直方图均衡化、CLAHE、伽马校正、对比度拉伸和局部对比度增强通过这些算法,可以根据不同的应用场景选择合适的对比度增强方法,以达到最佳的图像处理效果。
Coovally AI模型训练与应用平台整合了30+国内外开源社区1000+模型算法以及各类公开识别数据集。
同样也有几十种图像增强工具,其中包含了直方图均衡化、灰度变换、随机缩放、随机亮度对比度、Gamma变换、FancyPCA、CLAHE、通道打乱等,皆可无代码实现,上传图片选择增强方法,实时可见增强后效果,还能下载数据和模型训练。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。