问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

图像增强算法详解

创作时间:
作者:
@小白创作中心

图像增强算法详解

引用
CSDN
1.
https://m.blog.csdn.net/u012996959/article/details/142869115

图像增强是计算机视觉和图像处理领域中的重要技术,用于改善图像的视觉效果和质量。本文将介绍几种常见的图像增强算法,包括直方图均衡化、伽马校正、对数变换、拉普拉斯增强、Retinex理论、自适应直方图均衡化、噪声滤波和锐化等。这些方法可以单独使用,也可以组合使用,以根据特定应用场景定制增强效果。

一、图像增强算法原理

图像增强算法常见于对图像的亮度、对比度、饱和度、色调等进行调节,增加其清晰度,减少噪点等。图像增强往往经过多个算法的组合,完成上述功能,比如图像去燥等同于低通滤波器,增加清晰度则为高通滤波器,当然增强一副图像是为最后获取图像有用信息服务为主。一般的算法流程可为:图像去燥、增加清晰度(对比度)、灰度化或者获取图像边缘特征或者对图像进行卷积、二值化等,上述四个步骤往往可以通过不同的步骤进行实现,后续将针对此方面内容进行专题实验,列举其应用场景和处理特点。

本文章是一篇综合性文章,算是一篇抛砖引玉的文章,有均衡化、提高对比度、降低对比度的算法。

  1. 直方图均衡化:
    直方图均衡化通过重新映射像素值来扩展图像的动态范围,使得图像的灰度级分布更加均匀。这通常会增加图像的对比度。

  2. 伽马校正(Gamma Correction):
    通过改变像素值与最终输出之间的非线性关系来调整图像的亮度和对比度。伽马值小于1时,图像变亮;大于1时,图像变暗。

  3. 对数变换(Log Transform):
    对数变换常用于增强图像的低灰度级部分,尤其是当图像的大部分信息集中在较暗区域时。

拉普拉斯增强:
拉普拉斯算子是一个边缘检测器,可以增强图像中的边缘。它通过计算图像二阶导数的绝对值来找出像素值变化最剧烈的地方。

  1. Retinex理论:
    Retinex算法模拟人眼视觉系统,通过分离图像的照明和反射成分来增强细节和色彩。它通常涉及多尺度分析,如高斯金字塔,以及颜色恢复技术。

自适应直方图均衡化(Adaptive Histogram Equalization):
与全局直方图均衡化不同,自适应直方图均衡化在局部区域内进行,考虑了图像的局部特性,因此能更好地处理具有显著局部光照变化的图像。

  1. 噪声滤波(Noise Filtering):
    包括均值滤波、中值滤波、高斯滤波等,用于去除图像中的噪声,平滑图像,或保护边缘。

  2. 锐化(Sharpening):
    通过应用一个边缘增强的卷积核(如拉普拉斯核或Prewitt核)来突出图像的边缘和细节。

对比度拉伸:
调整图像的灰度范围,使图像的灰度级分布更宽,从而增强对比度。

这些方法可以单独使用,也可以组合使用,以根据特定应用场景定制增强效果。在实际应用中,通常需要根据图像的内容和目标应用选择合适的增强策略。

1.1 基于直方图均衡化的图像增强

图像对比度增强的方法可以分为两种:直接对比度增强方法,间接对比度增强方法。直方图拉伸和直方图均衡化是常见的间接对比度增强方法。直方图拉伸是利用对比度拉伸对直方图进行调整,扩大前景和背景灰度的差别,这种方法可以通过线性和非线性的方法来实现,其中ps中就是利用此方法提高对比度;直方图均衡化则是利用累积函数对灰度值进行调整,实现对比度的增强。

直方图均衡化处理原理:将原始图像的灰度图从比较集中的某个灰度区间均匀分布在整个灰度空间中,实现对图像的非线性拉伸,重新分配图像像素值。

对比度受限的自适应直方图均衡化(Contrast Limited Adaptive Histogram Equalization, CLAHE)是一种图像增强技术,特别适用于医学成像和其他领域,其中局部对比度的增强很重要,而全局对比度增强可能导致过饱和。CLAHE是对传统自适应直方图均衡化(Adaptive Histogram Equalization, AHE)的一种改进,以解决AHE在高对比度区域可能出现的过曝光问题。

