卷积神经网络算法python实现_自动色彩均衡(ACE)快速算法python实现
自動(dòng)色彩均衡(ACE)快速算法
ACE算法源自retinex算法,可以調(diào)整圖像的對比度,實(shí)現(xiàn)人眼色彩恒常性和亮度恒常性,通過差分來計(jì)算目標(biāo)點(diǎn)與周圍像素點(diǎn)的相對明暗關(guān)系來校正最終像素值,有很好的增強(qiáng)效果。但是計(jì)算復(fù)雜度非常高,本文提出一種有效的快速實(shí)現(xiàn)方法。
為敘述方便,這里假設(shè)后面的圖像都是歸一化到[0,1]之間的浮點(diǎn)數(shù)圖像。
ACE算法的計(jì)算公式為:
Y = ??∑(g(I(x0)-I(x))w(x0,x)) ?/?∑(w(x0,x)) ???????????????????????????????????x屬于I ???????????????????????????????(1)
其中,w是權(quán)重參數(shù),離中心點(diǎn)像素越遠(yuǎn)w值越小,可以直接取值歐氏距離。g()是相對對比度調(diào)節(jié)參數(shù),非線性的,簡單取如下計(jì)算方法:
g(x) = max(min(ax, 1.0), -1.0) ???????????????????????????????????????????????????????????????????????????????????????(2)
這里a是控制參數(shù),值越大,細(xì)節(jié)增強(qiáng)越明顯。計(jì)算完后,還要對Y進(jìn)行一次歸一化即可得到最終的增強(qiáng)圖像。
ACE的增強(qiáng)效果普遍與retinex好。需要注意的是,ACE中當(dāng)前像素是與整個(gè)圖像的其他像素做差分比較,計(jì)算復(fù)雜度非常非常高,這也是限制它應(yīng)用的最主要原因,本文主要基于兩個(gè)假設(shè):(1)對一副圖像ACE增強(qiáng)后得到輸出Y,如果對Y再進(jìn)行一次ACE增強(qiáng),輸出仍然是Y本身;(2)對一副圖像的ACE增強(qiáng)結(jié)果進(jìn)行尺寸縮放得到Y(jié),對Y進(jìn)行ACE增強(qiáng),輸出仍然是Y本身。這兩個(gè)假設(shè)我沒法證實(shí),呵呵,就算臆想的吧。
如果上面假設(shè)成立,我們就可以對圖像進(jìn)行縮放得到I1,對I1的ACE增強(qiáng)結(jié)果進(jìn)行尺度放大(與I尺寸一樣)得到Y(jié)1,那么Y和Y1是非常接近的,我們只需要在Y1基礎(chǔ)上進(jìn)一步處理即可。這里就又引申了兩個(gè)細(xì)節(jié)問題:1)如何快速的求I1的ACE增強(qiáng)結(jié)果? 其實(shí)很簡單,對它再次縮放得到I2,求I2的增強(qiáng)結(jié)果,依次類推,就是金字塔結(jié)構(gòu)思想。2)如何在Y1基礎(chǔ)上進(jìn)一步處理得到Y(jié)? 因?yàn)槭窃谡麄€(gè)圖像域進(jìn)行差分比較運(yùn)算,與近處鄰域像素的比較構(gòu)成了Y的細(xì)節(jié)信息,與遠(yuǎn)處像素的比較構(gòu)成了Y的全局背景信息,那么我們合理假設(shè),Y和Y1的全局背景信息相同,只更新細(xì)節(jié)信息即可,也就是,我們需要在Y1基礎(chǔ)上加上I中鄰近像素的差分結(jié)果,并減去Y1中鄰近像素的差分結(jié)果就是最終的輸出Y。
上面說的有點(diǎn)繞,慢慢看吧。
下面是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): ? ? ? ? ? ? ? ? ? ? ? ?#根據(jù)半徑計(jì)算權(quán)重參數(shù)矩陣
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): ? ? ? ? ? ? ? ? ? ? #常規(guī)的ACE實(shí)現(xiàn)
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快速增強(qiáng)實(shí)現(xiàn)
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) ? ? ? ? ? ? #遞歸調(diào)用
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三通道分別增強(qiáng),ratio是對比度增強(qiáng)因子,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)
下面是實(shí)驗(yàn)結(jié)果,上邊是原圖,下邊是增強(qiáng)結(jié)果。
————————————————
版權(quán)聲明:本文為CSDN博主「zmshy2128」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zmshy2128/article/details/53470357
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的卷积神经网络算法python实现_自动色彩均衡(ACE)快速算法python实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [算法 笔记]字符串表达式计算(简易版)
- 下一篇: python实现8大排序算法