鄭曉發 劉宇飛
(北京郵電大學數字媒體與設計藝術學院,北京 100876)
LUT,英文全稱為Look Up Table。直譯中文為“顏色查找表”。LUT 的本質為數學轉換模型,通過對顏色的采樣與插值計算,將色彩輸入數值轉換為特定的數值輸出。其作用于圖像的結果就是圖像的顏色產生了變化。3D LUT 通過對RGB值做映射,實現了全立體色彩空間的控制,任意通道輸入值的變化都會對三個顏色造成影響,這使3D LUT 能夠用于精確的顏色校準工作,也可以對色相、飽和度、色彩空間等進行調整與轉換。
3D LUT 在各行各業中有著廣泛的應用。色彩管理中,LUT 轉換將不同色彩空間連接,盡量縮小影像在不同媒介及顯示設備上的視覺差別;數字攝影方面,一些數字攝影機機內不進行白平衡處理,會因感光元件感知不同顏色靈敏度上的差異,發生偏色現象,還有一些數字攝影機使用對數空間來記錄數據,需要借助LUT 的處理,獲得正常色彩關系的監看畫面;影像創作領域,調色師在調色系統上使用LUT 對影像進行處理,滿足導演想要的目標效果;日常生活中的彩色打印機,同樣會用到LUT,將以RGB 記錄的圖像轉換到打印機噴頭使用的CMYK 空間,實現色彩的高準確性和平滑過渡。隨著視頻創作行業的磅礴發展,相機、攝影機制造商的對數空間技術下放,越來越多的人開始學習相關知識,接觸到數字調色等技術,大眾使用與生成LUT 的需求空前旺盛。
目前,3D LUT生成與轉換軟件系統開發方面,有Oleg Sharonov等開發的專業調色軟件3D LUT Creator;攝影師Ben Turley基于JavaScript獨立開發的LutCalc;Greg Cotton 等開發的MacOS色彩科學軟件Lattice。這些軟件都有自己的優勢功能,但是普遍存在功能不夠均衡,調色與LUT編輯只側重一方面,人機交互性差,智能化程度低等問題。
綜上,針對傳統3D LUT 軟件存在的問題,本文通過對3D LUT 應用與生成原理的研究,設計開發出一款具備常用功能而又操作友好的3D LUT 處理系統,將智能化處理方法接入到3D LUT 的生成中,同時與其他軟件協作,解決如何快捷有效地生成3D LUT 的問題,更好地滿足用戶需求。
本文設計的3D LUT 生成與轉換系統編程語言為Python,基于Qt 框架,融合PIL、NumPy、Face Recognition等第三方開源庫,可運行在Windows、Mac OS等操作系統上,系統架構分為三層,包括數據層、應用層、表示層。

圖1 系統架構圖
本系統幾乎不需要涉及到持久化存儲,也沒有聯網或大批量查詢的需要,所以并沒有使用數據庫來完成數據存儲,要處理的圖片和生成的LUT 都在計算機的文件系統上,由操作系統進行管理。
數據層主要涉及到由文件系統管理,存儲在硬盤上的圖像文件或不同格式的LUT,這些數據可能由用戶準備,也可能是由系統的相關模塊生成而來。同時為了提高程序運行效率和反應速度,將最常用的幾個屬性常駐在內存中,如預覽窗口當前正在使用的LUT 和標準色彩圖 (HALD),因為大多數操作都是對該LUT 變量進行運算,或者根據HALD來求解。
應用層是系統的核心,包含基礎算法層與業務邏輯層兩個部分。基礎算法層對底層算法進行實現,保證執行效率,支撐業務邏輯層,而業務邏輯層則對應可被表示層調用的各項功能,并與外部系統進行數據交換。
表示層直接與用戶進行交互,經過前期精心設計,借助可視化GUI設計工具和代碼混合實現,為用戶提供了良好的體驗。信號與槽機制搭建起了應用層與表示層之間的橋梁,單獨修改界面外觀不會影響到任何邏輯功能。
用戶將待處理圖像輸入系統,在調用功能對圖像進行處理時,修改都會先作用在HALD 上,系統根據HALD 的數值變化再生成LUT,這一LUT 也可以是用戶從外部輸入的LUT。經過插值計算后,LUT 作用到輸入圖像,最終效果顯示在用戶界面上。用戶也可以對LUT 做編輯操作,修改LUT 的大小或是將兩個LUT 進行合并,這些操作都會反應到圖像上,如果用戶對效果滿意的話,便可以將該LUT 導出成標準格式的本地文件。

