本篇博文来自博主Imageshop,打赏或想要查阅更多内容可以移步至Imageshop。

转载自:https://www.cnblogs.com/Imageshop/p/3293300.html   侵删

  说起为什么会看到这个东西,那还真的绕一圈。首先在写《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果及其他。 一文时里面提到了导向滤波,然后看何凯明的《Guided Image Filtering》一文时又多次提到双边滤波,结果我就又把以前研究的双边滤波的文章翻出来看看,就再次翻到了Fast O(1) bilateral filtering using trigonometric range kernels 一文,在论文的第10页有如下这段文字:

The Java source code can be downloaded from the web at http://bigwww.epfl.ch/algorithms/bilateral-filter

我试着打开这个网页,结果遇到了CSDN常见的404错误,然后想既然来了,就在这个网站多看看,哇,原来这个真是个好网站,有大量的图像算法可以学习。一眼我就看到了最左侧有一个Download Algorithms项目,于是进去瞧瞧,并在浏览器里搜索bilateral,结果的确搜到了于有关bilateral的一个代码,如下所示:

BEEPS. This ImageJ plugin smoothes an image without altering its edges. The smoothing is applied by the way of a bi-exponential filter, itself realized by a pair of one-tap recursions. It is therefore very fast; moreover, its computational cost is truly independent of the amount of smoothing. Meanwhile, the preservation of edges is obtained by a range filter akin to the range filter found in a bilateral filter。

初步一看,我以为是作者对论文又有了新了改进,于是下载代码,并试着将这个插件安装到ImageJ中,运行后,效果和运行速度果然不错,但是,仔细看论文,确发现和上述的快速双边滤波不是一回事。

好了,言归正文。BEEPS,是Bi-Exponential Edge-Preserving Smoother 一文各字母的缩写,这篇文章里涉及到了很多数学理论,比如Z变换等等,这些我都基本上已经丢给老师了,不过不要紧,那些验证工作是写论文的这些牛人们需要去做的工作。我们最关心的是算法的流程。 幸好在这篇论文中,算法的流程在算法的第二页就已经完全的展示了, 并且过程特别简单,为避免翻译错误,先直接贴原文:

The first recursion is progressive. Letting x[k] be the current sample of an input sequence x at location k ∈ Z,were cursively compute the elements of an auxiliary sequence ϕ as:

where:

The second recursion is regressive and very similar to thefirst one, except for a reversal of the order in which the indices are traversed. We recursively compute a second auxiliary sequence φ as:

where:

We complete our algorithm by merging the resulting progressive sequence ϕ and regressive sequence φ to produce the samples of the output sequence y as:

We propose the trivial choice:

小注:博客园团队建议我用他们内置的公式编辑器输入公式,我看还是算了吧,那个东西还需要记忆一堆东西,不如直接贴图来的快又准确。

  对上述过程稍作解释:x[k]可以看做是已经离散后的输入数据,λ ∈[0,1)是一个用户输入的用来控制空域滤波的程度,r是一个双变量的函数,用于控制值域滤波系数,对于双边滤波,该函数可取经典的高斯分布函数,也可以取其他的函数。

上述过程就是一个简单的前向迭代和反向迭代,然后再按一定的规则去平均值的过程。因此计算非常简单。

但是上述是个一维的过程,对于二维的图像数据,论文中也给出了解决方式,首先:对图像数据进行一次水平迭代计算,然后再对该数据进行垂直迭代计算,该过程称之为BEEPSHorizontalVertical。然后再对原始图像数据先进行垂直方向的迭代计算,在对该结果进行垂直方向的迭代计算,该过程称之为BEEPSVerticalHorizontal。最后的图像结果为(BEEPSHorizontalVertical+BEEPSVerticalHorizontal)/2;

  比如上述公式1中最后体现在代码中可能如下(progressive):

for (int k = startIndex + 1, K = startIndex + length;(k < K); k++)

{

    mu = data[k] - rho * data[k - 1];

    mu = spatialContraDecay * exp(c * mu * mu);

    data[k] = data[k - 1] * mu + data[k] * (1.0 - mu) / rho;

}

式3的代码可能为(regressive):

for (int k = startIndex + length - 2; (startIndex <= k); k--)

