Java双指数边缘平滑滤波器用于磨皮算法的品尝。

  说到为啥会看出那些事物,那还当真绕一圈。首先在写《Single
Image Haze Removal Using Dark Channel
Prior》一文中图像去雾算法的规律、实现、效果及任何。
 一文时里面涉及了导向滤波,然后看何凯明的《Guided
Image
Filtering
》一文时又反复提到双方滤波,结果小编就又把原先商量的相互滤波的小说翻出来看看,就重新翻到了Fast
O(1) bilateral filtering
using
 trigonometric
range
kernels
 一文,在舆论的第玖页有如下那段文字:

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

     
笔者试着打开这几个网页,结果遇见了CSDN常见的404荒谬,然后想既然来了,就在那一个网站多看看,哇,原来那一个真是个好网址,有恢宏的图像算法能够学学。1眼笔者就来看了最左侧有二个Download
Algorithms项目,于是进去瞧瞧,并在浏览器里搜索bilateral,结果真的搜到了于有关bilateral的3个代码,如下所示:

     
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:

           Java 1

    where:

                           
Java 2

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:

             Java 3

    where:

                            Java 4

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

                   Java 5

     We propose the trivial
choice:

                           Java 6

    
小注:新浪集体提议笔者用他们放到的公式编辑器输入公式,笔者看也许算了吧,这几个东西还索要纪念一批东西,不及直接贴图来的快又准确。

  对上述进程稍作解释:x[k]能够当做是1度离散后的输入数据,λ
∈[0,壹)是四个用户输入的用来支配空域滤波的水准,r是一个双变量的函数,用于控制值域滤波全面,对于两者滤波,该函数可取经典的高斯分布函数,也能够取别的的函数。

    
上述进程正是2个简练的前向迭代和反向迭代,然后再按一定的条条框框去平均值的长河。由此总结相当不难。

     
不过上述是个壹维的进度,对于贰维的图像数据,杂文中也交给了消除办法,首先:对图像数据实行3回水平迭代总计,然后再对该数据开始展览垂直迭代总结,该过程称之为BEEPSHorizontalVertical。然后再对本来图像数据先实行垂直方向的迭代总计,在对该结果进行垂直方向的迭代总计,该进程称之为BEEPSVerticalHorizontal。最终的图像结果为(BEEPSHorizontalVertical+BEEPSVerticalHorizontal)/二;

  比如上述公式第11中学最终反映在代码中也许如下(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是完全1致的),因而一贯从未真正实施,本次看来那篇杂谈,经过本身的执行,假如参数取的适度,如在和肤色检查测试或其余办法万分,完全能够达成较好的电动磨皮效果。

  比如,针对一些图像,小编做了之类测试和相比较:

 Java 7 
Java 8

                原  图
                        本文
λ=0.02,photometricStandardDeviation =10

 Java 9  Java 10

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

  和美图秀秀的可比,如同看不出有如何界别,而可牛的强烈的有不乏先例缺点。

  再做1些比较:

    Java 11     Java 12

                                原  图
                              本文
λ=0.02,photometricStandardDeviation =10

    Java 13    
Java 14

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

    再来1副:

 Java 15Java 16Java 17Java 18

               
原图                                                 
本文                                           
 美图                                                 可牛

    
无论是那1副图,如同可牛的效用总会硕一些,有颗粒感。

     在探视一些皮肤严重粗糙的图纸的功力:

  
Java 19    
Java 20

                                     
原  图                                  本文
λ=0.02,photometricStandardDeviation =20     

  
Java 21     Java 22

                      
美图秀秀智能磨皮,参数为深                           
可牛影象一流磨皮

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

     
从地点那副图中,能够见见,可牛的算法在最下边发生了一条黑线,那明摆着是可牛在算法层面上有BUG所致。国内的软件这一个细节方面注意的不做到啊。

     
http://www.cnblogs.com/celerychen/archive/2013/03/09/2951581.html的博客中,他的算法对上面那幅获得更好的意义,但他对选用的算法未有提到。

     
上述全数的图像都以直接拿这些双指数边缘保留平滑滤波达成的,未利用任何其余的扶植的技艺。

      当然,美图那些软件应该依然更标准些,笔者那边举得例子或许都是找了某个对我那么些有利的来表达的,但好歹,那种边缘保留天性的滤波器作为磨皮的1种辅帮手段是一定有其生存空间的。

     
习惯性动作,提供3个可供大家测试效果的顺序:
好玩的事双指数边缘保留平滑器的磨皮测试

     Java 23

 

    
无杂谈章写得好不佳,都期待能收获各位看客的支撑,有的时候一个小点击或小回复也是给作者继续写作的动力源泉。

 

 

*********************************笔者:
laviewpbt   时间: 20壹3.捌.31    联系QQ:  33184777 转发请保留本行新闻************************

 

相关文章