圖2 系統核心流程圖
為了將系統繁雜的功能組織起來,實現解耦,提高系統的安全性和可移植性,采用模塊化開發,合理地劃分為五個模塊,包括LUT 編輯、色彩空間轉換、一級校色、第三方軟件對接、輔助查看。

圖3 系統組成框圖
標準色彩圖(HALD)是3D LUT 的一種圖像表示形式,其中包含3D LUT 中的所有顏色層次。它的每個像素都對應了一個不同的顏色,按照一定的規則進行排列。對于一款3D LUT 生成系統來說,HALD 即為它的核心,在比對標準HALD 與修改后HALD 逐像素變化并記錄后,便可以得到對應的3D LUT。這一特性使其獲得了接入各個模塊與算法的巨大潛力。

圖4 大小為64的標準色彩圖
HALD 生成技術可以生成一張標準的方形HALD 圖片,而對于系統內部而言,標準方形圖片自由度略低,處理起來也會影響效率,所以并沒有直接生成標準圖片 HALD,而是生成了形狀是1×N×3的數組,這個數組在導出為圖片后高僅有一個像素,省去了先生成一個比目標尺寸大的最小平方數HALD 再縮小到目標尺寸的過程。
在生成HALD 時需要指定LUT 的大小,接下來是根據大小確定生成色值大小的間隔,或者說色值增長的步長,根據這個步長,以R、G、B的順序將所有組合遍歷出來就得到了HALD。
LUT 求解是與HALD 生成對應的,根據圖像或數組形式的HALD 求解出LUT,并直接轉為內部的LUT 類(形狀為N×N×N×3),輸入時也要指定大小。考慮到HALD 與LUT 大小是完全相同的,且一一對應,只需按照一定規則改變讀入的HALD 數組形狀,便能得到LUT。
LUT 的增長速度是三次方級的,大小為33的LUT 占用存儲空間是1.2MB 左右,而能覆蓋全部8位色深的大小為256的LUT 占用存儲空間則高達576MB,大小每增長n倍,存儲空間占用和計算量就會增長n倍,8倍存儲占用只能得到2倍的精度提高。受限于存儲空間和算力,LUT 不可能記錄所有的顏色,常用的LUT 大小一般在17到65之間。
LUT 沒有記錄到的顏色就要通過插值來計算,其中,記錄在LUT 上的顏色稱為晶格點 (Lattice)。LUT 預覽的功能由插值算法支撐,根據系統內部流程設計,插值性能如果不夠好,會極大地拖慢整個系統的運行速度,幾乎每一步操作都要卡一下,為用戶使用帶來很大的不便,所以算法的實現過程中會把速度納為一個重要的考慮因素。
系統開發過程中實現了最近鄰、三線性、四面體三種被各大視頻調色處理軟件普遍采納的插值方法,并選擇了兼顧速度和效果的三線性插值作為最后實裝的插值方法,下面展開說明三線性的插值方法7。

圖5 三線性插值示意
我們將RGB 色彩空間中的顏色三元組定義為(r,g,b),R是比r小的最高頂點,R是比r大的最低頂點,B,B,G,G同理,輸入顏色相對于這些頂點的位置用δ,δ,δ表示,計算方式見式(1):

三元組 (r,g,b)周圍的八個頂點定義見式(2):