{

       mu = data[k] - rho * data[k + 1];

       mu = spatialContraDecay * exp(c * mu * mu);

       data[k] = data[k + 1] * mu + data[k] * (1.0 - mu) / rho;        

}

具体的代码可以从上述提供的相关网页里寻找,或者直接从这里下载。

话说JAVA的源码要修改成C#的,那简直就是很爽啊,有些复制过来基本都不要改动的。

这个算法特别适合于并行计算。

使用这个滤镜的过程就会发现,他对边缘的保护很好,而对一些变化平坦的区域总是会其更加平滑,总体感觉和表面模糊很像(表面模糊其实也是一种双边滤波器),以前曾考虑过用表面模糊来实现磨皮,但是由于目前所知道的表面模糊的任何优化算法都还是比较慢(但效果和PS是完全一致的),因此一直没有真正实践,这次看到这篇论文,经过我的实践,如果参数取的适当,如在和肤色检测或其他方式配合,完全可以实现较好的自动磨皮效果。

  比如,针对一些图像,我做了如下测试和比较:

  

                原  图                         本文 λ=0.02,photometricStandardDeviation =10

  

        美图秀秀智能磨皮,参数为深                             可牛影像超级磨皮

 和美图秀秀的比较,似乎看不出有什么区别,而可牛的明显的有不少瑕疵。

  再做一些比较:

     

                                原  图                               本文 λ=0.02,photometricStandardDeviation =10

     

                      美图秀秀智能磨皮,参数为深                            可牛影像超级磨皮

再来一副:

                原图                                                  本文                                             美图                                                 可牛

无论是那一副图,似乎可牛的效果总会硕一些,有颗粒感。

在看看一些皮肤严重粗糙的图片的效果:

     

                                 原  图                                  本文 λ=0.02,photometricStandardDeviation =20

     

美图秀秀智能磨皮,参数为深                            可牛影像超级磨皮

本文通过适当的调整参数,是的皮肤部位的磨皮效果比美图秀秀和可牛要好,但是头发部位的信息有所丢失。

从上面这副图中,可以看出,可牛的算法在最下部产生了一条黑线,这明显是可牛在算法层面上有BUG所致。国内的软件这些细节方面注意的不到位啊。

在http://www.cnblogs.com/celerychen/archive/2013/03/09/2951581.html的博客中,他的算法对上面这幅获得更好的效果,但他对使用的算法没有提到。

上述所有的图像都是直接拿这个双指数边缘保留平滑滤波实现的,未使用任何其他的辅助的技术。

当然,美图这些软件应该还是更专业些,我这里举得例子可能都是找了一些对我这个有利的来说明的,但无论如何,这种边缘保留特性的滤波器作为磨皮的一种辅助手段是必然有其生存空间的。

习惯性动作,提供一个可供大家测试效果的程序: 基于双指数边缘保留平滑器的磨皮测试

无论文章写得好不好,都希望能获得各位看客的支持,有的时候一个小点击或小回复也是给作者继续写作的动力源泉。

