自动色彩均衡(ACE)快速算法
ACE算法源自retinex算法,可以调整图像的对比度,实现人眼色彩恒常性和亮度恒常性,通过差分来计算目标点与周围像素点的相对明暗关系来校正最终像素值,有很好的增强效果。但是计算复杂度非常高,本文提出一种有效的快速实现方法。
为叙述方便,这里假设后面的图像都是归一化到[0,1]之间的浮点数图像。
ACE算法的计算公式为:
Y = ∑(g(I(x0)-I(x))w(x0,x)) / ∑(w(x0,x)) x属于I (1)
其中,w是权重参数,离中心点像素越远w值越小,可以直接取值欧氏距离的倒数。g()是相对对比度调节参数,非线性的,简单取如下计算方法:
g(x) = max(min(ax, 1.0), -1.0) (2)
这里a是控制参数,值越大,细节增强越明显。计算完后,还要对Y进行一次归一化即可得到最终的增强图像。
ACE的增强效果普遍与retinex好。需要注意的是,ACE中当前像素是与整个图像的其他像素做差分比较,计算复杂度非常非常高,这也是限制它应用的最主要原因,本文主要基于两个假设:(1)对一副图像ACE增强后得到输出Y,如果对Y再进行一次ACE增强,输出仍然是Y本身;(2)对一副图像的ACE增强结果进行尺寸缩放得到Y,对Y进行ACE增强,输出仍然是Y本身。这两个假设我没法证实,呵呵,就算臆想的吧。
如果上面假设成立,我们就可以对图像进行缩放得到I1,对I1的ACE增强结果进行尺度放大(与I尺寸一样)得到Y1,那么Y和Y1是非常接近的,我们只需要在Y1基础上进一步处理即可。这里就又引申了两个细节问题:1)如何快速的求I1的ACE增强结果? 其实很简单,对它再次缩放得到I2,求I2的增强结果,依次类推,就是金字塔结构思想。2)如何在Y1基础上进一步处理得到Y? 因为是在整个图像域进行差分比较运算,与近处邻域像素的比较构成了Y的细节信息,与远处像素的比较构成了Y的全局背景信息,那么我们合理假设,Y和Y1的全局背景信息相同,只更新细节信息即可,也就是,我们需要在Y1基础上加上I中邻近像素的差分结果,并减去Y1中邻近像素的差分结果就是最终的输出Y。
上面说的有点绕,慢慢看吧。
下面是python代码
import cv2
import numpy as np
import math def stretchImage(data, s=0.005, bins = 2000): #线性拉伸,去掉最大最小0.5%的像素值,然后线性拉伸至[0,1]
ht = np.histogram(data, bins);
d = np.cumsum(ht[0])/float(data.size)
lmin = 0; lmax=bins-1
while lmin<bins:
if d[lmin]>=s:
break
lmin+=1
while lmax>=0:
if d[lmax]<=1-s:
break
lmax-=1
return np.clip((data-ht[1][lmin])/(ht[1][lmax]-ht[1][lmin]), 0,1) g_para = {}
def getPara(radius = 5): #根据半径计算权重参数矩阵
global g_para
m = g_para.get(radius, None)
if m is not None:
return m
size = radius*2+1
m = np.zeros((size, size))
for h in range(-radius, radius+1):
for w in range(-radius, radius+1):
if h==0 and w==0:
continue
m[radius+h, radius+w] = 1.0/math.sqrt(h**2+w**2)
m /= m.sum()
g_para[radius] = m
return m def zmIce(I, ratio=4, radius=300): #常规的ACE实现
para = getPara(radius)
height,width = I.shape
zh,zw = [0]*radius + range(height) + [height-1]*radius, [0]*radius + range(width) + [width -1]*radius
Z = I[np.ix_(zh, zw)]
res = np.zeros(I.shape)
for h in range(radius*2+1):
for w in range(radius*2+1):
if para[h][w] == 0:
continue
res += (para[h][w] * np.clip((I-Z[h:h+height, w:w+width])*ratio, -1, 1))
return res def zmIceFast(I, ratio, radius): #单通道ACE快速增强实现
height, width = I.shape[:2]
if min(height, width) <=2:
return np.zeros(I.shape)+0.5
Rs = cv2.resize(I, ((width+1)/2, (height+1)/2))
Rf = zmIceFast(Rs, ratio, radius) #递归调用
Rf = cv2.resize(Rf, (width, height))
Rs = cv2.resize(Rs, (width, height)) return Rf+zmIce(I,ratio, radius)-zmIce(Rs,ratio,radius) def zmIceColor(I, ratio=4, radius=3): #rgb三通道分别增强,ratio是对比度增强因子,radius是卷积模板半径
res = np.zeros(I.shape)
for k in range(3):
res[:,:,k] = stretchImage(zmIceFast(I[:,:,k], ratio, radius))
return res if __name__ == '__main__':
m = zmIceColor(cv2.imread('p4.bmp')/255.0)*255
cv2.imwrite('zmIce.jpg', m)
下面是实验结果,上边是原图,下边是增强结果。








