在很早之前,iOS上有这样一款软件叫Pimple Eraser,它实现的功能非常简单,就是把人脸中的痘痘给去掉,而且效果很不错。当然你得手动的选择痘痘的位置和大小。不过可惜的是,这款软件的交互做的不是很好。大约一年之后,美图秀秀新的版本也实现了同样的功能,而且它的人机交互功能做得比 Pimple Eraser好的多,由此成为美图秀秀新的亮点。与此类似,百度魔图其实早就有这一功能,不过他们做出来的效果真的是不敢恭维,难道魔图团队就没有一个深入钻研算法的?
首先要说的是,我不是上述软件开发的作者中的任何一员。但是,我可以猜测的是美图秀秀和Pimple Eraser用的就是偏微分方程修复的算法,而百度魔图用的是加权均值修复,所以后者的效果没法和基于偏微分修复的效果相媲美。其实在大名鼎鼎的PhotoShop图像处理软件中,它的污点修复工具就是用PDE去实现。
图像修复基本上可以分为两大类。一是对于细小裂缝的修复,这类基本上用PDE的效果比较好。另外一类,就是对大块空洞的修复,这类问题一般用纹理填充的方法。PhotoShop里面,选择【填充】--【纹理识别】菜单实现的就是对大块空洞的纹理填充算法。PS的算法对大块空洞纹理填充的方法在很多时候不尽人意,目前已经有很多更好更快的算法已经被提出。
由于偏微分方程离散化之后需要求解一个大规模的线性方程组,一般使用高斯赛德尔迭代算法。所以基于偏微分方程的修复的难点在于计算量大,而且很占系统RAM资源。关于这方面的文献可以在网上找到很多,而且有matlab代码可供参考。
由于人脸的痘痘一般只在人脸部分,所以我根据这一特点,采用局部修复的方法,实现了经典的TV模型数字图像修复算法。能够快速的去除人脸上的痘痘,而且系统占用RAM资源很小。
下面是测试图片:
从修复结果上看,虽然有头发挡住了痣的部位,但是修复的结果还是可以勉强接受的。