在三個顏色通道上獨立執行三個線性插值 (三個通道的計算順序沒有要求),完成計算見式(3):

色彩空間轉換包括色域、白點、Gamma的轉換。
色域和白點的轉換都是以CIE XYZ空間為橋梁的,我們可以將不同色彩空間下坐標的轉換用一個舊基底到新基底的過渡矩陣來描述,通過坐標變換公式來得到結果。

過渡矩陣P的展開寫法如式 (5),其中r,r,r為目標色域中紅色基點的xyz坐標值,g和b同理,i,i,i為縮放系數。

i,i,i需要通過給定目標白點的xyz坐標w,w,w來求解。

xyz坐標是經過歸一化了的,z可以通過1-x-y來求出,所以只需提供目標色域的三基色與白點的xy坐標值,就可以解出矩陣P,通過矩陣運算與XYZ空間下的值互相轉換。
實際程序的編寫過程中用到了NumPy的einsum (愛因斯坦求和約定)方法加速矩陣乘法,省去圖像逐像素遍歷的過程,極大縮短了轉換所消耗的時間。
對于轉換過程中出現的超范圍情況,即最小值小于0,最大值大于1,直接對超范圍的數值做裁切,小于0的賦值0,大于1的賦值1。
大多數Gamma曲線都是一個分段函數,前半段為直線,后半段為對數曲線,只在具體參數上有較大差異,這里以Sony S-Log3 的Gamma轉換為例列出偽代碼:

算法實現中使用了NumPy的select函數來減少嵌套循環和判斷帶來的巨大開銷,按照分段函數的邏輯,在一個步驟里對圖像數組中滿足不同條件的像素值做不同的計算。
界面按照不同功能的使用頻率進行分區,圖片預覽窗口占了很大比重,常用的功能做成按鈕放到上方,色彩空間轉換下拉欄和一級校色滑塊放到右側,其他使用頻率較低的功能收納到菜單欄中。這些功能總共涉及到了43個信號與槽。在用Qt Designer創建UI文件時,小到標簽按鈕,大到整個窗口,都置于布局中,這讓用戶界面上的組件看起來非常整齊,也能做到在窗口大小變化時自動適應。
圖片預覽的地方重寫了Qt自帶的QGraphics-View 類,且定義了新的信號以實現拖拽打開圖片功能,依托Qt的事件處理機制,實現了鼠標控制圖片縮放移動、圖片自適應縮放等功能。系統主界面如圖6所示。

圖6 3D LUT 生成與轉換系統主界面
LUT 編輯模塊包括LUT 的輸入輸出、插值算法支撐的LUT 預覽與尺寸修改、LUT 的合并。
LUT 輸入輸出功能支持當今最主流的幾種LUT 格式:Cube、Lustre 3DL、Nuke 3DL、VLUT。LUT 文件的本質是文本文件,LUT 輸入輸出的過程也就是按照一定規則讀寫文本文件的過程,重點在于對格式的把握上。主導這幾種格式的廠商大多提供了嚴謹細致的白皮書,是重要的參考依據,在規格書之外,開發過程中也參考了許多使用場景進行測試,以提高兼容性。根據測試,生成的范圍為0~1 的不同格式LUT可以在相關DCC軟件中正常讀取和使用。