双指数边缘平滑滤波器用于磨皮算法的尝试相关推荐

  1. 双指数边缘平滑滤波器用于磨皮算法的尝试。

    说起为什么会看到这个东西,那还真的绕一圈.首先在写<Single Image Haze Removal Using Dark Channel Prior>一文中图像去雾算法的原理.实现.效 ...

  2. 图像处理(五)双指数磨皮

    磨皮对于现在的图像处理软件,可以说是一项重要的功能,在天天P图,可牛,ps,美图秀秀等软件中随处可见,有可能即使你非常熟悉图像处理的算法,然而却不懂磨皮怎么实现.其实磨皮就是所谓的保边缘滤波,也就是说 ...

  3. 温度补偿 matlab,基于传感器温度补偿方法的双指数函数模型的温度补偿算法设计...

    描述 0 引言 目前基于传感器的温度补偿方法主要分为模拟硬件设计和数字信号处理两种方法.模拟硬件通常采用PTAT 和CTAT 等技术来设计读出电路.数字信号处理方法通常包括线性拟合.最小二乘多项式 拟 ...

  4. 技术的真相 | 基于双边滤波的磨皮算法及优化

    一.背景简介 现在视频类应用非常火热,直播.美妆.医美应用层出不穷.用户们在使用这类应用时都希望自己在屏幕上的样子美美的,皮肤细腻光滑.本文就介绍一种实现简单.效果很好的磨皮算法以及对它的优化思路. ...

  5. 双边滤波的人脸磨皮算法(宋茜)

    本文将介绍双边滤波的原理以及在人脸磨皮中的应用. 文章目录 双边滤波原理 人脸磨皮算法 双边滤波原理 双边滤波器是保边滤波器中广为人知的一种.保边滤波器指在滤波过程中能够有效的保留图片中的边缘信息的一 ...

  6. 基于边缘检测的磨皮算法实现——OpenGL版

    一.背景 人脸磨皮算法的本质是模糊算法,但是与模糊算法最大的区别是,磨皮算法需要考虑保边效果,需要达到"磨皮了但又保留了脸部的各种纹理细节和边缘信息"的效果.保边的思路甚至与模糊的 ...

  7. 图像算法---磨皮算法研究汇总

    写这篇博客,也是对自己这段时间关于磨皮算法内容研究做个小结. 目前,对于人脸磨皮算法,大家并不陌生,从PS到APP应用,可谓是层出不穷,这里我总结一下,具体流程如下: 1,保边滤波器 2,肤色检测 3 ...

  8. 简单探讨可牛影像软件中具有肤质保留功能的磨皮算法及其实现细节。

    在几年前写的一篇关于BEEP的文章时,我曾经说过Beep的去噪作用可以用于磨皮,并且给出了结论BEEP比可牛和美图等的效果要更为好,现在看来,那个结论确实是太为夸张和固定了.不同的人的审美观不同,同一 ...

  9. 《Algorithms》—— Dijkstra 的双栈算术表达式求值算法

    想当年学数据结构的时候,一直觉得这个是我一辈子都搞不懂的一个东西.现在看看...还挺简单的... 重点在于如何解析由括号.运算符和数字组成的字符串,并按照正确的顺序完成各种初级算术操作.利用了两个栈( ...

最新文章

  1. C++及Windows异常处理(try,catch; __try,__finally; __try, __except)——一道笔试题引起的探究
  2. php rss xml,php – 如何使用simplexml解析RSS中的标记
  3. 如何解决大量字段的录入交互界面的设计呢?
  4. 网件rax40可以刷梅林_美国网件发布全系列Wi-Fi6家用无线路由器,部署未来家用产品市场...
  5. linux初始化内存盘卡住,Linux系统内存磁盘初始化技术详细解析
  6. Requests: 让 HTTP 服务人类
  7. kubernetes Ingress是什么
  8. 计算机械零件体积,第三章机械零件的工作能力和计算准则.docx
  9. mysql数据库解锁
  10. 算法/回溯法/8-Queen八皇后问题
  11. 自主安装IPA文件到iPhone上
  12. HTML5 之 Link 标签
  13. P4747 [CERC2017]Intrinsic Interval
  14. 房东家的网线不用账号和密码就能上网怎么设置路由器
  15. python语句用什么隔开_在python中使用字典时用什么隔开
  16. 短视频平台开发VS直播平台开发,未来发展趋势
  17. IPFS何时落地应用?FIL价值破千?
  18. js滚动数字动画效果
  19. 传说中的BNET边缘传输
  20. 最强手机编程App - Dcoder汉化版

热门文章

  1. param name=allowScriptAccess value=never/是什么意思
  2. 干货分享 | 杭州“边缘计算” 研讨会
  3. 最新微信QQ域名防封、微信群活码系统
  4. solr 从数据库导入数据,全量索引和增量索引(实例配置原理)
  5. 学生动物网页设计模板下载 大学生宠物HTML网页制作作品 简单宠物狗网页设计成品 dreamweaver学生网站模板 (1)
  6. Vue--nextTick--作用/用法/原理
  7. docker-error-at \\\“/dev/mqueue\\\“ caused \\\“no such device
  8. python如何求矩阵逆运算_Sympy复矩阵求逆/运算
  9. 监测环境温度遇坑记之unsigned char char
  10. Solr基础理论【倒排索引,模糊查询】