葡萄娱乐场归纳研究可牛影象软件中有所肤质量保证留功能的磨皮算法及其达成细节

     在一9七陆年Lee公布的杂文《Lee Filter
Digital Image Enhancement and Noise Filtering by Use of Local
Statistics》中,建议了基于局地音信去除加性噪音、乘性噪音及加性乘性混合噪音的章程,经过精心的求学和编码,开掘其去除加性噪音的措施效果11分好,具备当今部分EPF算法类似的边缘保留作用,并且其运算并不复杂,可以行使到类似于磨皮那体系型中。

   
 在几年前写的一篇有关BEEP的稿猪时,小编早已说过Beep的去噪成效能够用于磨皮,并且付诸了定论BEEP比可牛和美图等的功效要越来越好,未来总的来讲,那几个结论真的是太为夸张和一定了。分歧的人的审雅观差异,同一位在分裂时段审雅观也会持有出入,以后看来,小编到时感觉可牛印象的含有肤质保留效果的磨皮尤其自然,也越来越符合实际的气象。

   
 简单的算法描述如下,对于壹幅N*M大小灰度图像,用葡萄娱乐场 1表示(i,j)地点处的像素值,那么在(二*n+1)*(2*m+1)窗口内部的局地平均值及片段均方差可代表为:

   
 在前些时间里,又随机的百度了下PS的磨皮教程,看到了广大的已经看过的例子,也见到了1部分即时反对的稿子。当中就包涵http://www.missyuan.com/thread-468975-1-1.html此地讲的流程,因为看到其第2步为:

               
  葡萄娱乐场 2

     二、用插件磨皮

       及

       
这一步很重大,间接影响最终效果,磨光一些,不要忧郁纹理。

           
 葡萄娱乐场 3

       
平湖先生只怕用的NeatImage,笔者那里运用的是Portraiture,
把红框内的滑块都拉到最大。

       加性去噪后的结果为:

     
当时温馨平昔不NeatImage,也未安装Portraiture,所以对这一个课程就不予了。

         
 葡萄娱乐场 4

   
 当自身再也浏览此教程时,终于耐下心自身考试了下,
固然自身或许未有安装NeatImage和Portraiture,可是足以平昔用PS自带的外表模糊来代替,即使功效会迥然不相同,可是却不影响算法的基本成效。事实再也说多美滋(Dumex)(Aptamil)个真理:别人讲1000遍好,不比本人都三遍感受深。

   其中:

   
 那么那几个科目的1个最重要的成效就是磨皮的还要保留了肤质,很周围于可牛印象的效率,而屡屡的实施申明,可牛软件百分百也是应用了近乎的进程。

             
  葡萄娱乐场 5

   
 大家把十分籍助教程的大约操作步骤列表如下:

     
 式(四)中σ为用户输入的参数。

  一、复制一个图层,我们定义改层名叫HighPass

     
 正是那般个差不多的历程,能平滑图像但还要保持边缘基本不受影响,比方下图的结果:

     二、用插件对HighPass层磨皮;

 

   
 3、应用图像,格局选用减去,缩放值为1,偏差128;

葡萄娱乐场 6

   
 4、退换HighPass层混合形式为线性光,不反射率合适取值。

       

   
 5、对HighPass层举行高斯模糊,模糊半径0.5-2左右。

   
  那个优秀的人品让其能在图像磨皮方面发挥一定的功效。

  基本就这么收工了,就像并没有啥样高深复杂的东西。

     
在来探视这么些算法的频率怎么着。由地点的总括公式可以见见,其重要的总括量是一些均值以及均布均方差,均值的总结优化措施大多,标准的举个例子累计积分图。而有关均布均方差的优化,推荐大家看那里:http://fiji.sc/Integral_Image_Filters,其主导的推翻公式为:

 
 至于效果:大家用几幅实际的图像来测试下(第贰步用外表模糊来代替)。

  

 
 葡萄娱乐场 7 
  葡萄娱乐场 8   
 葡萄娱乐场 9

               
  葡萄娱乐场 10

              
 原图                          去斑要求的纹路图                结果图(表面模糊参数半径=10,阈值=1六)

        which expands to

 
 葡萄娱乐场 11   葡萄娱乐场 12  
 葡萄娱乐场 13   

                   
 葡萄娱乐场 14

       
             原图                                        去斑须要的纹理图                          结果图(表面模糊参数半径=10,阈值=50)

                               
  葡萄娱乐场 15

     