圖7 LUT 導出窗口
LUT 預覽功能借助插值算法將當前LUT 應用到輸入圖像上,并把結果交由GUI顯示。LUT 尺寸修改功能會先計算一個原LUT 與目標LUT 之間的縮放比率,新建一個目標大小的空LUT,調用插值算法計算原來的位置乘上縮放比率后的新對應顏色。如果縮放是呈整數倍比例的話,則無需插值計算,直接間隔取對應的晶格點,修改過程會很快。
LUT 合并功能將兩個大小相同的輸入LUT 合并為一個新LUT。實現過程可以看作是一個多次映射,將LUT 1的映射結果作為LUT 2的輸入,得到合并后的LUT。
色彩空間轉換模塊調用轉換算法完成色域、白點、Gamma的轉換,只需廠商提供的規格書中色域三個基點及白點的xyz坐標和Gamma轉換公式便可以增加可轉換的色彩空間,將其輸入轉換算法得到結果。
一級校色模塊包括了常用的參數如亮度、對比度、曝光、飽和度、自然飽和度、色溫、色調的調整,也包括了智能化的自動色彩均衡和自動白平衡功能以及手動色彩匹配。
自動色彩均衡是通過OpenCV 直方圖來實現的,把R、G、B 三個通道分別獨立縮放到0~255的范圍,如果該圖像的環境光有明顯的色調傾向,比方說R 和G 占主導地位,該算法便會增強B通道,來讓它的黃色調不那么明顯。
自動白平衡功能調用了第三方庫,該庫使用了一種數據驅動方法,在給定白平衡錯誤的圖像后,會在數據集中搜索類似的錯誤圖像,基于這些圖像的混合特征來構建校正變換矩陣,校正后的圖像看起來像在相機拍攝照片時就已經正確應用了白平衡一樣。算法實現中同時也調用了Face Recognition庫,針對人臉單獨做自動白平衡,應對主體和背景光照色溫反差較大的場景。該功能在實際使用中可以配合Da Vinci Resolve的遮罩追蹤完成二級校色。
手動色彩匹配功能使用了薄板樣條插值 (Thin Plate Spline,TPS)算法,扭曲對象為三維空間中的顏色,在給定內容相同、色彩不同的圖片后,通過手動選點,便可反求出較為平滑的3D LUT。當用戶不知道硬盤中圖像的轉換方式,也沒有轉換LUT,但是有轉換后的圖和原圖時,就可以使用該功能快捷方便地得到一個適用性較高的LUT。
該模塊通過調用API與Adobe Premiere Pro和Da Vinci Resolve聯動,從Premiere中讀取單幀預覽畫面,或是將當前編輯的LUT 應用到Resolve時間軸上的視頻片段。前者抓取CTI的時間碼,根據時間碼將序列對應幀導出JPEG 圖片到硬盤上,接下來按照讀取一般圖片的流程讀取。后者調用LUT輸入輸出功能將正在編輯的LUT 導出到Resolve存放LUT 的路徑,將導出的LUT 應用給此刻時間軸上的視頻片段。
為了方便用戶觀察,系統還內置了LUT 可視化、直方圖查看、色卡生成三個功能。

圖8 LUT 可視化
LUT 可視化借助Open3D 將每個晶格點當作點云繪制在了三維空間中,用戶可以自由拖動、旋轉、縮放,直觀的去查看LUT 的特征,從原點出發的坐標軸會示意映射前的顏色。
直方圖使用QT 自帶的繪圖功能進行繪制,可以自由選擇要查看的通道,也可以在原圖與應用LUT 后的圖片之間切換。

圖9 直方圖顯示
色卡生成功能會通過顏色量化算法對當前的圖片進行分析,統計出各個顏色的占比,按占比降序列出主要顏色,并顯示該色的RGB值、十六進制值和占比具體數字,為用戶對畫面配色的分析提供了很大的便利。

圖10 色卡生成
本文以3D LUT 在各行各業得到廣泛應用,大眾用戶使用與轉換LUT 的需求為背景,基于Python和Qt,開發出了一款界面美觀、功能豐富、有創新性的3D LUT 生成與轉換系統。系統實現了一個3D LUT 軟件應有的主要功能:LUT 預覽、LUT 讀寫、色彩空間轉換、一級校色,在各項指標上與專業軟件非常接近;而在基本功能之上,系統又探索了傳統軟件缺少的功能,自動白平衡、自動色彩均衡、色盤提取使LUT 的生成過程更具智能;與第三方軟件對接的部分打破了軟件之間的界限,進一步簡化了用戶的操作;系統兼顧功能和美觀易用,可跨平臺運行,性能上也充分為工程應用考慮,具有使用價值。?