好久不见,这次给小伙伴们更新几波我本科期间参与的科研项目。按照论文的发表顺序,这篇博客就简单介绍一下我的第一个项目,关于图像着色算法的优化。
着色(彩色化)是使用计算机算法给灰度图像添加颜色的过程。目前有几种主流的方法可以为图像着色,包括精确的图像分割算法、深度学习算法和基于手动着色的局部颜色扩展方法。然而,这些方法的一个常见问题是出现“渗色”,即图像中某个区域的颜色溢出到相邻区域。在本文中,我们提出了一种新的基于手动着色的局部颜色扩展算法,该算法综合考虑了窗口中心像素与相邻像素之间的强度差(亮度差)和距离差。结合侧窗滤波,我们的算法显著减少了彩色图像边缘渗色现象的发生。实验证明了该算法的有效性。
1、一种比较古早的方法是基于参考图像(reference image)的颜色转移。选择参考图像,然后与目标灰度图像进行比较,根据参考图像中的颜色信息调整目标图像的颜色。
2、大量的研究集中于基于手动着色的局部颜色扩展算法。这些方法通常使用偏微分方程将着色问题转化为优化问题,依靠用户以“涂鸦”的形式输入来指导着色过程。
3、基于深度学习的方法,以端到端技术学习着色,可以在一定程度上简化图像编辑过程,提高效率。然而,训练深度学习模型需要大量的标记训练数据和计算资源,并且由于依赖高质量的数据输入,模型的输出可能会出现不真实、不一致或渗色的情况。此外,在深度学习模型中纠正错误或提高着色质量比较难。
4、侧窗滤波。这种类型的过滤器通过在图像上应用一个窗口来分析周围的像素,然后使用特定的算法来修改中心像素的值。侧窗滤波的一个优点是可以保留边缘,这可以有效地减少基于手工着色的局部颜色扩展算法中图像渗色的发生,从而得到更清晰、更自然的彩色图像,解决了传统滤波算法会造成图像边缘模糊而丢失边缘信息的问题。
本文提出的算法核心原理是:亮度相似的像素也具有相似的色度。给定的图像根据这一原理扩展周围像素的颜色。与其他着色算法相比,该方法可以减少图像边缘的渗色。当与侧窗滤波相结合时,算法可以生成接近无渗色的图像。
首先,我们的算法基于YUV色彩空间。Y表示亮度通道,而U和V是色度通道。该算法的原理为:在一定范围内具有相似亮度的像素应该具有相似的色度值。例如,在对U通道窗口的中心节点进行着色时,计算Y通道的中心节点与其相邻节点之间的像素值差异,并考虑中心节点与其相邻节点之间的距离差异。然后将这两种差异结合起来,为相邻节点分配相应的权值,最终将中心节点的色度值U表示为相邻节点色度值U的加权和:
U ( c ) = ∑ n ∈ N ( c ) W c n U ( n ) \begin{equation} U(c)=\sum_{n \in N(c)} W_{c n} U(n) \end{equation} U(c)=n∈N(c)∑WcnU(n)
W c n = 1 0 − ( Y ( c ) − Y ( n ) ) 2 σ c 2 ∗ ( ( x c − x n ) 2 + ( y c − y n ) 2 ) α \begin{equation} W_{c n}=10^{-\frac{(Y(c)-Y(n))^2}{\sigma_c^2}} *\left(\left(x_c-x_n\right)^2+\left(y_c-y_n\right)^2\right)^\alpha \end{equation} Wcn=10−σc2(Y(c)−Y(n))2∗((xc−xn)2+(yc−yn)2)α
公式(2)是Wcn的具体表达式,表示亲和函数。Wcn表示中心像素点c和相邻像素点n之间的权重,用于控制相邻像素对中心像素的影响。y( c )和y( n )表示中心像素点c和相邻像素点n的亮度值。σc是一个常数,用于调节亮度的方差,影响亮度差对色度值扩散的程度。xc, yc和xn, yn是中心像素点c和相邻像素点n的坐标。α是一个参数,可以控制相邻像素对中心像素的影响程度,从而影响最终的图像着色结果。
先前也有学者提出优化的图像着色算法,具体公式如下:
J ( U ) = ∑ r ( U ( r ) − ∑ s ∈ N ( r ) w r s U ( s ) ) 2 \begin{equation} J(U)=\sum_{\boldsymbol{r}}\left(U(\boldsymbol{r})-\sum_{\boldsymbol{s} \in N(\boldsymbol{r})} w_{\boldsymbol{r} \boldsymbol{s}} U(\boldsymbol{s})\right)^2 \end{equation} J(U)=r∑ U(r)−s∈N(r)∑wrsU(s) 2
w r s = e − ( Y ( r ) − Y ( s ) ) 2 2 σ r 2 \begin{equation} w_{r s}=e^{-\frac{(Y(\boldsymbol{r})-Y(s))^2}{2 \sigma_r^2}} \end{equation} wrs=e−2σr2(Y(r)−Y(s))2
公式(2)和公式(4)之间存在显著差异。公式(4)只考虑了相邻节点和中心节点之间的亮度差对色度扩散的影响,而没有考虑这些节点之间的距离。反观公式(2),同时考虑了亮度差和距离差,可以通过α的值来调节两者之间的平衡。受到双边滤波的启发,我们加入距离权重,有助于限制颜色扩散的范围,防止图像渗色。双边滤波在滤波图像时既考虑像素之间的距离,也考虑像素之间的亮度差。
1、α=-1的条件下图像着色效果(对比另一个类似的优化方法)。由效果图可以看出,我们的方法相对另一个方法减少了渗色的出现,但在边缘位置仍然可能出现渗色。
2、引入侧窗滤波后,α=-3的条件下图像着色的效果。可以明显地看出,加入侧窗滤波后图像着色的效果更佳,渗色现象用肉眼很难观察到,这验证了侧窗滤波的有效性。
为了检验距离差的作用,我们对算法进行了修改,将其去除并和未去除的方法进行对比,结果如下图所示。对比两幅图像,可以看出在不考虑距离差的情况下,图像出现了一点渗色现象。右图是考虑了距离差的效果,几乎实现了无渗色效果。
同时,我们对α的取值进行了深入研究,因为它控制像素的距离差。为了研究α值对显色的影响,我们进行了多次实验,得到了不同的结果,如下图所示。在侧窗滤波框架内,随着α值的减小,渗色现象越来越少。这是因为侧窗滤波具有保留边缘的能力,减小α值增加了中心节点的最近邻节点的权值,同时减小了中心节点的远近邻节点的权值,限制了颜色向图像边缘的扩散。我们发现当α=-3时效果最佳。
给图像上色的方法有很多,但目前的传统方法很多都存在图像渗色的问题。在侧窗滤波的框架下,基于手动着色的局部颜色扩展算法有效地改善了图像中的边缘渗色问题。在本文中,我们提出了一种减少渗色的图像着色算法。在侧窗滤波的框架下,我们的方法对图像的强边缘和弱边缘都有很好的适应性,可以最大限度地减少图像的渗色。实验表明,该算法在各种类型的图像上都能取得较好的着色效果。在未来的工作中,我们打算将我们的算法应用于视频着色。我们将尝试结合时间维度来探讨它是否也能改善视频着色。
这个项目比较简单,没有用到深度学习方法,只是基于传统的图像处理方法进行改进。图像着色在现实中有很多应用场景。最常见的是在历史照片和影像的修复和着色上,让过去的黑白影像更加生动和逼真。此外,图像着色技术也广泛应用于电影和视频的后期制作,尤其是将老电影转换为彩色版本。在医学领域,图像着色可以用于增强医学成像,如MRI或CT扫描,从而提高疾病诊断的准确性。还有一件事(老爹语气)——这项技术在艺术和设计领域也有广泛应用,如在黑白素描或设计中添加色彩,增强视觉效果和信息传达。该项目已经开源至我的个人仓库,该兴趣的老铁可以点个star哦~