文档章节

图像柔光效果(SoftGlow)的原理及其实现。

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:40
字数 1183
阅读 6
收藏 0
点赞 0
评论 0

  图像柔光效果在很多商业软件中都有实现,比如美图秀秀,光影魔术手等。其能针对原始图像产生一副新的比较平滑感觉光线比较柔和的效果,给人一种朦胧美,如下面几幅图所示:

                                    

      目前,关于该算法的可控参数,美图秀秀只提供了一个程度(0-100%)控制量,其算法调节的效果和幅度都较小,光影魔术手有柔化程度和高光柔化两个参数,其中柔化程度控制柔化的朦胧效果,高光柔化调节图像的亮度。 还有一些开源的软件如Imagestone、paint.net、gimp也有softglow算法,他们都提供了3个控制量:半径、亮度、对比度(锐度),其中Imagestone其实是翻译的gimp的算法,而GIMP和paint.net的算法在基本原理上是一样的,细节上有所区别而已。

     我们以paint.net的实现过程为例进行说明,在paint.net的源代码中,GlowEffect.cs为实现该效果的文件,我抽取其部分源代码简要说明下这个算法的过程。

public GlowEffect()  : base(StaticName, StaticImage, null, EffectDirectives.None, true)
        {
            this.blurEffect = new BlurEffect();
            this.bcAdjustment = new BrightnessAndContrastAdjustment();
            this.screenBlendOp = new UserBlendOps.ScreenBlendOp();
        }

     以及代码片段:

public override unsafe void Render(
            EffectConfigToken parameters, 
            RenderArgs dstArgs, 
            RenderArgs srcArgs, 
            System.Drawing.Rectangle[] rois, 
            int startIndex, 
            int length)
        {
            // First we blur the source, and write the result to the destination surface
            // Then we apply Brightness/Contrast with the input as the dst, and the output as the dst
            // Third, we apply the Screen blend operation so that dst = dst OVER src

            ThreeAmountsConfigToken token = (ThreeAmountsConfigToken)parameters;

            AmountEffectConfigToken blurToken = new AmountEffectConfigToken(token.Amount1);
            this.blurEffect.Render(blurToken, dstArgs, srcArgs, rois, startIndex, length);

            BrightnessAndContrastAdjustmentConfigToken bcToken = new BrightnessAndContrastAdjustmentConfigToken(token.Amount2, token.Amount3);
            this.bcAdjustment.Render(bcToken, dstArgs, dstArgs, rois, startIndex, length);

            for (int i = startIndex; i < startIndex + length; ++i)
            {
                Rectangle roi = rois[i];

                for (int y = roi.Top; y < roi.Bottom; ++y)
                {
                    ColorBgra* dstPtr = dstArgs.Surface.GetPointAddressUnchecked(roi.Left, y);
                    ColorBgra* srcPtr = srcArgs.Surface.GetPointAddressUnchecked(roi.Left, y);

                    screenBlendOp.Apply(dstPtr, srcPtr, dstPtr, roi.Width);
                }
            }
        }

    由以上代码初步得出结论:他们是以高斯模糊以及亮度对比度调节两个滤镜为基础,稍作混合即可。

      第一步:备份原始图像;

      第二步:对原始图像按指定的半径进行高斯模糊;

      第三步:对模糊后的图像继续进行亮度和对比度的调整;

      第四步:用原始图像的备份数据通原始图像(经过上述二及三处理后的图像)按照Photoshop的滤色(Screen)方式进行混合。

      关于滤色方式的混合算法这里简单的提一下:  Blend = X + Y - X * Y / 255 ;  其中X和Y分别表示基色和混合色,Blend表示结果色。

      算法的源码可以参考我在上面说的几个开源的软件,当然这可能需要你有一定的编程基础,毕竟那些软件的框架都比较复杂。 

      关于算法的执行速度可以说只取决于第二步,因为亮度对比度的调节实际上是个查表的过程(PS的亮度对比度指令其实要比大家想象的复杂点的,这个有机会再谈,也可以参考阿发伯的博文http://blog.csdn.net/maozefa/article/details/4778934),而第四步其实也是可以用查表的方式来加速的(不过一定要用一位的方式)。高斯模糊这个老生长谈的问题,在我所搜索过的网页中是没有谁给出过一个完整的、完美的、执行速度和指定半径无关的、可运行的VB或VC或JAVA程序源代码(一般都是给出参考文章介绍)。我自己有这个方面的代码,不过我也不愿意共享。真正有兴趣的我推荐你去找GIMP的算法代码,在GIMP的整个源码系统,至少给出了三种高斯模糊优化的代码,分别位于blur-gauss.c(给出了2种:RLE及IIR优化代码)以及contrast-retinex.c中(代码特别简洁),当然,那些代码如果提取出来还应该进行代码层面的整理和优化。Paint.net也提供了高斯模糊函数,不过期实质并不是高斯模糊,而是一种用线性分布的权重函数代替恒值权重,不过那个算法里面没有浮点运算,并且还存在比Paint.net里的代码快很多即执行时间于半径无关的优化算法,而且该优化算法比任何真正的高斯模糊优化算法要快1倍多,而效果上区别不大,可作为实时性特别强的场合的备用算法。

    同样,提供个编译好的文件给有兴趣研究该算法的朋友看看效果:

    http://files.cnblogs.com/Imageshop/SoftGlow.rar

    

 

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

 

本文转载自:http://www.cnblogs.com/Imageshop/p/3145216.html

共有 人打赏支持
abcijkxyz
粉丝 60
博文 6195
码字总数 1876
作品 0
深圳
项目经理
15种CSS混合模式让图片产生令人惊艳的效果

如果你曾经广泛地使用过图片编辑应用软件(例如,Adobe Photoshop,Pixelmator,GIMP等),那么你可能对混合模式比较熟悉。如同名称中所暗示的,混合模式是指将上层的图像融入下层图像时采用...

欲思 ⋅ 2014/07/11 ⋅ 1

PS的混合模式

如果你要经常使用Photoshop,那么你需要了解Photoshop一个简单却不容易理解的特性——混合模式。在Photoshop众多酷炫功能中,这是个很容易被人忽略的功能,但是看完这篇文章之后,希望会引起...

NiceBlueChai ⋅ 02/18 ⋅ 0

iOS开发CoreGraphics核心图形框架之七——图像处理

iOS开发CoreGraphics核心图形框架之七——图像处理 一、引言 位图图像数据实际上一个像素阵列,其中每个像素代表了图像中的一个点。位图实际上只支持矩形区域的渲染,但是使用透明技术可以实...

珲少 ⋅ 2016/11/28 ⋅ 0

基于SVD实现PCA的图像识别

本文实现基于SVD奇异矩阵分解的PCA主成分分析,使用该算法来完成对人脸图像的识别,主要讲解SVD实现PCA的原理,如何利用SVD实现图像特征的降维,以及SVD在文本聚类方面的使用,例如弱化同义词...

初雪之音 ⋅ 2015/10/04 ⋅ 0

【UnityShader】字符画风格屏幕后处理

原理 在UnityShader中实现字符画,实际工作就是把原图像分成矩阵块,分析每个每个块内的图像,并替换为字符。 图像的分析方法最简单的就是灰度值,在字符密度较大时能以很简单的方式达到效果...

qq_37043683 ⋅ 04/23 ⋅ 0

Canny边缘检测算法原理及其VC实现详解(一)

图象的边缘是指图象局部区域亮度变化显著的部分,该区域的灰度剖面一般可以看作是一个阶跃,既从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的灰度值。图象的边缘部分集中了图...

hejunbinlan ⋅ 2015/09/08 ⋅ 0

高阶自定义View --- 粒子变幻、隧道散列、组合文字

高阶自定义View --- 粒子变幻、隧道散列、组合文字 作者:林冠宏 / 指尖下的幽灵 掘金:juejin.im/user/587f0d… 博客:www.cnblogs.com/linguanh/ GitHub : github.com/af913337456… 联系...

林冠宏 ⋅ 2017/09/09 ⋅ 0

分析android动画模块[转]

作者: 刘鹏 日期: 2009-03-07 Android 平台提供了两类动画,一类是 Tween动画,即通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果;第二类是 Frame动画,即顺序播放事先做好...

kevin.gan ⋅ 2010/01/06 ⋅ 0

看大神用PS修复严重雀斑

看完这对比,我相信你再也不会相信网上糖水照的皮肤嫩得能掐水~ 一组对比图镇楼: PS前 PS后 想必大家都用惯了相机自带美图或者美图秀秀之类的上手就会的美图软件,虽然能把照片中的人物皮肤...

材大难为用 ⋅ 2017/08/10 ⋅ 0

自定义控件三部曲之绘图篇(十六)——给控件添加阴影效果与发光效果

前言:要么出击,要么出局,命运女神总会眷顾拼劲全力的一方 相关文章: 《Android自定义控件三部曲文章索引》:http://blog.csdn.net/harvic880925/article/details/50995268 这节我们将学到...

harvic880925 ⋅ 2016/07/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CENTOS7防火墙命令记录

安装Firewall命令: yum install firewalld firewalld-config Firewall开启常见端口命令: firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --zone=public --add-po......

cavion ⋅ 43分钟前 ⋅ 0

【C++】【STL】利用chromo来测量程序运行时间与日志时间打印精确到微秒

直接上代码吧,没啥好说的。头疼。 #include <iostream>#include <string>#include <ctime>#include <sstream>#include <iomanip>#include <thread>#include <chrono>using ......

muqiusangyang ⋅ 46分钟前 ⋅ 0

Mac环境下svn的使用

在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境。在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不过还需做一下简...

故久呵呵 ⋅ 56分钟前 ⋅ 0

破解公司回应苹果“USB限制模式”:已攻破

本周四,苹果发表声明称 iOS 中加入了一项名为“USB 限制模式”的功能,可以防止 iPhone 在连接其他设备的时候被破解,并且强调这一功能并不是针对 FBI 等执法部门,为的是保护用户数据安全。...

六库科技 ⋅ 58分钟前 ⋅ 0

MyBtais整合Spring Boot整合,TypeHandler对枚举类(enum)处理

概要 问题描述 我想用枚举类来表示用户当前状态,枚举类由 code 和 msg 组成,但我只想把 code 保存到数据库,查询处理,能知道用户当前状态,这应该怎么做呢?在 Spring 整合MyBatis 的时候...

Wenyi_Feng ⋅ 今天 ⋅ 0

synchronized与Lock的区别

# <center>王梦龙的读书笔记第一篇</center> ## <center>-synchronized与Lock的区别</centre> ###一、从使用场景来说 + synchronized 是能够注释代码块、类、方法但是它的加锁是和解锁使用一......

我不想加班 ⋅ 今天 ⋅ 0

VConsole的使用

手机端控制台打印输出,方便bug的排查。 首先需要引入vconsole.min.js 文件,然后在文件中创造实例。就能直接使用了。 var vConsole = new VConsole(); vConsole的文件地址...

大美琴 ⋅ 今天 ⋅ 0

Java NIO之字符集

1 字符集和编解码的概念 首先,解释一下什么是字符集。顾名思义,就是字符的集合。它的初衷是把现实世界的符号映射为计算机可以理解的字节。比如我创造一个字符集,叫做sex字符集,就包含两个...

士别三日 ⋅ 今天 ⋅ 0

Spring Bean基础

1、Bean之间引用 <!--如果Bean配置在同一个XML文件中,使用local引用--><ref bean="someBean"/><!--如果Bean配置在不同的XML文件中,使用ref引用--><ref local="someBean"/> 其实两种......

霍淇滨 ⋅ 今天 ⋅ 0

05、基于Consul+Upsync+Nginx实现动态负载均衡

1、Consul环境搭建 下载consul_0.7.5_linux_amd64.zip到/usr/local/src目录 cd /usr/local/srcwget https://releases.hashicorp.com/consul/0.7.5/consul_0.7.5_linux_amd64.zip 解压consu......

北岩 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部