图像美容之眼睛放大算法。

  目前,手机上各种图像特效的软件应用App越来越盛行,比较有名如美图秀秀,camare360,美颜相机等,还有一些在某些特定的方向做的比较的优秀的如魔漫相机等。这些软件几乎无一例外的都提供了相当数量的针对人脸进行美化的功能,正是这些最基础的功能吸热了很多热血美女丑女中女的兴趣。以至于几乎我所认识的每个25-35之间的女性朋友都知道美图秀秀,而了解Photoshop的则微乎其微。不过最近听一些朋友谈到,认为手机上的图像软件已经过了开发的鼎盛期,也不晓得到底是不是这样。

作为人脸中最有神的部位眼睛,自然是各软件开发商不会错过的美化对象,拿运行速度极差的可牛影像为例,他至少提供了眼睛放大、去红眼、祛黑眼圈、眼睛变色、加眼影等众多和眼睛有关的美容刀。其实这些,在程序开发者开来不过一些美妙的代码发言后绽放多多鲜花,可确是众多人为之用之美容的神器。

但是,这些简单的功能,送之于百度或这个google搜索相关算法,能找到想匹配的信息量真的不多,最起码我没找到可以直接用之于实践的东西。

本文就共享一些我关于眼睛缩放这个问题的一些研究成果,这些研究是3年前进行的。

正规的来说,眼睛缩放属于图像的一种局部扭曲,关于扭曲,Photoshop中的液化滤镜最能体现这类算法的灵魂。眼睛缩放完全可以用其中的一种方式来实现,如下图所示:

    (为节省篇幅,旋转了下)

使用该膨胀工具,选择合适的参数能得到非常理想的效果,但是如果仅仅为了这个功能区研究庞大的液化滤镜的算法,是极其需要勇气的精力的。虽然目前在开源内的软件中可以从GIMP的Iwarp代码或者paint.net的一个smudgle插件通过反编译的方式得到代码参考学习,但是这个过程是比较痛苦的,因为我因为痛苦过一次了,这里分享一个简单的方式去实现他,就减轻大家的痛苦了吧。

在手动的眼睛缩放过程中,一般有三个参数:中心点、画笔大小、力度,我们分别用(PointX,PointY),Radius,Strength表示。比如美图提供了如下的用户界面:

  中心点是用户通过鼠标单击获得的,画笔的大小决定了算法所影响到的范围。力度影响眼睛放大的程度。

  我的算法是通过如下图所示的简单过程实现的。

  对于画笔半径以内的任一位置像素(X,Y),按照其所在的位置和半径之间的比值,根据强度的设定值按照某个线性的公式,从经过点(PointX,PointY)和(X,Y)的直线中选择一个位置像素作为新的像素值,如果这个新的位置位于两点之间(图中X1,Y1),则出现眼睛缩小的效果,而位于直线的延长线上(图中的X2,Y2),则会有眼睛放大的效果,用一段简单的代码表示就是:

    Left = IIf(PointX - Radius < 0, 0, PointX - Radius)                     ‘  计算边界值
    Top = IIf(PointY - Radius < 0, 0, PointY - Radius)
    Right = IIf(PointX + Radius >= m_Width, m_Width - 1, PointX + Radius)
    Bottom = IIf(PointY + Radius >= m_Height, m_Height - 1, PointY + Radius)
    PowRadius = Radius * Radius

    For Y = Top To Bottom
        OffSetY = Y - PointY
        For X = Left To Right
            OffsetX = X - PointX
            XY = OffsetX * OffsetX + OffSetY * OffSetY                      ‘   距离的平方
            If XY <= PowRadius Then                                         ‘   在指定的半径内
                ScaleFactor = 1 - XY / PowRadius
                ScaleFactor = 1 - Strength / 100 * ScaleFactor              ‘   按照这种关系计算取样点的位置
                PosX = OffsetX * ScaleFactor + PointX
                PosY = OffSetY * ScaleFactor + PointY
                If PosX < 0 Then                                            ‘   放置越界
                    PosX = 0
                ElseIf PosX >= m_Width Then
                    PosX = m_Width - 1
                End If
                If PosY < 0 Then
                    PosY = 0
                ElseIf PosY >= m_Height Then
                    PosY = m_Height - 1
                End If
                Speed = Y * m_Stride + X * 3
                Index = PosY * m_Stride + PosX * 3
                ImageData(Speed) = ImageDataB(Index)                        ‘将当前点的值赋值为取样点的值
                ImageData(Speed + 1) = ImageDataB(Index + 1)
                ImageData(Speed + 2) = ImageDataB(Index + 2)
            End If
        Next
    Next

  我没有提供的完整的代码,是因为真正懂的人只要从只言片语就能搞清楚,而那些伸手党在我这里是不收欢迎的。

  上述代码有很多可以改进的地方,第一,上述出现的结果会有些不清晰,只是 由于计算的取样的坐标实际上是浮点数,因此直接取整会带来较大的误差,较为合理的做法是利用双线性插值之类的插值算法进行计算优化。第二:线性映射的计算公式也可以做调整,比如调整成那种离眼珠越进的那些像素的变化越小,而越远的变换越大等。

效果如下图:

    

                   

按照上述细路写了个测试程序:http://files.cnblogs.com/Imageshop/ZoomEyes.rar

****************************基本上我不提供源代码,但是我会尽量用文字把对应的算法描述清楚或提供参考文档************************

*************************************因为靠自己的努力和实践写出来的效果才真正是自己的东西,人一定要靠自己*******************

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

图像美容之眼睛放大算法。

