数字图像处理 图像对比度增强算法概览

一、图像对比度增强

        图像对比度增强又叫作图像对比度拉伸或者直接称为点运算。图像亮度和对比度调整的目的之一是在合适的亮度上提供最大的细节信息,细节纹理的沟纹越深,图像越清晰。在图像处理中,图像对比度增强是最基本的、原理比较简单却很重要的一类技术。它们能根据用户的要求改变图像数据占据的灰度范围,灰度分布范围越大,图像细节呈现得越清晰,同时对图像辐射分辨率的要求越高。

        图像对比度增强以预定的方式改变一幅图像,由于黑白图像对比度的大小主要取决于图像的灰度级级差,因此为了改善对比度过小的黑白图像的识别效果,就需要扩大图像灰度级之间的级差。当前,扩大图像灰度级级差的方法很多,主要有线性增强法、非线性增强法和直方图增强法、自适应增强法(ACE算法)及其各种变体等。

1、线性增强

        线性增强法是最常见的对图像的可视化质量进行改善的方法,由于它涉及的算法简单且容易实现,并且效果明显,所以它被看成是图像处理软件中基础而且不可缺少的功能模块。线性增强法主要包括基本线性增强方法及其改善方法。

        为了避免基本线性增强算法中个别极限灰度级的不良影响,可以考虑整幅图像的一些统计特性。用图像数据的统计数字特征增强图像的对比度。这种方法就是所谓的统计量算法。

        上述两种对比度调整方法适用于对整幅图像的对比度进行调整。若想对图像中某个特殊灰度级范围进行单独处理,则首先需要将原始图像进行灰度分段。我们把针对不同灰度段采用不同变换参数的线性变换叫做分段线性拉伸,也叫做灰级窗变换。

2、非线性增强

        灰度分布集中在很窄范围内的图像其对比度很低,不容易分辨其细微的灰度级变化。曝光过度或不足的图像都是低对比度图像。处理这些图像需要借助非线性的方法。当灰度变换函数为非线性函数时的对比度增强方法称为非线性点运算,也称为非线性增强。如指数变换、对数变换以及γ变换等。

        伽玛变换又称指数变换或幂次变换,是常用的灰度非线性变换。

        对数函数,对数变换可以扩展低值灰度,压缩高值灰度,这样可以使低值灰度的图像细节更容易被看清楚。

3、直方图增强

        直方图增强法是一种常用的非线性图像增强方法。这是一类通过修改图像直方图而改善图像质量的方法。比如直方图均衡化、直方图规定化等。

二、实时自适应对比度增强

1、论文地址

Real-Time Adaptive Contrast Enhancement | IEEE Journals & Magazine | IEEE Xplorehttps://ieeexplore.ieee.org/abstract/document/4767166

2、ACE算法实现

        1、求图像中每个点局部均值Mean(i,j)与局部方差Dev(i,j)

        2、增益函数确定

        3、通道融合与颜色空间转换

3、参考代码

from PIL import Image
from PIL import ImageEnhance
 
img = Image.open('./001.png')
 
#对比度增强  
enh_con = ImageEnhance.Contrast(img)  
contrast = 1.5
img_contrasted = enh_con.enhance(contrast)  
img_contrasted.save("./001_1.png")

# -*- coding: utf-8 -*-
import numpy as np
import cv2