(一)以下是CLAHE的基本原理和特点:

  1. 局部处理:
    CLAHE将图像分割成小的像素块(称为“tiles”),每个块独立进行直方图均衡化。这样可以针对图像的不同区域应用不同的增强,适应局部对比度的变化。

  2. 直方图均衡化:
    每个块内部,像素值的分布被重新映射以增强对比度。这通常通过创建该块的直方图,然后将直方图展平来实现,使得每个灰度级都有相同数量的像素。

  3. 对比度限制:
    为了避免小块内的对比度过高(即过曝光或过增强),CLAHE引入了一个对比度限制机制。当某个灰度级的像素数量超过预定阈值时,超出部分会被分散到其他灰度级,防止局部对比度过大。

  4. 克隆填充(Clipping and Cloning):
    在像素值映射过程中,超出直方图范围的像素(由于对比度限制)会被“克隆”到相邻的灰度级,以保持像素总数不变,同时避免在增强后的图像中出现空白区域。

平滑:
为了消除块之间的边界效应(即“伪影”),CLAHE通常会应用一种平滑操作,如双线性插值,来平滑相邻块之间的过渡。

  1. 参数调整:
    CLAHE有两个主要的可调参数:块大小(tile size)和对比度限制阈值。块大小决定了局部处理的区域,而对比度限制阈值决定了对比度增强的程度。

(二)算法应用场景:

  1. 算法的本质是重新分布图像的像素值,增加了许多局部的对比度,整体的对比度没有进行太大改变,所以应用图像为图像有用数据的对比度相近是,例如:X光图像,可以将曝光过度或曝光不足照片进行更好的显示,或者是背景及前景太亮或太暗的图像非常有用。

  2. 算法当然也有缺点,具体表现为:变换后的图像灰度级减少,某些细节减少;某些图像有高峰值,则处理后对比度不自然的过分增强。

算法实现特点:

  1. 均衡化过程:直方图均衡化保证在图像像素映射过程中原来的大小关系保持不变,即较亮的区域依旧较亮,较暗的依旧较暗,只是对比度增加,不能明暗颠倒;保证像素映射函数的值域在0和255之间。累积分布函数是单增长函数,并且值域是0到1。

  2. 累积分布函数实现过程:
    比较概率分布函数和累积分布函数,前者的二维图像是参差不齐的,后者是单调递增的。直方图均衡化过程中,映射方法是

其中,n是图像中像素的总和,

是当前灰度级的像素个数,L是图像中可能的灰度级总数。

来看看通过上述公式怎样实现的拉伸。假设有如下图像:

得图像的统计信息如下图所示,并根据统计信息完成灰度值映射:

映射后的图像如下所示:

算法伪代码:

  1. 计算原始灰度图像的像素概率分布
  2. 根据像素概率分布获取图像累积分布函数
  3. 根据映射函数获取变换后的图像

算法matlab代码:

%直方图均衡化
I = imread('rice.png');
[height,width] = size(I);
figure
subplot(221)
imshow(I)%显示原始图像
subplot(222)
imhist(I)%显示原始图像直方图

%进行像素灰度统计;
NumPixel = zeros(1,256);%统计各灰度数目,共256个灰度级
for i = 1:height
    for j = 1: width
        NumPixel(I(i,j) + 1) = NumPixel(I(i,j) + 1) + 1;%对应灰度值像素点数量增加一
    end
end
%计算灰度分布密度
ProbPixel = zeros(1,256);
for i = 1:256
    ProbPixel(i) = NumPixel(i) / (height * width * 1.0);
end
%计算累计直方图分布
CumuPixel = zeros(1,256);
for i = 1:256
    if i == 1
        CumuPixel(i) = ProbPixel(i);
    else
        CumuPixel(i) = CumuPixel(i - 1) + ProbPixel(i);
    end
end
%累计分布取整
CumuPixel = uint8(255 .* CumuPixel + 0.5);
%对灰度值进行映射(均衡化)
for i = 1:height
    for j = 1: width
        I(i,j) = CumuPixel(I(i,j));
    end
end

subplot(223)
imshow(I)%显示原始图像
subplot(224)
imhist(I)%显示原始图像直方图

1.2 基于拉普拉斯算子的图像增强