时间: 2024-11-07 23:28:39

图像美容之眼睛放大算法。的相关文章

图像放大算法

http://www.cnblogs.com/celerychen/archive/2010/11/25/3588222.html 一. 图像放大算法 图像放大有许多算法,其关键在于对未知像素使用何种插值方式.以下我们将具体分析几种常见的算法,然后从放大后的图像是否存在色彩失真,图像的细节是否得到较好的保存,放大过程所需时间是否分配合理等多方面来比较它们的优劣. 当把一个小图像放大的时候,比如放大400%,我们可以首先依据原来的相邻4个像素点的色彩值,按照放大倍数找到新的ABCD像素点的位置并进

十三种基于直方图的图像全局二值化算法原理、实现、代码及效果(转)

十三种基于直方图的图像全局二值化算法原理.实现.代码及效果(转) http://www.cnblogs.com/carekee/articles/3643394.html 图像二值化的目的是最大限度的将图象中感兴趣的部分保留下来,在很多情况下,也是进行图像分析.特征提取与模式识别之前的必要的图像预处理过程.这个看似简单的问题,在过去的四十年里受到国内外学者的广泛关注,产生了数以百计的阈值选取方法,但如同其他图像分割算法一样,没有一个现有方法对各种各样的图像都能得到令人满意的结果. 在这些庞大的分

图像全参考客观评价算法比较

Lin Zhang等人在论文<A COMPREHENSIVEEVALUATION OF FULL REFERENCE IMAGE QUALITY ASSESSMENT ALGORITHMS>中,比较了几种全参考图像质量评价算法,在此记录一下他们的结果. 下表所示是他们所用的图像库,包含了:TID2008database,CSIQ database,LIVEdatabase,IVCdatabase,Toyama-MICTdatabase,Cornell A57 database,以及 Wirel

图像特征提取:SIFT定位算法关键步骤的说明

1. SIFT算法中一些符号的说明 $I(x,y)$表示原图像. $G(x,y,\sigma)$表示高斯滤波器,其中$G(x,y,\sigma) = \frac{1}{2\pi\sigma^2}exp(-(x^2+y^2)/2\sigma^2)$. $L(x,y,\sigma)$表示由一个高斯滤波器与原图像卷积而生成的图像,即$L(x,y,\sigma) = G(x,y,\sigma)\otimes I(x,y)$.一系列的$\sigma_i$,则可以生成一系列的$L(x,y,\sigma_i)

图像滤镜艺术---ZPhotoEngine超级算法库

一直以来,都有个想法,想要做一个属于自己的图像算法库,这个想法,在经过了几个月的努力之后,终于诞生了,这就是ZPhotoEngine算法库. 这个算法库目前包含两个模块:基础图像算法模块+滤镜模块,使用C语言实现,现在免费分享给大家,可以适用于PC/Android/Ios三大平台. 1,基础图像算法模块 这个模块,本人以Photoshop基础算法为原形,模拟出了PS大部分的基础算法. 为什么选择Photoshop算法?这个也是我的算法库一个优势,目前开源算法库多如牦牛,但是,能和PS媲美的,少之

自定义控件实现图像的显示和放大缩小,平移,右击菜单选择“自适应窗口”“保存图像”

前面介绍了2个控件组合在一起实现,对PictureBox控件的操作,今天我们自己新建一个控件来自己用. 新建一个Windows窗体解决方案,添加“用户控件”,把PictureBox控件拖到指定的区域,给我们要自己定义的控件改下名字UserControl_Display 界面就完成了,现在我们要自定义的控件添加事件和右击菜单(contextMenuStrip1)控件 1 using System; 2 using System.Collections.Generic; 3 using System

关于图像高速缩放算法,目前看到的最好的最清晰的一篇文章

http://www.myexception.cn/image/1630385.html 关于图像快速缩放算法,目前看到的最好的最清晰的一篇文章 昨天开始写一个录制屏幕和声音存储为视频文件的程序,差不多完成了. 屏幕录制使用方法:抓屏(方法很多,BitBlt.DirectX.MirrorDriver等),缩放,X264压缩(开源的,自己封装) 声音录制使用方法:声卡采集PCM数据,AAC压缩(开源的,自己封装) 最后打包复用为MP4文件,可以使用ffmpeg或者mp4v2等. 经过断断续续一天的

Photozoom图像放大的技术一二事

平行空间下,未知的可能不仅仅是这个世界,还可能是前所未有的未知的探索.那么对于微小型世界来说,我们就需要借助技术的支撑来发现.photozoom就好比是“电子的放大镜”,对我们清晰图像的放大起到了重要作用. 看过<蚁人>系列电影的朋友都知道,不论是多么微观的渺小世界,我们只要拥有一颗赤诚探索的心,自然也可以发现它的奇妙.因此,photozoom就是在探索微观世界道路上的一款放大神器,活脱脱的一个“电子放大镜”.那么自然也少不了高配的技术加持. 不同的图像需要不同的处理方式.S-Spline M

图像放大子程序

本程序实现图像横纵坐标个放大二倍的经典代码: 实现1个原像素和4个放大图像像素直接对应的巧妙实现. function A=blow(B) %%像素放大的完整子程序,其实第三维是完全meiyou必要的 [n,m,c]=size(B); %%第三维为1 n=2*n;m=2*m; A=zeros(n,m,c); %%长宽各放大2倍 A(1:2:n,1:2:m,:)=B; %%原始像素的的一个点与放大像素的四个点相对应,相当于直接放大图像的实现 A(1:2:n,2:2:m,:)=B; A(2:2:n,1