前注:ACE在圖像處理方面可以有兩種表示,一種是本篇要說的:Automatic Color Equalization,即自動彩色均衡;還有一種是:Adaptive Contrast Enhancement,即自適應對比度增強 。不要搞混了~_~
高動態范圍圖像處理:
高動態范圍圖像是指在一幅圖像中,既有明亮的區域又有陰影區域,為了使細節清晰,需要滿足以下幾點:
(1)對動態范圍具有一定的壓縮能力;
(2)對亮暗區域的細節有一定的顯示能力;
(3)滿足上面條件基礎上不破壞圖像的清晰度。
對於高動態范圍處理,基於人眼視覺系統(HSV)在顏色連續和亮度連續方面得到較好的滿足。
自動色彩均衡算法原理:
Rizzi等依據Retinex理論提出了自動顏色均衡算法,該算法考慮了圖像中顏色和亮度的空間位置關系,進行局部特性的自適應濾波,實現具有局部和非線性特征的圖像亮度與色彩調整和對比度調整,同時滿足灰色世界理論假設和白色斑點假設。
ACE算法包括兩個步驟:
第一步:對圖像進行色彩/空域調整,完成圖像的色差校正,得到空域重構圖像;
(1)
式中,Rc 是中間結果,Ic(p)-Ic(j)為兩個不同點的亮度差,d(p,j)表示距離度量函數,r(*)為亮度表現函數,需是奇函數;這一步可以適應局部圖像對比度,r(*)能夠放大較小的差異,並豐富大的差異,根據局部內容擴展或者壓縮動態范圍。一般得,r(*)為:
第二步:對校正后的圖像進行動態擴展。ACE算法是對單一色道進行的,對於彩色圖片需要對每一個色道分別處理。
其中,一種簡單的線性擴展可以表示為:
還可以將其映射到[0,255]的空間中:
(5)
通過上面的操作,ACE可看成是人類視覺系統的簡化模型,其增強過程是與人的感知是一致的。
自動彩色均衡算法改進:
式(1)算法復雜度較高,對於一副像素數為N的圖像,需要執行O(N2)級次非線性映射計算,圖像尺寸越大,耗時越多,所以針對式(1)產生了許多加速改進算法。例如:LLLUT加速策略【4】,參考【3】將ACE轉換為對規范直方圖均衡化的一種平滑和局部修正的方法,並給出了求解最優模型:
其中,
對於改進方法,可以考慮的因素:
1)其他的坡度函數Sa(t),多項式函數逼近;
2)除了1/||x-y||外的權重函數的選擇;
3)在求和的過程中,y可以限制在一個小窗口中;
4)L(x)的一些其他的方法;
程序下載地址:http://www.ipol.im/pub/art/2012/g-ace/
另外,可以參照參考[8]的python程序,這里po一下:
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('3.jpg')/255.0)*255
cv2.imwrite('zmIce.jpg', m)
參考:
http://www.ipol.im/pub/art/2012/g-ace/
《ACE: An automatic color equalization algorithm》
《Automatic Color Enhancement (ACE) and its FastImplementation》[J].IPOL
《A local linear lut method for increasing the speed of generic image fiLLLUTering algorithm》[R].Technical Report
《Perceptual Color Correction Through Varia-tional Techniques》[J].IEEE
《自動色彩均衡算法的快速優化》[J].武漢大學學報
http://blog.youkuaiyun.com/u013626386/article/details/47808761
http://blog.youkuaiyun.com/zmshy2128/article/details/53470357 --python