为了程序的贯彻,大家对各样步骤都开展对应的解析,为便于,大家只要原始图像层为Src层。

                               
  葡萄娱乐场 16

      (1)复制图层:
这几个没啥好说的,无非是分配三个同样大小的内存,然后memcpy 函数复制
Src到HighPass层。

                               
 葡萄娱乐场 17

          HighPass=
Copy(Src);

                               
 葡萄娱乐场 18

     
(2)对HighPass层磨皮:那个算法能够选取:表面模糊、导向滤波、双边滤波、各向异性扩散、BEEP、局地均方差、Domain
transfer、 Adaptive Manifolds、 Local Laplacian
Filters等其余具备保边效果的EPF-Filter,那里不多说。

                               
 葡萄娱乐场 19

         表明式为:  HighPass =
EPF-Filter(HighPass);

                               
 葡萄娱乐场 20

     
(三)应用图像:这里的界面看起来就如很复杂,那代码是否很复杂呢,其实代码简单的聚蚊成雷,便是底下的总括公式:

                             
  葡萄娱乐场 21

        HihgPass = HighPass – Src

       Both sums can be generated from
two Integral Images
over 葡萄娱乐场 22 and 葡萄娱乐场 23 respectively.

  • 128;

      
经过那样的演绎,能够见见有个别均方差也得以通过累计积分图火速达成,那样的结果是先后的功用和一部分的半径参数非亲非故,因而,效用非常高。

           
看上去那么些公式是否很熟悉,不错,这几个和高反差保留的算法是一模一样的,只是Photoshop内嵌的高反差保留用的是高斯模糊,那里用的是EPF滤波器而已。

     
 小编个人在那个的基础上,从编码角度更是进展了优化,对于一幅30W(500*600)像素的彩色图像管理时间约为20ms(I三的台式机CPU)。

       (4)
从编制程序角度来讲,要把上述进度的第五步和第陆步沟通顺序,不然会赢得错误的结果,因而那里第陆步是:

 

       HighPass =
GuassBlur(HighPass, Radius);

     
 上述公式是针对灰度图像进行的,对于广大的CRUISERGB彩色图,只要对PRADO/G/B叁坦途分别张开始拍戏卖就OK了。

    在那之中Radius为高斯模糊的半径。

 

        (五) 实行图层混合:
线性光混合的计算公式也很轻松:

     
 有了上述基础,经过个人的探究,对于磨皮应用,那么些算法的五个参数(1)半径可取:max(Src->Width,
Src->Height) * 0.02, 用户输入的σ可取10 + DenoiseLevel *
DenoiseLevel * 伍,在这之中DenoiseLevel
为磨皮的水准参数,范围从壹到10,越大磨皮越厉害。

     假定多少个相邻图层X和Y,X在俗尘,Y在上方,X与Y混合,则X是本色,Y是混合色,X与Y混合得到的颜色是结果色Z,对于线性光混合形式,其总括公式为:

        

          Z = X + 2 * Y –
256;    (原先感觉是  – 25五,后用PS CS六验证是 – 25陆)

     
 正如作者在小说《 1种具备细节保留功用的磨皮算法 》中提议的同等,磨皮算法需求思量眼睛头发等非肤色部位不被过分管理,1种简易的管理格局正是用十分轻便的颜料推断来决定是各样像素点是还是不是为索要管理的地位,比方小编在事实上的管理中就轻易用了如下的措施:

     不发光度的总结公式就越来越简易,假设Opacity代表Y的不发光度,则合成公式为:

           

           Z = (X * (100-
Opacity) + Y * Opacity ) / 100;

     for (Y = 0; Y < Height; Y++)
    {
        LinePS = Src->Data + Y * Src->WidthStep;
        LinePD = Skin->Data + Y * Skin->WidthStep;
        for (X = 0; X < Width; X++)
        {
            if (LinePS[0] >20 && LinePS[1] > 40 && LinePS[2] > 50)  //    皮肤识别有很多算法,但没有一个能完美的包含所有的皮肤区域,我认为宁愿多处理一些非皮肤                                                                           区域,也比少处理更合理些
                LinePD[X] = 255;                                    //    为什么取这些数据,我只能告诉这些数据是前人的一些经验没有什么数学公式来推导和证明的
            LinePS += 3;            
        }
    }                                                               //    以上处理得到的是硬边界,直接使用会到底结果图有较为明显的痕迹,因此可使用模糊平滑下

     那么四个综合在联合的总括公式为:

   
 为了让识其他区域界线不是尤其生硬,供给对分辨区域拓展一定的拍卖,一般正是用羽化算法,规范的物化算法是高斯模糊,但是高斯模糊有浮点总括,1种替代格局正是用方框模糊来取代,实际上三种格局获得的结果在视觉上是从未有过太多的区分的,但是方框模糊唯有整数运算,作用上会高繁多。

          Z =  (X * (100-
Opacity) + (X + 2 * Y – 256)* Opacity ) / 100;

   
 那样的鉴定识别管理后,把拍卖后图和原图举行Alpha混合,那样即保留了磨皮的光润区域,又能确定保证头发等地点不被平滑掉。

     
