ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
灰度图像彩色化这个课题,一直以来都有不少相关人员在研究,也算是个热门话题,能否把一张灰度图按照我们的意愿,准确的彩色化,成为成败的关键。最近一直在研究这个灰度图像彩色化算法,看了不少论文,做了不少实验,于是,在这里做个总结跟大家分享一下,希望能跟对于这个算法有兴趣高手们能共同讨论一下,也算是抛砖引玉吧! 目前灰度图像彩色化的算法主要有以下几种: 1,基于优化扩展的彩色化算法 2,基于最短距离和色度混合的彩色化算法 3,基于颜色转移的彩色化算法 相关参考文献举例如下: 1,Colorization using Optimization  这篇是最经典的论文 2,Fast Digital Image Colorization Technique        Fast Colorization Using Edge and Gradient Constrains        Natural Image Colorization 3,Transferring Color to Grayscale Image        Example-based Multiple Local Color Transfer by Strokes        Affective Image  Colorization        Color Transfer Based on Normalized Cumulative Hue Histograms        Color Transfer in Correlated Color Space        Colorization by Example        Color Transfer between Images 以上文献均为举例,有兴趣的可以自行搜索。 现在说一下以上三种方法的优缺点:     对于基于优化扩展的彩色化算法,这种算法主要是基于一种图像分割算法,设立优化条件,寻求最优的图像分割,然后进行着色;这个算法是半自动的算法,所谓半自动算法就是说需要我们人为的在一副灰度图像上画出自己想要添加的颜色线条,根据我们确定的这个颜色线条,结合分割算法,进行着色。这个算法相对于最短距离彩色化算法要准确,但是时间复杂度太高,过于耗时,不适合大规模彩色化。     效果图举例: ![](https://box.kancloud.cn/2015-12-30_56837ddebdc72.jpg)                                                                        Fig.1     对于基于距离和色度混合的彩色化算法,这种算法最大的优点是速度快,属于快速算法,缺点是单纯考虑了距离的影响,忽略了颜色聚类的影响,也属于半自动算法,其主要思想是:用户设定颜色线条,然后根据某种距离公式计算每一个像素到颜色线条的距离,则距离最近的线条颜色即为该像素的颜色。     效果图举例: ![](https://box.kancloud.cn/2015-12-30_56837dded472f.jpg)                                                 Fig.2     对于基于颜色转移的彩色化算法,这种算法最大的优点是:自动化,不需要人为干涉,只需要你提供一张与目标灰度图像内容相近的彩色图像,主要思想是:研究某种颜色匹配算法,将彩色图像中的颜色信息匹配到目标灰度图像中,从而完成灰度图的彩色化。这种算法的缺点是:1,在彩色图像中不一定可以找到灰度图中完美匹配的点,因此,对于这些点,效果较差;2,不能按照我们需要的颜色进行彩色化;     效果图举例: ![](https://box.kancloud.cn/2015-12-30_56837ddeea3c0.jpg)                                                                                                                          Fig.3 本文结合以上三种算法的优缺点,介绍本人认为的最简单的最适用的第二种算法:基于最短距离和颜色混合的灰度图像彩色化距离 这个算法过程如下: 1,寻找最短距离算法,图像中的距离算法有很多,比如:欧式距离,Dijkstra距离等,这里我们使用欧式距离,公式如下: ![](https://box.kancloud.cn/2015-12-30_56837ddf101ed.jpg) 2,对于灰度图A,人为的设定颜色区域S[i],其中i表示颜色线条的个数,每一个颜色线条,我们使用集合S[i]表示,如图Fig.1中左边灰度图所示,有人为添加的许多颜色线条; 3,对于图像A,包含两个集合,一个是没有着色的像素点集合M,一个是被颜色线条覆盖的像素点集合N,对于N中的每个像素,实际上对应的颜色就是颜色线条的颜色,对于M中的每一个像素点,由于是灰度图像,因此,它只有灰度信息,也就是亮度信息Y(这里我们使用YCbCr颜色空间),我们需要做的就是确定这个像素对应的Cb,Cr色度值。     首先,我们计算M中的每一个像素P(x,y)到每一个颜色线条S[i]的距离,记为D[i],那么,我们寻找D[i]的最小值,也就是到P距离最短的颜色线条,那么P的颜色就是具有最短距离D[i]的颜色i,这样就可以求出对应的Cb,Cr值了。     其次,这样的算法有可能得到的图像边缘过度不自然,因此,采取了一种颜色混合的算法,我们把P点的颜色看作是不同颜色线条i距离D[i]的加权,公式如下: ![](https://box.kancloud.cn/2015-12-30_56837ddf20685.jpg) 其中d表示欧式距离,c表示色度Cb,Cr,chrominance表示相应的结果色度,W表示一种加权公式 对于W,公式如下: ![](https://box.kancloud.cn/2015-12-30_56837ddf2e778.jpg) 其中, b一般取4,范围为(0,6] 这样整个彩色化过程就完成了,放上我自己的效果图: ![](https://box.kancloud.cn/2015-12-30_56837ddf412a5.jpg)![](https://box.kancloud.cn/2015-12-30_56837ddf64d7b.jpg) ![](https://box.kancloud.cn/2015-12-30_56837ddf872bb.jpg)![](https://box.kancloud.cn/2015-12-30_56837ddfa8064.jpg) ![](https://box.kancloud.cn/2015-12-30_56837de01ac27.jpg)![](https://box.kancloud.cn/2015-12-30_56837de03c8b9.jpg) ![](https://box.kancloud.cn/2015-12-30_56837de0557c7.jpg)![](https://box.kancloud.cn/2015-12-30_56837de069927.jpg) 我的效果图是针对以上算法进行了改进之后得到的,有兴趣的图像处理爱好者们可以研究一下,期待跟大侠们交流!我的QQ1358009172,博客http://dongtingyueh.blog.163.com/ 最后,分享一个专业的图像处理网站(微像素),里面有很多源代码下载: [http://www.zealpixel.com/portal.php](http://http//www.zealpixel.com/portal.php)