文档章节

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

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:40
字数 1183
阅读 10
收藏 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
粉丝 63
博文 6196
码字总数 1876
作品 0
深圳
项目经理
私信 提问
15种CSS混合模式让图片产生令人惊艳的效果

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

欲思
2014/07/11
8.3K
1
PS的混合模式

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

NiceBlueChai
02/18
0
0
iOS开发CoreGraphics核心图形框架之七——图像处理

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

珲少
2016/11/28
464
0
基于SVD实现PCA的图像识别

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

初雪之音
2015/10/04
1K
0
【UnityShader】字符画风格屏幕后处理

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

qq_37043683
04/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《大漠烟尘》读书笔记及读后感文章3700字

《大漠烟尘》读书笔记及读后感文章3700字: 在这个浮躁的社会里,你有多久没有好好读完一本书了? 我们总觉得自己和别人不一样,所以当看到别人身上的问题时,很少有“反求诸己”,反思自己。...

原创小博客
40分钟前
1
0
大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
48分钟前
1
0
十万个为什么之什么是resultful规范

起源 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点...

尾生
53分钟前
1
0
Terraform配置文件(Terraform configuration)

Terraform配置文件 翻译自Terraform Configuration Terraform用文本文件来描述设备、设置变量。这些文件被称为Terraform配置文件,以.tf结尾。这一部分将讲述Terraform配置文件的加载与格式。...

buddie
今天
2
0
exportfs命令, vsftp搭建ftp服务

exportfs命令 当修改/etc/exports文件后,更改的内容是不会立即生效的。如果重启nfs服务,会导致客户端重启期间的请求是挂起等待的,可以把客户端的挂载umount进行卸载后,再重启nfs服务,但...

野雪球
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部