鄭曉發(fā) 劉宇飛
(北京郵電大學數(shù)字媒體與設(shè)計藝術(shù)學院,北京 100876)
LUT,英文全稱為Look Up Table。直譯中文為“顏色查找表”。LUT 的本質(zhì)為數(shù)學轉(zhuǎn)換模型,通過對顏色的采樣與插值計算,將色彩輸入數(shù)值轉(zhuǎn)換為特定的數(shù)值輸出。其作用于圖像的結(jié)果就是圖像的顏色產(chǎn)生了變化。3D LUT 通過對RGB值做映射,實現(xiàn)了全立體色彩空間的控制,任意通道輸入值的變化都會對三個顏色造成影響,這使3D LUT 能夠用于精確的顏色校準工作,也可以對色相、飽和度、色彩空間等進行調(diào)整與轉(zhuǎn)換。
3D LUT 在各行各業(yè)中有著廣泛的應(yīng)用。色彩管理中,LUT 轉(zhuǎn)換將不同色彩空間連接,盡量縮小影像在不同媒介及顯示設(shè)備上的視覺差別;數(shù)字攝影方面,一些數(shù)字攝影機機內(nèi)不進行白平衡處理,會因感光元件感知不同顏色靈敏度上的差異,發(fā)生偏色現(xiàn)象,還有一些數(shù)字攝影機使用對數(shù)空間來記錄數(shù)據(jù),需要借助LUT 的處理,獲得正常色彩關(guān)系的監(jiān)看畫面;影像創(chuàng)作領(lǐng)域,調(diào)色師在調(diào)色系統(tǒng)上使用LUT 對影像進行處理,滿足導演想要的目標效果;日常生活中的彩色打印機,同樣會用到LUT,將以RGB 記錄的圖像轉(zhuǎn)換到打印機噴頭使用的CMYK 空間,實現(xiàn)色彩的高準確性和平滑過渡。隨著視頻創(chuàng)作行業(yè)的磅礴發(fā)展,相機、攝影機制造商的對數(shù)空間技術(shù)下放,越來越多的人開始學習相關(guān)知識,接觸到數(shù)字調(diào)色等技術(shù),大眾使用與生成LUT 的需求空前旺盛。
目前,3D LUT生成與轉(zhuǎn)換軟件系統(tǒng)開發(fā)方面,有Oleg Sharonov等開發(fā)的專業(yè)調(diào)色軟件3D LUT Creator;攝影師Ben Turley基于JavaScript獨立開發(fā)的LutCalc;Greg Cotton 等開發(fā)的MacOS色彩科學軟件Lattice。這些軟件都有自己的優(yōu)勢功能,但是普遍存在功能不夠均衡,調(diào)色與LUT編輯只側(cè)重一方面,人機交互性差,智能化程度低等問題。
綜上,針對傳統(tǒng)3D LUT 軟件存在的問題,本文通過對3D LUT 應(yīng)用與生成原理的研究,設(shè)計開發(fā)出一款具備常用功能而又操作友好的3D LUT 處理系統(tǒng),將智能化處理方法接入到3D LUT 的生成中,同時與其他軟件協(xié)作,解決如何快捷有效地生成3D LUT 的問題,更好地滿足用戶需求。
本文設(shè)計的3D LUT 生成與轉(zhuǎn)換系統(tǒng)編程語言為Python,基于Qt 框架,融合PIL、NumPy、Face Recognition等第三方開源庫,可運行在Windows、Mac OS等操作系統(tǒng)上,系統(tǒng)架構(gòu)分為三層,包括數(shù)據(jù)層、應(yīng)用層、表示層。
圖1 系統(tǒng)架構(gòu)圖
本系統(tǒng)幾乎不需要涉及到持久化存儲,也沒有聯(lián)網(wǎng)或大批量查詢的需要,所以并沒有使用數(shù)據(jù)庫來完成數(shù)據(jù)存儲,要處理的圖片和生成的LUT 都在計算機的文件系統(tǒng)上,由操作系統(tǒng)進行管理。
數(shù)據(jù)層主要涉及到由文件系統(tǒng)管理,存儲在硬盤上的圖像文件或不同格式的LUT,這些數(shù)據(jù)可能由用戶準備,也可能是由系統(tǒng)的相關(guān)模塊生成而來。同時為了提高程序運行效率和反應(yīng)速度,將最常用的幾個屬性常駐在內(nèi)存中,如預(yù)覽窗口當前正在使用的LUT 和標準色彩圖 (HALD),因為大多數(shù)操作都是對該LUT 變量進行運算,或者根據(jù)HALD來求解。
應(yīng)用層是系統(tǒng)的核心,包含基礎(chǔ)算法層與業(yè)務(wù)邏輯層兩個部分。基礎(chǔ)算法層對底層算法進行實現(xiàn),保證執(zhí)行效率,支撐業(yè)務(wù)邏輯層,而業(yè)務(wù)邏輯層則對應(yīng)可被表示層調(diào)用的各項功能,并與外部系統(tǒng)進行數(shù)據(jù)交換。
表示層直接與用戶進行交互,經(jīng)過前期精心設(shè)計,借助可視化GUI設(shè)計工具和代碼混合實現(xiàn),為用戶提供了良好的體驗。信號與槽機制搭建起了應(yīng)用層與表示層之間的橋梁,單獨修改界面外觀不會影響到任何邏輯功能。
用戶將待處理圖像輸入系統(tǒng),在調(diào)用功能對圖像進行處理時,修改都會先作用在HALD 上,系統(tǒng)根據(jù)HALD 的數(shù)值變化再生成LUT,這一LUT 也可以是用戶從外部輸入的LUT。經(jīng)過插值計算后,LUT 作用到輸入圖像,最終效果顯示在用戶界面上。用戶也可以對LUT 做編輯操作,修改LUT 的大小或是將兩個LUT 進行合并,這些操作都會反應(yīng)到圖像上,如果用戶對效果滿意的話,便可以將該LUT 導出成標準格式的本地文件。
圖2 系統(tǒng)核心流程圖
為了將系統(tǒng)繁雜的功能組織起來,實現(xiàn)解耦,提高系統(tǒng)的安全性和可移植性,采用模塊化開發(fā),合理地劃分為五個模塊,包括LUT 編輯、色彩空間轉(zhuǎn)換、一級校色、第三方軟件對接、輔助查看。
圖3 系統(tǒng)組成框圖
標準色彩圖(HALD)是3D LUT 的一種圖像表示形式,其中包含3D LUT 中的所有顏色層次。它的每個像素都對應(yīng)了一個不同的顏色,按照一定的規(guī)則進行排列。對于一款3D LUT 生成系統(tǒng)來說,HALD 即為它的核心,在比對標準HALD 與修改后HALD 逐像素變化并記錄后,便可以得到對應(yīng)的3D LUT。這一特性使其獲得了接入各個模塊與算法的巨大潛力。
圖4 大小為64的標準色彩圖
HALD 生成技術(shù)可以生成一張標準的方形HALD 圖片,而對于系統(tǒng)內(nèi)部而言,標準方形圖片自由度略低,處理起來也會影響效率,所以并沒有直接生成標準圖片 HALD,而是生成了形狀是1×N×3的數(shù)組,這個數(shù)組在導出為圖片后高僅有一個像素,省去了先生成一個比目標尺寸大的最小平方數(shù)HALD 再縮小到目標尺寸的過程。
在生成HALD 時需要指定LUT 的大小,接下來是根據(jù)大小確定生成色值大小的間隔,或者說色值增長的步長,根據(jù)這個步長,以R、G、B的順序?qū)⑺薪M合遍歷出來就得到了HALD。
LUT 求解是與HALD 生成對應(yīng)的,根據(jù)圖像或數(shù)組形式的HALD 求解出LUT,并直接轉(zhuǎn)為內(nèi)部的LUT 類(形狀為N×N×N×3),輸入時也要指定大小??紤]到HALD 與LUT 大小是完全相同的,且一一對應(yīng),只需按照一定規(guī)則改變讀入的HALD 數(shù)組形狀,便能得到LUT。
LUT 的增長速度是三次方級的,大小為33的LUT 占用存儲空間是1.2MB 左右,而能覆蓋全部8位色深的大小為256的LUT 占用存儲空間則高達576MB,大小每增長n倍,存儲空間占用和計算量就會增長n倍,8倍存儲占用只能得到2倍的精度提高。受限于存儲空間和算力,LUT 不可能記錄所有的顏色,常用的LUT 大小一般在17到65之間。
LUT 沒有記錄到的顏色就要通過插值來計算,其中,記錄在LUT 上的顏色稱為晶格點 (Lattice)。LUT 預(yù)覽的功能由插值算法支撐,根據(jù)系統(tǒng)內(nèi)部流程設(shè)計,插值性能如果不夠好,會極大地拖慢整個系統(tǒng)的運行速度,幾乎每一步操作都要卡一下,為用戶使用帶來很大的不便,所以算法的實現(xiàn)過程中會把速度納為一個重要的考慮因素。
系統(tǒng)開發(fā)過程中實現(xiàn)了最近鄰、三線性、四面體三種被各大視頻調(diào)色處理軟件普遍采納的插值方法,并選擇了兼顧速度和效果的三線性插值作為最后實裝的插值方法,下面展開說明三線性的插值方法7。
圖5 三線性插值示意
我們將RGB 色彩空間中的顏色三元組定義為(r,g,b),R是比r小的最高頂點,R是比r大的最低頂點,B,B,G,G同理,輸入顏色相對于這些頂點的位置用δ,δ,δ表示,計算方式見式(1):
三元組 (r,g,b)周圍的八個頂點定義見式(2):
在三個顏色通道上獨立執(zhí)行三個線性插值 (三個通道的計算順序沒有要求),完成計算見式(3):
色彩空間轉(zhuǎn)換包括色域、白點、Gamma的轉(zhuǎn)換。
色域和白點的轉(zhuǎn)換都是以CIE XYZ空間為橋梁的,我們可以將不同色彩空間下坐標的轉(zhuǎn)換用一個舊基底到新基底的過渡矩陣來描述,通過坐標變換公式來得到結(jié)果。
過渡矩陣P的展開寫法如式 (5),其中r,r,r為目標色域中紅色基點的xyz坐標值,g和b同理,i,i,i為縮放系數(shù)。
i,i,i需要通過給定目標白點的xyz坐標w,w,w來求解。
xyz坐標是經(jīng)過歸一化了的,z可以通過1-x-y來求出,所以只需提供目標色域的三基色與白點的xy坐標值,就可以解出矩陣P,通過矩陣運算與XYZ空間下的值互相轉(zhuǎn)換。
實際程序的編寫過程中用到了NumPy的einsum (愛因斯坦求和約定)方法加速矩陣乘法,省去圖像逐像素遍歷的過程,極大縮短了轉(zhuǎn)換所消耗的時間。
對于轉(zhuǎn)換過程中出現(xiàn)的超范圍情況,即最小值小于0,最大值大于1,直接對超范圍的數(shù)值做裁切,小于0的賦值0,大于1的賦值1。
大多數(shù)Gamma曲線都是一個分段函數(shù),前半段為直線,后半段為對數(shù)曲線,只在具體參數(shù)上有較大差異,這里以Sony S-Log3 的Gamma轉(zhuǎn)換為例列出偽代碼:
算法實現(xiàn)中使用了NumPy的select函數(shù)來減少嵌套循環(huán)和判斷帶來的巨大開銷,按照分段函數(shù)的邏輯,在一個步驟里對圖像數(shù)組中滿足不同條件的像素值做不同的計算。
界面按照不同功能的使用頻率進行分區(qū),圖片預(yù)覽窗口占了很大比重,常用的功能做成按鈕放到上方,色彩空間轉(zhuǎn)換下拉欄和一級校色滑塊放到右側(cè),其他使用頻率較低的功能收納到菜單欄中。這些功能總共涉及到了43個信號與槽。在用Qt Designer創(chuàng)建UI文件時,小到標簽按鈕,大到整個窗口,都置于布局中,這讓用戶界面上的組件看起來非常整齊,也能做到在窗口大小變化時自動適應(yīng)。
圖片預(yù)覽的地方重寫了Qt自帶的QGraphics-View 類,且定義了新的信號以實現(xiàn)拖拽打開圖片功能,依托Qt的事件處理機制,實現(xiàn)了鼠標控制圖片縮放移動、圖片自適應(yīng)縮放等功能。系統(tǒng)主界面如圖6所示。
圖6 3D LUT 生成與轉(zhuǎn)換系統(tǒng)主界面
LUT 編輯模塊包括LUT 的輸入輸出、插值算法支撐的LUT 預(yù)覽與尺寸修改、LUT 的合并。
LUT 輸入輸出功能支持當今最主流的幾種LUT 格式:Cube、Lustre 3DL、Nuke 3DL、VLUT。LUT 文件的本質(zhì)是文本文件,LUT 輸入輸出的過程也就是按照一定規(guī)則讀寫文本文件的過程,重點在于對格式的把握上。主導這幾種格式的廠商大多提供了嚴謹細致的白皮書,是重要的參考依據(jù),在規(guī)格書之外,開發(fā)過程中也參考了許多使用場景進行測試,以提高兼容性。根據(jù)測試,生成的范圍為0~1 的不同格式LUT可以在相關(guān)DCC軟件中正常讀取和使用。
圖7 LUT 導出窗口
LUT 預(yù)覽功能借助插值算法將當前LUT 應(yīng)用到輸入圖像上,并把結(jié)果交由GUI顯示。LUT 尺寸修改功能會先計算一個原LUT 與目標LUT 之間的縮放比率,新建一個目標大小的空LUT,調(diào)用插值算法計算原來的位置乘上縮放比率后的新對應(yīng)顏色。如果縮放是呈整數(shù)倍比例的話,則無需插值計算,直接間隔取對應(yīng)的晶格點,修改過程會很快。
LUT 合并功能將兩個大小相同的輸入LUT 合并為一個新LUT。實現(xiàn)過程可以看作是一個多次映射,將LUT 1的映射結(jié)果作為LUT 2的輸入,得到合并后的LUT。
色彩空間轉(zhuǎn)換模塊調(diào)用轉(zhuǎn)換算法完成色域、白點、Gamma的轉(zhuǎn)換,只需廠商提供的規(guī)格書中色域三個基點及白點的xyz坐標和Gamma轉(zhuǎn)換公式便可以增加可轉(zhuǎn)換的色彩空間,將其輸入轉(zhuǎn)換算法得到結(jié)果。
一級校色模塊包括了常用的參數(shù)如亮度、對比度、曝光、飽和度、自然飽和度、色溫、色調(diào)的調(diào)整,也包括了智能化的自動色彩均衡和自動白平衡功能以及手動色彩匹配。
自動色彩均衡是通過OpenCV 直方圖來實現(xiàn)的,把R、G、B 三個通道分別獨立縮放到0~255的范圍,如果該圖像的環(huán)境光有明顯的色調(diào)傾向,比方說R 和G 占主導地位,該算法便會增強B通道,來讓它的黃色調(diào)不那么明顯。
自動白平衡功能調(diào)用了第三方庫,該庫使用了一種數(shù)據(jù)驅(qū)動方法,在給定白平衡錯誤的圖像后,會在數(shù)據(jù)集中搜索類似的錯誤圖像,基于這些圖像的混合特征來構(gòu)建校正變換矩陣,校正后的圖像看起來像在相機拍攝照片時就已經(jīng)正確應(yīng)用了白平衡一樣。算法實現(xiàn)中同時也調(diào)用了Face Recognition庫,針對人臉單獨做自動白平衡,應(yīng)對主體和背景光照色溫反差較大的場景。該功能在實際使用中可以配合Da Vinci Resolve的遮罩追蹤完成二級校色。
手動色彩匹配功能使用了薄板樣條插值 (Thin Plate Spline,TPS)算法,扭曲對象為三維空間中的顏色,在給定內(nèi)容相同、色彩不同的圖片后,通過手動選點,便可反求出較為平滑的3D LUT。當用戶不知道硬盤中圖像的轉(zhuǎn)換方式,也沒有轉(zhuǎn)換LUT,但是有轉(zhuǎn)換后的圖和原圖時,就可以使用該功能快捷方便地得到一個適用性較高的LUT。
該模塊通過調(diào)用API與Adobe Premiere Pro和Da Vinci Resolve聯(lián)動,從Premiere中讀取單幀預(yù)覽畫面,或是將當前編輯的LUT 應(yīng)用到Resolve時間軸上的視頻片段。前者抓取CTI的時間碼,根據(jù)時間碼將序列對應(yīng)幀導出JPEG 圖片到硬盤上,接下來按照讀取一般圖片的流程讀取。后者調(diào)用LUT輸入輸出功能將正在編輯的LUT 導出到Resolve存放LUT 的路徑,將導出的LUT 應(yīng)用給此刻時間軸上的視頻片段。
為了方便用戶觀察,系統(tǒng)還內(nèi)置了LUT 可視化、直方圖查看、色卡生成三個功能。
圖8 LUT 可視化
LUT 可視化借助Open3D 將每個晶格點當作點云繪制在了三維空間中,用戶可以自由拖動、旋轉(zhuǎn)、縮放,直觀的去查看LUT 的特征,從原點出發(fā)的坐標軸會示意映射前的顏色。
直方圖使用QT 自帶的繪圖功能進行繪制,可以自由選擇要查看的通道,也可以在原圖與應(yīng)用LUT 后的圖片之間切換。
圖9 直方圖顯示
色卡生成功能會通過顏色量化算法對當前的圖片進行分析,統(tǒng)計出各個顏色的占比,按占比降序列出主要顏色,并顯示該色的RGB值、十六進制值和占比具體數(shù)字,為用戶對畫面配色的分析提供了很大的便利。
圖10 色卡生成
本文以3D LUT 在各行各業(yè)得到廣泛應(yīng)用,大眾用戶使用與轉(zhuǎn)換LUT 的需求為背景,基于Python和Qt,開發(fā)出了一款界面美觀、功能豐富、有創(chuàng)新性的3D LUT 生成與轉(zhuǎn)換系統(tǒng)。系統(tǒng)實現(xiàn)了一個3D LUT 軟件應(yīng)有的主要功能:LUT 預(yù)覽、LUT 讀寫、色彩空間轉(zhuǎn)換、一級校色,在各項指標上與專業(yè)軟件非常接近;而在基本功能之上,系統(tǒng)又探索了傳統(tǒng)軟件缺少的功能,自動白平衡、自動色彩均衡、色盤提取使LUT 的生成過程更具智能;與第三方軟件對接的部分打破了軟件之間的界限,進一步簡化了用戶的操作;系統(tǒng)兼顧功能和美觀易用,可跨平臺運行,性能上也充分為工程應(yīng)用考慮,具有使用價值。?