自动色彩均衡(ACE)快速算法的更多相关文章
- Consul-template+nginx实现自动负载均衡
前言 consul-template 是 Consul 的一个守护程序,使用 consul-template 可以方便快速的实现对 Consul Key/Value 存储系统的访问,可以从 KV 系统 ...
- Op-level的快速算法
十岁的小男孩 本文为终端移植的一个小章节. 目录 引言 FFT Conv2d (7x7, 9x9) Winograd Conv2d (3x3, 5x5) 引言 本节针对CNN进行加速计算的,主要有以下 ...
- MinFilter(MaxFilter)快速算法C++实现
目录 1.算法简述 1.1.MinFilter(MaxFilter) 算法简述 1.2.MinFilter(MaxFilter) 快速算法简述 2.实现代码 2.1.MinFilterOneRow 单 ...
- 从大整数乘法的实现到 Karatsuba 快速算法
Karatsuba 快速乘积算法是具有独特合并过程(combine/merge)的分治算法(Karatsuba 是俄罗斯人).此算法主要是对两个整数进行相乘,并不适用于低位数(如 int 的 32 位 ...
- [转帖]利用nginx实现负载均衡 | 哈希算法,sticky模块实现session粘滞
利用nginx实现负载均衡 | 哈希算法,sticky模块实现session粘滞 2018年08月02日 10:06:03 Minza 阅读数 483 https://blog.csdn.net/ha ...
- 深度学习框架如何自动选择最快的算法?Fast Run 让你收获最好的性能!
作者:王博文 | 旷视 MegEngine 架构师 一.背景 对于深度学习框架来说,网络的训练/推理时间是用户非常看中的.在实际生产条件下,用户设计的 NN 网络是千差万别,即使是同一类数学计算,参数 ...
- LVS负载均衡理论以及算法概要
一. LVS简介 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.or ...
- nginx系列11:负载均衡哈希算法ip_hash与hash模块
使用默认的round-robin负载均衡算法无法保证某一类请求只能由上游的某一台应用服务器处理,它只适用于AKF扩展中的水平扩展,如果要保证某一类请求只能由上游的某一台应用服务器处理,就需要用到AKF ...
- nginx 负载均衡(默认算法)
使用 nginx 的upstream模块只需要几步就可以实现一个负载均衡: 在 nginx 配置文件中添加两个server server { listen ; server_name 192.168. ...
随机推荐
- 局域网不同网段访问设置WINS域名服务系统
大背景 公司两台路由器,网段不同 路由器:192.168.0.1 路由器:192.168.1.1 路由器2需要访问路由器1的机子,初始是ping不通的. 方案 使用IP设置里WINS设置,即可轻松实现 ...
- IIS6与IIS7中的w3wp工作进程
在IIS6中,每一个网站都有对应的应用程序池,在应用程序池有运行着网站的Application,在默认情况下,所有的网站的应用程序都会分配到默认的应用程序池当中, 当然,我们可以新建一个应用程序池 ...
- C# 所有特性,特性所在命名空间,那些命名空间拥有特性类
文章持续补充中 特性并不是集中在某一命名空间中,而是不同的特性在不同的命名空间下,特性是某一命名空间下提供的语法糖. 有哪些命名空间提供特性: 命名空间 描述 Microsoft.Build.Fram ...
- October 03rd 2017 Week 40th Tuesday
Don't make promises you can't keep. But those are the best kind. 不要许下做不到的承诺,但是我们做不到的承诺往往是最好的. The be ...
- MyEclipse10.6 myeclipse2013下添加jadClipse反编译插件 .
jad是一个使用比较广泛的Java反编译软件,jadClipse是jad在eclipse下的插件,下面像大家介绍下如何将jadclipse加入到MyEclipse10.X,9.X,8.X,6.X等各版 ...
- python第十四课--排序及自定义函数之自定义函数(案例三)
return关键字的使用:1).结束函数 2).将结果返回给函数的调用者/调用处 [注意事项]1).与return同一作用范围内的后面不要显示书写任何代码,因为永远不可能被执行到,不会报错. 2).r ...
- programming-languages学习笔记--第10部分
programming-languages学习笔记–第10部分 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.sr ...
- TCL函数“参数自动补全” 与 “help 信息显示”
tcl 函数参数自动补全和 help 信息显示 在EDA tool 中使用命令时,命令的参数可以通过 tab 键自动补全,而且可以使用 -help 显示帮助信息,使用起来很方便: 那么我们自己编写的 ...
- 输入一批考生的的准考证号码,如果是 15 位,表示输入正确,否则重新输入。然后判断这个人的考试类别(号码中如果是以奇数结尾则考试类别为“A 类”,否则为“B 类”),最后输出此准考证的前 5 位和后 4 位,其他位用“*”来代替。说明:使用 StringBuffer 类的相关方法完成实验内容。
因为是一批考生,所以先创建一个字符数组存放一组准考证号. 此外这个程序涉及到包装类与基本数据类型的互相转换. string的substring方法,返回一个字符串是该字符串的子串.从第一个参数开始,第 ...
- bat取时间间隔
@echo off echo 现在时间是%time:~,%点%time:~,%分%time:~,%秒 ,%%time:~,%%time:~,% pause echo 现在时间是%time:~,%点%t ...