利用拉普拉斯算子进行图像增强本质是利用图像的二次微分对图像进行蜕化,在图像领域中微分是锐化,积分是模糊,利用二次微分对图像进行蜕化即利用邻域像素提高对比度。在opencv中也有拉普拉斯函数,但那时生成了灰度图像,更多的求取边缘,具体源码还没研究,其中原理可以参考我前一篇文章,针对拉普拉斯有个详细的介绍。

本次实验应用的卷积核为:

1.3 基于对象Log变换的图像增强

对数变换可以将图像的低灰度值部分扩展,显示出低灰度部分更多的细节,将其高灰度值部分压缩,减少高灰度值部分的细节,从而达到强调图像低灰度部分的目的。变换方法:

对数变换对图像低灰度部分细节增强的功能过可以从对数图上直观理解:

x轴的0.4大约对应了y轴的0.8,即原图上00.4的低灰度部分经过对数运算后扩展到00.8的部分,而整个0.41的高灰度部分被投影到只有0.81的区间,这样就达到了扩展和增强低灰度部分,压缩高灰度部分的值的功能。

从上图还可以看到,对于不同的底数,底数越大,对低灰度部分的扩展就越强,对高灰度部分的压缩也就越强。

1.4 基于伽马变换的图像增强

伽马变换主要用于图像的校正,将灰度过高或者灰度过低的图片进行修正,增强对比度。变换公式就是对原图像上每一个像素值做乘积运算:

伽马变换对图像的修正作用其实就是通过增强低灰度或高灰度的细节实现的,从伽马曲线可以直观理解:

γ值以1为分界,值越小,对图像低灰度部分的扩展作用就越强,值越大,对图像高灰度部分的扩展作用就越强,通过不同的γ值,就可以达到增强低灰度或高灰度部分细节的作用。

伽马变换对于图像对比度偏低,并且整体亮度值偏高(对于于相机过曝)情况下的图像增强效果明显。

二、测试代码

根据上述讲解,本文利用python进行编程实验,代码如下:

def preprocess(filename, i):
    image = cv2.imread(filename)
    image_gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
    
#    直方图均衡增强
    image_equal = cv2.equalizeHist(image_gray)
    r,g,b = cv2.split(image)
    r1 = cv2.equalizeHist(r)
    g1 = cv2.equalizeHist(g)
    b1 = cv2.equalizeHist(b)
    image_equal_clo = cv2.merge([r1, g1, b1])
    
#   拉普拉斯算法增强
    kernel = np.array([ [0, -1, 0],  
                    [-1,  5, -1],  
                    [0, -1, 0] ]) 
    image_lap = cv2.filter2D(image,cv2.CV_8UC3 , kernel)
    
#    对象算法增强
    image_log = np.uint8(np.log(np.array(image) +1))    
    cv2.normalize(image_log, image_log,0,255,cv2.NORM_MINMAX)
#    转换成8bit图像显示
    cv2.convertScaleAbs(image_log,image_log)
#    伽马变换
    fgamma = 2
    image_gamma = np.uint8(np.power((np.array(image)/255.0),fgamma)*255.0)
    cv2.normalize(image_gamma, image_gamma, 0, 255, cv2.NORM_MINMAX)
    cv2.convertScaleAbs(image_gamma, image_gamma)  

三、实验结果及分析

  1. log函数变化对图像增强来讲,更多是对图像的对比度有所减弱,毕竟函数表现形式为像素值小的变大点,像素值大的变小点,所以对比度减小,亮度增加,正如图像所显示。所以目前看来log函数还是慎用,如果提高函数可以利用分段函数啊。

  2. gamma函数图像增强,这个函数原理可以看出,当r大于1时,可以当做指数函数,小于则为log函数。在试验中我们常用r>1,实现图像对比度增强。从图像中可以看出,黑色更黑,白色更白。

  3. laplus函数图像增强,本质是微分,所以为图像锐化,在图像锐化是明显凸显图像的细节,进而直观上提高图像对比度。

  4. equal函数本质是重新分布图像的像素值,直观我们发现图像颜色发生变化,但对比度是有所提高,当然对于这组的图像的作用,没有体现。

总结:图像增强方法不同,应用领域不同,更好的应用需要掌握灵活多变的方法。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号