图像柔光效果(SoftGlow)的原理及其实现。
图像柔光效果在很多商业软件中都有实现,比如美图秀秀,光影魔术手等。其能针对原始图像产生一副新的比较平滑感觉光线比较柔和的效果,给人一种朦胧美,如下面几幅图所示:
目前,关于该算法的可控参数,美图秀秀只提供了一个程度(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 转载请保留本行信息*************************
图像柔光效果(SoftGlow)的原理及其实现。的更多相关文章
- 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果(速度可实时)
最新的效果见 :http://video.sina.com.cn/v/b/124538950-1254492273.html 可处理视频的示例:视频去雾效果 在图像去雾这个领域,几乎没有人不知道< ...
- paper 105: 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果及其他
在图像去雾这个领域,几乎没有人不知道<Single Image Haze Removal Using Dark Channel Prior>这篇文章,该文是2009年CVPR最佳论文.作者 ...
- 【温故而知新-Javascript】图片效果(图像震动效果、闪烁效果、自动切换图像)
1.当鼠标指针经过图像时图像震动效果 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...
- Android平台中的三种翻页效果机器实现原理
本文给开发者集中展现了Android平台中的三种翻页效果机器实现原理,希望能够对开发者有实际的帮助价值! 第一种翻页效果如下: 实现原理: 当前手指触摸点为a,则 a点坐标为(ax,ay), ...
- Win8 Metro(C#)数字图像处理--2.44图像油画效果算法
原文:Win8 Metro(C#)数字图像处理--2.44图像油画效果算法 [函数名称] 图像油画效果 OilpaintingProcess(WriteableBitmap src ...
- Win8 Metro(C#)数字图像处理--2.43图像马赛克效果算法
原文:Win8 Metro(C#)数字图像处理--2.43图像马赛克效果算法 [函数名称] 图像马赛克效果 MosaicProcess(WriteableBitmap src, i ...
- Win8Metro(C#)数字图像处理--2.15图像霓虹效果
原文:Win8Metro(C#)数字图像处理--2.15图像霓虹效果 [函数名称] 图像霓虹效果函数NeonProcess(WriteableBitmap src) 上述公式进行开方即可. [函 ...
- Win8Metro(C#)数字图像处理--2.17图像木刻效果
原文:Win8Metro(C#)数字图像处理--2.17图像木刻效果 [函数名称] 图像木刻效果函数WoodCutProcess(WriteableBitmap src) [函数代码] ///& ...
- 四种比较简单的图像显著性区域特征提取方法原理及实现-----> AC/HC/LC/FT。
laviewpbt 2014.8.4 编辑 Email:laviewpbt@sina.com QQ:33184777 最近闲来蛋痛,看了一些显著性检测的文章,只是简单的看看,并没有深入的研究,以 ...
随机推荐
- HTML5模仿逼真地球自转
查看效果:http://hovertree.com/texiao/html5/8.htm 给我一个支点,我就可以撬动地球 阿基米德 下载 http://hovertree.com/down/h/ear ...
- C# Socket异步聊天例子
最近在配合游戏服务器端搞一个客户端通信,客户端是unity搞的,理所当然就高C#了,上手之前先看了一下C# Socket通信这一块,基本不考虑同步方式,而异步方式,微软也提供了两套API,一套是Beg ...
- ubuntu入门
Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音.了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:) 大多数的美国人读 ubun ...
- Andriod小项目——在线音乐播放器
转载自: http://blog.csdn.net/sunkes/article/details/51189189 Andriod小项目——在线音乐播放器 Android在线音乐播放器 从大一开始就已 ...
- python中global 和 nonlocal 的作用域
python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 . 一 global global关键字用来在函数或其他局部作用域 ...
- 为input输入框添加圆角并去除阴影
<input type="text" name="bianhao" value="" placeholder="请输入商品编 ...
- SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>
此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblo ...
- 15、ASP.NET MVC入门到精通——MVC-路由
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 Routing(路由) – URL url 作为广泛使用的Web用户接口,需要被重视 好的Url应该满足如下条件: URL应为获取某种资源提 ...
- CSS3D效果
效果如本博客中右边呢个浅色框框,来自webpack首页(IE绕路0_0) github地址:http://wjf444128852.github.io/demo02/css3/css3d/ 思路: 1 ...
- 移动web之用CSS样式写如苹果手机的开关键
话说这个问题纠结了近一个小时,为什么呢?看看就知道了. 在公司的商旅Web移动版本项目上有这么一个交互,需要模仿iphone自带的开关,好吧,肯定没什么问题. Tip:请使用Chrome查看以下案例 ...