大致思路是首先利用node.sample()自带采样功能对整个画面逐像素采样,把采样函数写的比较灵活,可以定义一个采样族,即把整个画面分成若干块,逐块采样,很大程度上减少了采样工作量,但相对精度会有所降低。考虑到单幅 画面包含RGBA四个分量,所以对一个画面我会分别采样四次。对参考图片采样完毕之后还需要对目标图片进行采样,所以总计需要采样八次,这是一个不小的计算量。
采样完毕后会产生大量数据,我找了很多工具包来尝试管理这些数据,最终选择numpy,这个工具包简单易用,array数组或matrix矩阵的数据储存方式跟采样画面能够建立一个非常直观的对应关系。
numpy更是一个非常强大的数据分析工具,可以很高效的获得所需信息。通过numpy,可以计算得到当前采样画面的最大值最小值,数值分布直方图等。
获得两张图片的相关信息后就需要考虑提出一个可行的算法来进行匹配了。
第一个思路是直方图匹配,这是老生常谈,我的算法稍有不同,我只匹配两幅直方图中的波峰,只要两张图片的RGB三通道的波峰能匹配一致,就大功告成,但实际匹配过程中直方图的拟合又出现了很多问题,最终我只能采取近似的方式去进行,最终结果并没有理想的那么精确,而却遇到画面亮暗部过渡均匀的情况更难捕 捉波峰,精度下滑很严重。要提出一个新的算法又要考虑时间成本,最终我采用了折衷的方案,即出一个工具包,内部有两个节点,一个用于自动匹色,一个在采样 基础上提供手动匹色功能。至于直方图匹配过程需要调整的数值如何映射到nuke中的gain值gamma值blackpoint值whitepoint值 上,这其实都是有公式的,网上查一查就可以了。