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

news2024/9/23 20:25:52

一、图像对比度增强

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

        图像对比度增强以预定的方式改变一幅图像,由于黑白图像对比度的大小主要取决于图像的灰度级级差,因此为了改善对比度过小的黑白图像的识别效果,就需要扩大图像灰度级之间的级差。当前,扩大图像灰度级级差的方法很多,主要有线性增强法、非线性增强法和直方图增强法、自适应增强法(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/137424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前端】Vuex模块化和持久化应用示例

概述 Vuex作为VUE状态管理组件&#xff0c;能够将项目公共数据进行统一管理。而且可以按照不同的业务功能将数据状态分模块管理。另外&#xff0c;对于网页刷新导致Vuex状态丢失的问题可以使用vuex-persistedstate插件配置将数据保存在localStorage或者sessionStorage中。 本…

「Python|场景案例」如何给图片添加水印

本文主要介绍如何使用python的PIL库给图片增加水印 文章目录背景说明工具准备处理步骤源代码处理效果展示背景说明 当我们想给一些图片添加水印的时候&#xff0c;尤其是图片数量较多的时候&#xff0c;就可以使用python进行自动化处理。包括但不限于在自媒体上发布自己的各种…

如何使用自助式商业智能 (BI) 避免组织中的数据孤岛

许多组织都存在数据问题。当许多员工远程工作&#xff08;或在混合环境中&#xff09;并在多个位置使用多个设备访问公司数据时&#xff0c;他们正在处理信息过载问题。这只会加剧数据孤岛的问题。 数据孤岛正是它听起来的样子&#xff1a;孤立在一个孤立的用户/环境中的数据&…

jdk版本和Class编译版本对应关系

JDK version和class file version(Class编译版本号)对应关系 JDK 17 61, JDK 16 60, JDK 15 59, JDK 14 58, JDK 13 57, JDK 12 56, JDK 11 55, JDK 10 54, JDK 9 53, JDK 8 52, JDK 7 51, JDK 6.0 50, JDK 5.0 …

数据结构-归并排序

一、概念及其介绍 归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效、稳定的排序算法&#xff0c;该算法是采用分治法(Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每…

三年“云改”,移动云这份答卷有多“硬”?

作者 | 曾响铃 文 | 响铃说 云计算是推动数字经济与实体经济深度融合的催化剂&#xff0c;是重点领域数字产业发展的助推器。近年来我国云计算产业发展提速&#xff0c;加快推动实体企业转型升级和创新发展。 2022年是移动云实施“云改”战略的第3年&#xff0c;也是移动云全…

【人工智能】基于五笔字型规范和人工神经网络的简中汉字识别【二】

环境搭建 一、NVIDIA驱动安装与更新二、Anaconda安装三、Pytorch安装四、验证CUDA和cudnn版本一、NVIDIA驱动安装与更新 显卡驱动就是用来驱动显卡的程序,它是硬件所对应的软件。 正常情况下,配有显卡的电脑都是安装有驱动程序的,但是有的时候驱动可能版本较低,所支持的 …

爬虫内容学习-工具类---Selenium

一、爬虫学习建议&#xff1a; 在编写python爬虫程序时&#xff0c;只需要做以下两件事&#xff1a; 发送GET请求&#xff0c;获取HTML [第一类] 解析HTML&#xff0c;获取数据 [第二类] 这两件事&#xff0c;python都有相应的库帮你去做&#xff0c;你只需要知道…

关乎你我,2022年都经历了哪些安全事件?|上云那些事

2022年&#xff0c;网络安全跟人们的工作生活关联愈发紧密。腾讯安全联合南方日报、南方&#xff0c;携手共建《上云那些事》栏目&#xff0c;为企业提供网络安全建设新思路&#xff0c;帮助大家及时发现身边的网络安全陷阱&#xff0c;提升安全意识和防范能力&#xff0c;减少…

论文阅读-虚假信息检测综述 - Fake News Detection on Social Media: A Data Mining Perspective

论文链接&#xff1a;https://arxiv.org/pdf/1708.01967.pdf 目录 摘要 1 引言 2. 假新闻定义 2.1 假新闻的定义 2.2 传统新闻媒体上的假新闻 2.3社交媒体上的假新闻 3.假新闻检测 3.1问题定义 3.2 特征提取 3.2.1 新闻内容特征 3.2.2 社会语境特征 3.3 模型构建 …

浅谈DNS域名解析的过程

用户在浏览器输入www.baidu.com时&#xff0c;DNS域名解析大致分为以下几个过程: 浏览器客户端检查自身有没有该域名的缓存&#xff1a; 如果浏览器有命中&#xff0c;直接返回该域名对应的IP地址&#xff0c;解析结束; (这个缓存可以设置TTL来控制有效时间&#xff0c;有点像A…

用C++求两个数的最大公约数和最小公倍数。(数论的基础思想)

目录原理最大公约数最小公倍数代码运行结果原理 最大公约数 有两个数字n和m。现在要求两个数字的最大公约数。 例如&#xff1a;n为18&#xff0c;m为4. 正常我们的思路求解最大公约数是暴力破解&#xff0c;遍历一遍公约数&#xff0c;取最大的那个&#xff0c;但是这样有一…

关闭Mac的Microsoft AutoUpdate弹框提示

macOS安装Microsoft Office for Mac之后&#xff0c;有时候会弹出Microsoft Auto Update微软应用自动更新工具。就像下面这样&#xff1a;&#xff08;我不知道您会不会烦&#xff0c;我是烦了&#xff09; 如果您也和我一样&#xff0c;不喜欢这样不经过允许就自动弹框的提示&…

【uiautomator2】 Android自动化测试框架

UiAutomator是Google提供的用来做安卓自动化测试的一个Java库. Uiautomator工作流程 1.在移动设备上安装atx-agent(守护进程),随后atx-agent启动uiautomator2服务(默认7912端口)进行监听 2.在PC上编写测试脚本并执行(相当于发送HTTP请求到移动设备的server端) 3.移动设备通过Wi…

python import失败解决方案

错误从何而起? 此时有这么一个目录结构 我们从a/b下执行python.exe ./main.py命令开始 案例: a/b/main.py导入a/package if __name__ "__main__":# 报错 ModuleNotFoundError: No module named packageimport package # 报错 ImportError: attempted relative…

Netty网络编程 - NIO基础

一. NIO 基础 non-blocking io 非阻塞 IO 1. 三大组件 1.1 Channel & Buffer channel 有一点类似于 stream&#xff0c;它就是读写数据的双向通道&#xff0c;可以从 channel 将数据读入 buffer&#xff0c;也可以将 buffer 的数据写入 channel&#xff0c;而之前的 st…

时间序列分析之auto_arima自动调参

背景 我们在进行ARIMA建模时&#xff0c;有一个非常重要的事情就是确定其中超参数p, d, q。 一般的流程需要先根据平稳性来确认差分的阶数d&#xff0c;然后根据平稳序列来观察ACF图和PACF图来确认p和q&#xff0c;当然中间还要根据网格训练查看AIC的值来确认&#xff0c;真个…

软件设计模式-行为型模式

行为型模式 行为型模式是对在不同的对象之间划分责任和算法的抽象化通过行为型模式&#xff0c;可以更加清晰地划分类与对象的职责&#xff0c;并研究系统在运行时实例对象之间的交互。在系统运行时&#xff0c;对象并不是孤立的&#xff0c;他们可以通过相互通信与协作完成某…

数据赋能的未来,看向嵌入式BI

数据分析能力越来越成为消费者和企业的必备品应用程序&#xff0c;复杂程度各不相同&#xff0c;从简单地一个网页或门户上托管一个可视化或仪表板&#xff0c;到在一个云服务上实现数据探索、建模、报告和可视化创建的应用程序。BI的实现方式越来越多&#xff0c;无论规模大小…

南京晓庄操作系统期末复习【大题】

操作系统期末复习大题第六章磁盘调度寻道时间与移动次数转换I/O中断请求第五章地址转换页面置换第四章动态分区地址转换第三章银行家算法处理机调度算法第二章进程同步第一章多道运行时间第六章 磁盘调度 前提小知识&#xff1a; 1.先来先服务&#xff08;FCFS&#xff09;:…