自动色彩均衡(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

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)

下面是实验结果,上边是原图,下边是增强结果。

————————————————

版权声明:本文为CSDN博主「zmshy2128」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/zmshy2128/article/details/53470357

卷积神经网络算法python实现_自动色彩均衡(ACE)快速算法python实现相关推荐

  1. 一日一技python安装_一日一技:快速实现Python 命令行参数

    一日一技:快速实现Python 命令行参数 摄影:产品经理 厨师:kingname 我们有时候需要使用 Python 开发一些命令行工具,并在运行命令的时候指定一些参数,例如: python3 xxx ...

  2. 医学图像处理医学图像处理-卷积神经网络卷积神经网络_基于深度卷积神经网络的刀具磨损量自动提取方法...

    ⬆点击上方蓝色字体,关注<工具技术>官方微信~ 数控加工实质上是刀具和毛坯的相互运动,包含众多的不可控因素,在工件成型的过程中,刀具不可避免发生磨损.为了提高加工效率,实际加工中一般采用高 ...

  3. 卷积神经网络matlab_基于卷积神经网络的遥感图像养殖区自动划分

    基于卷积神经网络的遥感图像养殖区自动划分 摘要:卷积神经网络是目前计算机视觉领域广泛应用的模型.我们在传统卷积神经网络的基础上,替换了全连接层,借助高分辨率图像,对海水养殖区进行识别和标记,最终实现了 ...

  4. python快速编程入门教程-python从入门到精通之30天快速学python视频教程

    python从入门到精通之30天快速学python视频教程 课程目录: python入门教程-1-Python编程语言历史及特性.mkv python入门教程-2-Python编程语言初接触.mkv ...

  5. python基础教程视频-python从入门到精通之30天快速学python视频教程

    python从入门到精通之30天快速学python视频教程 课程目录: python入门教程-1-Python编程语言历史及特性.mkv python入门教程-2-Python编程语言初接触.mkv ...

  6. 卷积神经网络计算题试题_卷积神经网络算法实例

    卷积神经网络CNN是Deep Learning的一个重要算法,在很多应用上表现出卓越的效果,[1]中对比多重算法在文档字符识别的效果,结论是CNN优于其他所有的算法.CNN在手写体识别取得最好的效果, ...

  7. OpenCV—python 自动色彩均衡(ACE)

    文章目录 一.ACE算法理论 1.1 ACE算法 二.快速ACE算法 2.1 原理 2.2 代码演示 一.ACE算法理论 图像对比度增强的算法在很多场合都有用处,特别是在医学图像中,这是因为在众多疾病 ...

  8. 卷积神经网络(CNN)_相关知识

    斯坦福公开课 CS231n Convolutional Neural Networks for Visual Recognition : http://cs231n.stanford.edu/syll ...

  9. 卷积神经网络计算题试题_卷积神经网络的计算

    转自:https://zhuanlan.zhihu.com/p/63174774 1. 卷积 卷积神经网络中的卷积是指定义好卷积核(kernel),并对图像(或者特征图,feature map)进行滑 ...

最新文章

  1. 神经网络?决策树?都做不到!谁能解决可解释性AI?
  2. 【转载】SOA面向服务架构简述
  3. 搭建本地文件服务器实验报告,下搭建服务器实验报告.pdf
  4. JavaScript websocket 实例
  5. php-rpm.conf,在新安装的宝塔面板中php无法启动起来
  6. 快手与央视达成合作:除夕晚8点上快手看春晚
  7. 谈如何边做事,边提高
  8. c语言对英文字母循环加密,加密英语
  9. ZYNQ 实现IEEE1588方法
  10. QQ登录界面(Java)
  11. skiller3.31 发布
  12. 使用 Marvelous Designer 为DAZ Studio 的 Genesis8 Female做衣服 1
  13. Bridging the Gap between Training and Inference for Neural Machine Translation翻译
  14. MicroPython中I2C模块的设计与实现(1) - machine_i2c框架的机制
  15. python ERROR: Could not find a version that satisfies the requirement requests (from versions: none)
  16. 【速记】Android让View的显示超出父容器
  17. cmd中cd命令使用
  18. BZOJ4810 [Ynoi2017]由乃的玉米田
  19. 树莓派CM4 Sensing(包含485接口)+python+继电器+水质仪+阿里云物联网平台ito实现实时检测水质并上传数据到阿里云ito和远程控制灯光
  20. Oracle报“无监听程序”解决方案

热门文章

  1. 大众流行编程语言有哪些 该选择哪一个来入门
  2. 10W 赞的程序员高薪职业建议
  3. (程序员版)没人能很轻松的对待工作
  4. 感悟:web前端工程师该如何定位
  5. apk android lite,APKPure Lite
  6. OpenCV中重映射
  7. Opencv 图像入门一之基本操作
  8. 小学奥数 7830 求小数的某一位 python
  9. 程序猿bug修改名句
  10. llinux c 语言延时,linux下写个C语言程序,要求有0.5微秒以下的延时,要怎样写