C语言自动色彩均衡算法,自動色彩均衡算法(ACE)原理及實現

介绍自动色彩均衡(ACE)算法原理及应用,该算法基于Retinex理论,通过局部特性的自适应滤波调整图像亮度与色彩,实现高动态范围图像处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前注:ACE在圖像處理方面可以有兩種表示,一種是本篇要說的:Automatic Color Equalization,即自動彩色均衡;還有一種是:Adaptive Contrast Enhancement,即自適應對比度增強 。不要搞混了~_~

高動態范圍圖像處理:

高動態范圍圖像是指在一幅圖像中,既有明亮的區域又有陰影區域,為了使細節清晰,需要滿足以下幾點:

(1)對動態范圍具有一定的壓縮能力;

(2)對亮暗區域的細節有一定的顯示能力;

(3)滿足上面條件基礎上不破壞圖像的清晰度。

對於高動態范圍處理,基於人眼視覺系統(HSV)在顏色連續和亮度連續方面得到較好的滿足。

自動色彩均衡算法原理:

Rizzi等依據Retinex理論提出了自動顏色均衡算法,該算法考慮了圖像中顏色和亮度的空間位置關系,進行局部特性的自適應濾波,實現具有局部和非線性特征的圖像亮度與色彩調整和對比度調整,同時滿足灰色世界理論假設和白色斑點假設。

ACE算法包括兩個步驟:

3b243021f4f33a6e22f8b03a4ef3727e.png

第一步:對圖像進行色彩/空域調整,完成圖像的色差校正,得到空域重構圖像;

7045302ab9e24e6d6aa53c01c3ea7c8a.png(1)

式中,Rc 是中間結果,Ic(p)-Ic(j)為兩個不同點的亮度差,d(p,j)表示距離度量函數,r(*)為亮度表現函數,需是奇函數;這一步可以適應局部圖像對比度,r(*)能夠放大較小的差異,並豐富大的差異,根據局部內容擴展或者壓縮動態范圍。一般得,r(*)為:

1cbd76c100902d2ce5c17001a7118a4b.png

第二步:對校正后的圖像進行動態擴展。ACE算法是對單一色道進行的,對於彩色圖片需要對每一個色道分別處理。

其中,一種簡單的線性擴展可以表示為:

1ef168253789733b54303c23526e6e73.png

還可以將其映射到[0,255]的空間中:

6635cfc71ae6cb62a90e4c3083842ff4.png(5)

通過上面的操作,ACE可看成是人類視覺系統的簡化模型,其增強過程是與人的感知是一致的。

自動彩色均衡算法改進:

式(1)算法復雜度較高,對於一副像素數為N的圖像,需要執行O(N2)級次非線性映射計算,圖像尺寸越大,耗時越多,所以針對式(1)產生了許多加速改進算法。例如:LLLUT加速策略【4】,參考【3】將ACE轉換為對規范直方圖均衡化的一種平滑和局部修正的方法,並給出了求解最優模型:

214d919b05fbb25825e3d64c9924f3d5.png

其中,

1362c210cb595adc273fd5e1cf1df8d6.png

對於改進方法,可以考慮的因素:

1)其他的坡度函數Sa(t),多項式函數逼近;

018dddb1d3b69ef1088415607207a647.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值