必赢亚洲手机app下载


苹果电脑IDEA一点体验

众多创业九死终生

按照局部均方差相关新闻的图像去噪及其在实时磨皮美容算法中的应用必赢亚洲手机app。

     在1979年Lee发布的杂文《Lee Filter
Digital Image Enhancement and Noise Filtering by Use of Local
Statistics》中,指出了按照局部信息去除加性噪音、乘性噪音及加性乘性混合噪音的法子,经过精心的上学和编码,发现其去除加性噪音的办法效果特别好,具有当今部分EPF算法类似的边缘保留效率,并且其运算并不复杂,可以使用到类似于磨皮这连串型中。

   
 简单的算法描述如下,对于一幅N*M大小灰度图像,用必赢亚洲手机app 1意味着(i,j)地点处的像素值,那么在(2*n+1)*(2*m+1)窗口内部的有些平均值及一些均方差可代表为:

               
  必赢亚洲手机app 2

       及

           
 必赢亚洲手机app 3

       加性去噪后的结果为:

         
 必赢亚洲手机app 4

   其中:

             
  必赢亚洲手机app 5

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

     
 就是这样个简单的经过,能平滑图像但与此同时保障边缘基本不受影响,比如下图的结果:

 

必赢亚洲手机app 6

       

   
  这多少个优异的质量让其能在图像磨皮方面发挥一定的效用。

     
在来看望这些算法的频率怎样。由地方的总括公式可以见到,其利害攸关的总计量是部分均值以及均布均方差,均值的计量优化措施很多,典型的比如累计积分图。而至于均布均方差的优化,推荐咱们看这里:http://fiji.sc/Integral_Image_Filters,其基本的推翻公式为:

  

               
  必赢亚洲手机app 7

        which expands to

                   
 必赢亚洲手机app 8

                               
  必赢亚洲手机app 9

                               
  必赢亚洲手机app 10

                               
 必赢亚洲手机app 11

                               
 必赢亚洲手机app 12

                               
 必赢亚洲手机app 13

                               
 必赢亚洲手机app 14

                             
  必赢亚洲手机app 15

       Both sums can be generated from
two Integral Images
over 必赢亚洲手机app 16 and 必赢亚洲手机app 17 respectively.

      
经过这样的演绎,可以看来一些均方差也得以透过累计积分图快速实现,那样的结果是先后的频率和有些的半径参数无关,由此,成效特别高。

     
 我个人在这些的底子上,从编码角度更是进展了优化,对于一幅30W(500*600)像素的彩色图像处理时间约为20ms(I3的台式机CPU)。

 

     
 上述公式是针对性灰度图像举行的,对于广大的RGB彩色图,只要对R/G/B三坦途分别展开处理就OK了。

 

     
 有了上述基础,经过个人的追寻,对于磨皮应用,这么些算法的两个参数(1)半径可取:max(Src->Width,
Src->Height) * 0.02, 用户输入的σ可取10 + DenoiseLevel *必赢亚洲手机app,
DenoiseLevel * 5,其中DenoiseLevel
为磨皮的档次参数,范围从1到10,越大磨皮越厉害。

        

     
 正如我在作品《 一种具有细节保留效能的磨皮算法 》中指出的同样,磨皮算法需要考虑眼睛头发等非肤色部位不被过度处理,一种简易的处理模式就是用非常简短的颜色判断来决定是每个像素点是否为急需处理的地方,比如自己在其实的拍卖中就概括用了之类的方法:

           

     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;            
        }
    }                                                               //    以上处理得到的是硬边界,直接使用会到底结果图有较为明显的痕迹,因此可使用模糊平滑下

   
 为了让识其余区域边界不是特意生硬,需要对分辨区域展开自然的拍卖,一般就是用羽化算法,标准的物化算法是高斯模糊,可是高斯模糊有浮点总结,一种替代格局就是用方框模糊来代替,实际上三种模式得到的结果在视觉上是没有太多的区分的,可是方框模糊只有整数运算,效能上会高很多。

   
 这样的辨识处理后,把拍卖后图和原图举办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值
            }
        }

   
 在处理到位后,从视觉角度考虑,全体图如故有点模糊,这么些时候应该举办了恰当的锐化来加强图像的共同体锐度,最合适的是USM锐化,但是USM锐化是按照高斯模糊的,因而又分外耗时,这些时候可以设想用最简答的领域锐化格局来处理,比如凭借上面的卷积矩阵,就能取得正确的视觉效果。

        -1   0    -1 

        0     8    0      /     4 

       -1     0    -1

   
 考虑到这么些算法对各种像素的亮度值的更动并不是很大,对于彩色图像,假使可以转移到其他的带有亮度分量的颜料空间后,只对亮度举办拍卖,然后在转换回来,应该对视觉的震慑不大,这样去除颜色空间的更换时间,可以提升三倍的快慢,是非凡可观的,常见的涵盖亮度的水彩空间有LAB,HSV,YUV,YCbCr等,其中YCbCr和RGB的转移公式十分简单,没有浮点总括,对全部的功能影响不大,因而得以选取这些空间。

   
再者,经过试验,发现也足以把锐化操作放在对亮度处理这步,而不是身处最终,这样,锐化操作也只需要处理一个分量,同样能提升功能。

    贴出我处理的函数的流程:

/// <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;
}

   第五步的美白处理假设放在对亮度分量的处理过程中,图像全部会怀有偏色,似乎有一种肤色红润的法力,但是对部分图像会倍感颜色不自然。

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

序号

函数名

用时(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

 

 

 

 

       

      

 

 

       

 

 

 

 

 

 

     

 

    各类功用比较如下:

必赢亚洲手机app 18 
      必赢亚洲手机app 19

                                         
      原图                                
                                    磨皮后的图

必赢亚洲手机app 20 
      必赢亚洲手机app 21

                                 
删除第三步后的图                                                        
                                                     
 删除第六第七步后的图

 

  这多少个算法最大的优点是整个过程的其他函数都未曾浮点总括,这对于一些硬件来说是很重大的,可是一个瑕疵是优化后的算法不可以相互,在自我的I3台式机电脑上30W的像素处理时间20ms,完全能兑现实时效果。

   
 有趣味的恋人可按照本人的叙述自己实现,测试程序: 急迅磨皮

     可调参数如下界面所示:

必赢亚洲手机app 22

 

必赢亚洲手机app 23

 

 

****************************笔者:
laviewpbt   时间: 2015.7.27    联系QQ:  33184777
转载请保留本行信息**********************

 

相关文章

No Comments, Be The First!
近期评论
    功能
    网站地图xml地图