综合上述多个步骤,最后的总括公式即为:

        for (Y = 0; Y < Height; Y++)
        {
            LinePS = Src->Data + Y * Src->WidthStep;
            LinePD = Dest->Data + Y * Dest->WidthStep;
            LinePM = Mask->Data + Y * Mask->WidthStep;
            for (X = 0; X < Width; X++)
            {
                Alpha = LinePM[0]; 
                if (Alpha != 255)
                {
                    InvertAlpha = 255 - Alpha;                                         //    AlphaBlend的混合过程,使用DIV255来提高速度
                    LinePD[0] = Div255(LinePD[0] * Alpha + LinePS[0] * InvertAlpha);    //  Blue分量
                    LinePD[1] = Div255(LinePD[1] * Alpha + LinePS[1] * InvertAlpha);    //    Green分量    
                    LinePD[2] = Div255(LinePD[2] * Alpha + LinePS[2] * InvertAlpha);    //    Red分量
                }
                LinePS += 3;                                                            //    移动到下一个像素,24位                
                LinePD += 3;
                LinePM++;                                                               //    移动到下一个Mask值
            }
        }

      Dest =(Src * (100 – Opacity) + (Src + 2 * GuassBlur(EPFFilter(Src) – Src + 128) – 256) * Opacity) /100
;

   
 在拍卖到位后,从视觉角度思考,全体图照旧有点模糊,那年理应张开了适度的锐化来增进图像的总体锐度,最合适的是USM锐化,可是USM锐化是基于高斯模糊的,由此又不行耗费时间,这年能够设想用最简答的天地锐化格局来管理,比方借助上边包车型客车卷积矩阵,就能赢得准确的视觉效果。

   
 总的来讲,这几个算法并从未怎么特别复杂的地方,其关键的回涨皮肤质感的步骤是第肆步的高斯模糊,那个模糊的半径一般越大,材料越强,不过太大,磨皮效果就未有了,因而,那里要求把握合适的度,一般半径在0.五-2期间比较适宜。

        -1   0    -1 

   
 至于为啥用了那些高斯模糊就能够回复图像的材料,小编实际也是有个别主张的,可是当下还不成熟,权且不管她,知道结果而不管缘由一些时候也是壹种幸福。 

        0     8    0      /     4 

   
 再来讲说算法的参数问题呢,作为当今APP上美颜必备的那一个功用,每一种应用程式都期待给用户显示出越来越少的更傻瓜(智能)的参数,在本进度中,比方第一步,必然有过多可选的参数配置:借使选择表面模糊,则须求规定半径及阈值;假诺使用导向滤波,则一般也亟需半径参数。怎么着遵照用户UI中的参数(比方磨皮程度)来规定相应的中间的参数,就须求针对各样分歧的滤波器来做往往的调整和尝试,那些并无定位的法则可服从。 

       -1     0    -1

   
 再如第一步应用图像中常数12八,其实也不必然是个定值,倘若把她调大,则管理后的图像全部偏亮,调小则图像偏暗。

   
 思索到那些算法对每种像素的亮度值的变动并不是一点都不小,对于彩色图像,假若能够转移到此外的含有亮度分量的水彩空间后,只对亮度实行拍卖,然后在改造回来,应该对视觉的熏陶比极小,那样去除颜色空间的改换时间,能够进步三倍的速度,是至极可观的,常见的涵盖亮度的颜料空间有LAB,HSV,YUV,YCbCr等,个中YCbCr和CR-VGB的转移公式10分轻易,未有浮点总括,对完全的频率影响十分小,因而能够接纳这一个空间。

   
 第4步的图层的不折射率参数也是八个道理,假如不光滑度值越大,则图片全部的星点大概会偏多,偏小,那么图像又会超负荷模糊,或者取个3/6是个准确的抉择吗,恐怕自身依照拍卖的纹理图的某部目的做个算法更加好吧。

   
