大致思路是首先利用node.sample()自帶采樣功能對整個畫面逐像素采 樣,我把采樣函數寫的比較靈活,可以定義一個采樣族,即把整個畫面分成若干塊,逐塊采樣,很大程度上減少了采樣工作量,但相對精度會有所降低。考慮到單幅 畫面包含RGBA四個分量,所以對一個畫面我會分別采樣四次。對參考圖片采樣完畢之后還需要對目標圖片進行采樣,所以總計需要采樣八次,這是一個不小的計 算量。
采樣完畢后會產生大量數據,我找了很多工具包來嘗試管理這些數據,最終選擇numpy,這個工具包簡單易用,array數組或matrix矩陣的數據儲存方式跟采樣畫面能夠建立一個非常直觀的對應關系。
numpy更是一個非常強大的數據分析工具,可以很高效的獲得所需信息。通過numpy,可以計算得到當前采樣畫面的最大值最小值,數值分布直方圖等。
獲得兩張圖片的相關信息后就需要考慮提出一個可行的算法來進行匹配了。
我 的第一個思路是直方圖匹配,這是老生常談,我的算法稍有不同,我只匹配兩幅直方圖中的波峰,只要兩張圖片的RGB三通道的波峰能匹配一致,就大功告成,但 實際匹配過程中直方圖的擬合又出現了很多問題,最終我只能采取近似的方式去進行,最終結果並沒有理想的那么精確,而卻遇到畫面亮暗部過渡均勻的情況更難捕 捉波峰,精度下滑很嚴重。要提出一個新的算法又要考慮時間成本,最終我采用了折衷的方案,即出一個工具包,內部有兩個節點,一個用於自動匹色,一個在采樣 基礎上提供手動匹色功能。至於直方圖匹配過程需要調整的數值如何映射到nuke中的gain值gamma值blackpoint值whitepoint值 上,這其實都是有公式的,網上查一查就可以了。