def getVarianceMean(scr, winSize):
    if scr is None or winSize is None:
        print("The input parameters of getVarianceMean Function error")
        return -1
    
    if winSize % 2 == 0:
        print("The window size should be singular")
        return -1 
    
    copyBorder_map=cv2.copyMakeBorder(scr,winSize//2,winSize//2,winSize//2,winSize//2,cv2.BORDER_REPLICATE)
    shape=np.shape(scr)
    
    local_mean=np.zeros_like(scr)
    local_std=np.zeros_like(scr)
    
    for i in range(shape[0]):
        for j in range(shape[1]):   
            temp=copyBorder_map[i:i+winSize,j:j+winSize]
            local_mean[i,j],local_std[i,j]=cv2.meanStdDev(temp)
            if local_std[i,j]<=0:
                local_std[i,j]=1e-8
            
    return local_mean,local_std
    
def adaptContrastEnhancement(scr, winSize, maxCg):
    if scr is None or winSize is None or maxCg is None:
        print("The input parameters of ACE Function error")
        return -1
    
    YUV_img=cv2.cvtColor(scr,cv2.COLOR_BGR2YUV)    ##转换通道
    Y_Channel = YUV_img[:,:,0]
    shape=np.shape(Y_Channel)
    
    meansGlobal=cv2.mean(Y_Channel)[0]
    
   ##这里提供使用boxfilter 计算局部均质和方差的方法
#    localMean_map=cv2.boxFilter(Y_Channel,-1,(winSize,winSize),normalize=True)
#    localVar_map=cv2.boxFilter(np.multiply(Y_Channel,Y_Channel),-1,(winSize,winSize),normalize=True)-np.multiply(localMean_map,localMean_map)
#    greater_Zero=localVar_map>0
#    localVar_map=localVar_map*greater_Zero+1e-8
#    localStd_map = np.sqrt(localVar_map)
   
    localMean_map, localStd_map=getVarianceMean(Y_Channel,winSize)

    for i in range(shape[0]):
        for j in range(shape[1]):
            
            cg = 0.2*meansGlobal/ localStd_map[i,j];
            if cg >maxCg:
                cg=maxCg
            elif cg<1:
                cg=1
            
            temp = Y_Channel[i,j].astype(float)
            temp=max(0,min(localMean_map[i,j]+cg*(temp-localMean_map[i,j]),255))
            
#            Y_Channel[i,j]=max(0,min(localMean_map[i,j]+cg*(Y_Channel[i,j]-localMean_map[i,j]),255))
            Y_Channel[i,j]=temp
                
            
    YUV_img[:,:,0]=Y_Channel
    
    dst=cv2.cvtColor(YUV_img,cv2.COLOR_YUV2BGR)
    
    return dst

def main():
    img=cv2.imread(input_fn)
    
    if img is None:
        print("The file name error,please check it")
        return -1
    
    print(np.shape(img))
    dstimg=adaptContrastEnhancement(img,15,10)
    
    cv2.imwrite('output.jpg',dstimg)
    cv2.waitKey(0)
    
    return 0
 
    
input_fn='temp1.jpg'
if __name__ == '__main__':
    main()

4、参考网址
OpenCV—python 自适应对比度增强(ACE)_51CTO博客_python opencv findcontourshttps://blog.51cto.com/u_13984132/5622638

ACE增强算法(自适应对比度增强)---Adaptive contrast enhancement_沉默羔羊_GUET的博客-CSDN博客_ace算法https://blog.csdn.net/weixin_55984718/article/details/125822143

三、自适应图像对比度增强技术

        用于低对比度图像的自适应图像对比度增强技术

https://www.researchgate.net/profile/Shariq-Hussain-3/publication/337026412_An_Adaptive_Image_Contrast_Enhancement_Technique_for_Low-Contrast_Images/links/5dd2ebea4585156b351e8927/An-Adaptive-Image-Contrast-Enhancement-Technique-for-Low-Contrast-Images.pdf?origin=publication_detailhttps://www.researchgate.net/profile/Shariq-Hussain-3/publication/337026412_An_Adaptive_Image_Contrast_Enhancement_Technique_for_Low-Contrast_Images/links/5dd2ebea4585156b351e8927/An-Adaptive-Image-Contrast-Enhancement-Technique-for-Low-Contrast-Images.pdf?origin=publication_detail        基于直方图均衡的技术是用于对比度增强的广泛使用的技术。然而,它面临着对比度过度拉伸,这反过来会导致目标图像的细节丢失和不自然的外观。为了解决这个问题,上面的论文提出了一种新的图像对比度增强方案。

        首先,当图像尺寸减小时,图像可能会丢失许多重要信息。为此,将图像从空间域变换到小波域,从而实现多分辨率。第二,伽马校正是一种经过验证的技术,它通过选择最佳伽马值来产生自然外观并保持图像的平均亮度。这里,粒子群优化(PSO)用于选择最佳伽马值。在这项研究中,提出了一种有效的适应度函数来最大化PSO的性能。实验结果表明,所提出的方法在不引入任何伪影的情况下更大程度地提高了图像对比度。

四、加速自适应对比度增强

        加速自适应对比度增强(SUACE);基于OpenCV的实时自适应对比度增强技术的实现。

        SUACE是一种图像对比度增强算法,最初是为增强红外静脉图像而发明的。但SUACE可用于任何需要实时对比度增强的应用。

GitHub - ravimalb/suace: Speeded Up Adaptive Contrast Enhancement (SUACE);一种基于OpenCV的对比度增强技术。https://github.com/ravimalb/suace

五、其它参考

        平衡对比度增强

https://skydance.blog.csdn.net/article/details/119153046icon-default.png?t=MBR7https://skydance.blog.csdn.net/article/details/119153046

猜你喜欢

转载自blog.csdn.net/bashendixie5/article/details/128459250
今日推荐