再者,经超过实际验,开采也得以把锐化操作放在对亮度管理这步,而不是坐落最终,那样,锐化操作也只必要处理多个轻重,同样能升高效能。

   
 算法速度方面实际根本在于第三步,也正是EPF滤波器,那么些正是个各显神通的好地点,不多言。

    贴出笔者管理的函数的流程:

  其次正是高斯模糊的乘除,高斯模糊必然有浮点计算,那对于手提式有线电话机等任何硬件,只怕是个硬伤。而借使用方框模糊只怕线性模糊等替代,则存在一个标题便是混淆的微乎其微幅度即半径为壹时,纹理苏醒的效用都有点过,尤其是在作者的次序中,高斯模糊的计量用了大半占了整个用时的1/叁.

/// <summary>
/// 实现图像的磨皮。
/// <param name="Src">需要处理的源图像的数据结构。</param>
/// <param name="Dest">需要处理的源图像的数据结构。</param>
/// <param name="DenoiseMethod">磨皮的算法,0为双边磨皮,1为均方差磨皮。</param>
/// <param name="DenoiseLevel">磨皮的程度,有效范围[1,10],数据越大,磨皮越明显。</param>
/// <param name="WhiteMethod">美白的算法,0为Log曲线美白,1为色彩平衡磨皮。</param>
/// <param name="NonSkinLevel">美白的程度,有效范围[1,10],数据越大,美白越明显。</param>
///    <remarks>原图、目标图必须都是24位的。</remarks>
IS_RET __stdcall SkinBeautification(TMatrix *Src, TMatrix *Dest, int DenoiseLevel, int WhiteMethod, int WhiteLevel)
{
    if (Src == NULL || Dest == NULL) return IS_RET_ERR_NULLREFERENCE;
    if (Src->Data == NULL || Dest->Data == NULL) return IS_RET_ERR_NULLREFERENCE;
    if (Src->Width != Dest->Width || Src->Height != Dest->Height || Src->Channel != Dest->Channel || Src->Depth != Dest->Depth) return IS_RET_ERR_PARAMISMATCH;
    if (Src->Channel != 3) return IS_RET_ERR_NOTSUPPORTED;
    if ((DenoiseLevel < 1 || DenoiseLevel > 10)) return IS_RET_ERR_ARGUMENTOUTOFRANGE;
    if ((WhiteMethod != 0 && WhiteMethod != 1) || (WhiteLevel < 1 || WhiteLevel > 10)) return IS_RET_ERR_ARGUMENTOUTOFRANGE;

    IS_RET Ret = IS_RET_OK;

    TMatrix *Skin = NULL, *Y = NULL, *Cb = NULL, *Cr = NULL, *YY = NULL;
    unsigned char *Table = (unsigned char *)IS_AllocMemory(256, true);        
    Ret = IS_CreateMatrix(Src->Width, Src->Height, Src->Depth, 1, &Skin);                //    分配皮肤区域的内存
    if (Ret != IS_RET_OK) goto Done;

    Ret = IS_CreateMatrix(Src->Width, Src->Height, Src->Depth, 1, &Y);
    if (Ret != IS_RET_OK) goto Done;

    Ret = IS_CreateMatrix(Src->Width, Src->Height, Src->Depth, 1, &Cb);
    if (Ret != IS_RET_OK) goto Done;

    Ret = IS_CreateMatrix(Src->Width, Src->Height, Src->Depth, 1, &Cr);
    if (Ret != IS_RET_OK) goto Done;

    Ret = IS_CreateMatrix(Src->Width, Src->Height, Src->Depth, 1, &YY);
    if (Ret != IS_RET_OK) goto Done;

    Ret = RGBToYCbCr(Src, Y, Cb, Cr);                                                             // 第一步: 将RGB转换到YCbCr空间
    if (Ret != IS_RET_OK) goto Done;

    int SpaceError = 10 + DenoiseLevel * DenoiseLevel * 5;

    Ret = LeeAdditvieNoiseFilter(Y, YY, max(Src->Width, Src->Height) * 0.02, SpaceError);        //    第二步:对Y分量进行加性噪音的去除
    if (Ret != IS_RET_OK)  goto Done;

    Ret = Sharpen(YY, YY);                                                                       //    第三步:对处理后的Y分量进行锐化
    if (Ret != IS_RET_OK)  goto Done;

    YCbCrToRGB(YY, Cb, Cr, Dest);                                                                //    第四步:将图像从YCbCr空间转换会RGB空间

    if (WhiteMethod == 0)
    {
        for (int V = 0; V < 256; V++)
        {
            //  Table[V] = .........
        }
    }
    else if (WhiteMethod == 1)
    {
        for(int V = 0; V < 256; V++)
        {
            //  Table[V] = ............
        }
    }

    Ret = Curve(Dest, Dest, Table, Table, Table);                              //    第五步:在RGB空间对磨皮后的图进行美白处理
    if (Ret != IS_RET_OK)  goto Done;

    Ret = GetRawSkinRegion(Src, Skin);                                         //    第六步:分析图像大概的皮肤区域
    if (Ret != IS_RET_OK)  goto Done;

    Ret = BlendImageWithMask(Src, Dest, Skin);                                 //    第七步:对全局磨皮、美白后的图和原始图按照属于皮肤区域的程度进行混合
    if (Ret != IS_RET_OK)  goto Done;

Done:;
    IS_FreeMatrix(&Skin);                                                      //    注意释放内存
    IS_FreeMatrix(&Y);
    IS_FreeMatrix(&Cb);
    IS_FreeMatrix(&Cr);
    IS_FreeMatrix(&YY);
    IS_FreeMemory(Table);
    return IS_RET_OK;
}

   
 假设看下那些的流程,能够以为美图里的其他多少个磨皮算法都只是进展了该流程的第二步就停止了,假设他在累加后续的拍卖,也自然能有和可牛类似的功用。

   第六步的美白管理尽管身处对亮度分量的管理进程中,图像全体会有所偏色,仿佛有1种肤色红润的功力,然而对有个别图像会以为颜色不自然。

   
 最终鄙视下可牛和美图程序的磨皮算法的快慢吗(笔者指的是PC上先后的进程):

     
各部分耗费时间比例见下图,测试图像大小是500*600。

   
 小编用的依附局地均方差的磨皮格局外加锐化等进度的耗时针对地点第三幅所谓的名媛平均耗费时间约
35ms(基于表面模糊),二伍ms(基于均方差);

序号

函数名

用时(ms)

百分比(%)

备注

1

RGBToYCbCr

2

10

 

2

LeeAdditvieNoiseFilter

7

35

 

3

Sharpen

2

10

 

4

YCbCrToRGB

2

10

 

5

Curve

1

5

 

6

GetRawSkinRegion

4

20

 

7

BlendImageWithMask

2

10

 

8

合计

20

100

 

   
 而可牛只怕美图我估计认为了,至少要有一千ms左右。

 

  那么看似的PS教程比方这里:http://www.psjia.com/photoshop/photops/2012/0106/3891.html 的壹弹指多少个进度算法其实也不会细小略,并且也享有一定不错的效能,而假使从贯彻上思量也就假如一下多少个经过:

 

Invert(Src, Dest);
HighPass(Dest, Dest, 10);
GuassBlur(Dest, Dest, 1);
BlendImage(Src, Dest, Dest, BlendMode::Overlay, 255);

 

  最终大家来相比较下可牛、美图、本文的拍卖成效:

       

  葡萄娱乐场 24  葡萄娱乐场 25

      

                  原图                                   美图秀秀的智能模糊
程度深

 

  葡萄娱乐场 26 
 葡萄娱乐场 27

 

            可牛的磨皮
力度伍                                   本文的磨皮效果

       

 
 能够见到,本文的职能和可牛的那些相近,能够证实可牛也运用的该算法。

 

   
 附上3个如约所谓平湖法的流程的做的叁个测试程序:   仿可牛磨皮特效.rar

 

葡萄娱乐场 28

 

 

 

葡萄娱乐场 29

 

 

 

****************************笔者:
laviewpbt   时间: 20壹5.八.陆    联系QQ:  33184777转发请保留本行音讯**********************

     

 

 

    各类效用比较如下:

葡萄娱乐场 30 
      葡萄娱乐场 31

                                         
      原图                                
                                    磨皮后的图

葡萄娱乐场 32 
      葡萄娱乐场 33

                                 
删除第一步后的图                                                        
                                                     
 删除第4第七步后的图

 

  这么些算法最大的亮点是全方位进度的别的函数都并未有浮点计算,那对于某个硬件来讲是很主要的,可是2个缺点是优化后的算法不能够互相,在自己的I三台式机Computer上30W的像素管理时间20ms,完全能得以落成实时效果。

   
 有意思味的敌人可依据自个儿的讲述自身达成,测试程序: 相当慢磨皮

     可调参数如下分界面所示:

葡萄娱乐场 34

 

葡萄娱乐场 35

 

 

****************************小编:
laviewpbt   时间: 20①伍.7.二柒    联系QQ:  33184777转发请保留本行消息**********************