bokeh百度百科的解释

摄影镜头光圈大小和拍摄距离决定了拍摄时的景深,相对于焦点位置,焦点前与焦点后的被拍摄物体会显得模糊,这个模糊区域被称为焦外。
焦外具体的模糊程度还受到镜头中镜片单体和组合的物理特性影响,形成了由镜头不同而得到的不同的焦点外的图像。于是焦外成像这个技术名词出现了。
优秀的焦外成像柔顺而迷人,色彩过渡自然,丝毫不逊色于焦点处的图像魅力。
最典型的例子,就是夜景拍摄中的远景模糊炫丽的灯光效果。

由于算法逻辑比较简单,就不多解释。

简单的说就是以半径圆圈内的各通道基于明度进行权重计算。

#ifndef ClampToByte
#define  ClampToByte(  v )  (((unsigned)int(v)) <(255) ? (v) : (v < 0) ? (0) : (255))
#endif

void bokeh(unsigned char *Input, unsigned char *Output, int Width, int Height, int Stride, int Radius)
{
    int Channels = Stride / Width;
    , sqrtf(Radius));
    ; y < Height; y++)
    {
        unsigned char * LinePD = Output + y*Stride;
        ; x < Width; x++)
        {
            unsigned ] = {  };
            unsigned ;
            , y - Radius); ny < min(y + Radius, Height); ny++)
            {
                const    unsigned char * sampleLine = Input + ny*Stride;

                , x - Radius); nx < min(x + Radius, Width); nx++)
                {
                    if (sqrtf(nx - x) + sqrtf(ny - y) < rsq)
                    {
                        const    unsigned char * sample = sampleLine + nx*Channels;
                        ];
                        ];
                        ];
                         * R +  * G +  * B) >> ));
                        ; c < Channels; c++)
                        {
                            sum[c] += weight*sample[c];
                        }
                        weightsum += weight;
                    }
                }
            }
            ; c < Channels; c++)
            {
                LinePD[c] = ClampToByte(sum[c] / weightsum);
            }
            LinePD += Channels;
        }
    }
}

这个算法以上述写法进行测试,速度极其的慢。

将这个算法的思想稍微变通一下,修改后1080P图片可达到cpu单线程实时处理。

具体优化思路,参照 图像纹理合成及纹理传输算法学习(附源码)。

源码中的函数GetLocalSquareSum。

初学者可参考 分享用于学习C++图像处理的代码示例 ,稍微改改就可以跑起来这个算法了。

这里就不贴优化后的代码了。

这个算法思路用逆反思路,则可以实现聚焦算法,算是一种特例化的反卷积算法。

一直很想把这个算法简单的写一下,写着写着又犯懒了。

明天与imageshop博主 碰个面,吃个饭,也是好久没折腾图像方面的东西了。

真怀念与imageshop博主搭档攻克图像算法的那些日子。

若有其他相关问题或者需求也可以邮件联系俺探讨。

邮箱地址是: 
gaozhihan@vip.qq.com

若此博文能帮到您,欢迎扫码小额赞助。

微信:

支付宝:

简易 bokeh 图像散景效果算法实现的更多相关文章

  1. webgl智慧楼宇发光效果算法系列之高斯模糊

    webgl智慧楼宇发光效果算法系列之高斯模糊 如果使用过PS之类的图像处理软件,相信对于模糊滤镜不会陌生,图像处理软件提供了众多的模糊算法.高斯模糊是其中的一种. 在我们的智慧楼宇的项目中,要求对楼宇 ...

  2. 封装bt轮播图淡入淡出效果样式

    <!--BT轮播图-->    <div data-ride="carousel" class="carousel slide carousel_inn ...

  3. JS、JQ实现焦点图轮播效果

    JS实现焦点图轮播效果 效果图: 代码如下,复制即可使用: (不过里面的图片路径需要自己改成自己的图片路径,否则是没有图片显示的哦) <!DOCTYPE html> <html> ...

  4. 图的最小生成树——Kruskal算法

    Kruskal算法 图的最小生成树的算法之一,运用并查集思想来求出最小生成树. 基本思路就是把所有边从小到大排序,依次遍历这些边.如果这条边所连接的两个点在一个连通块里,遍历下一条边,如果不在,就把这 ...

  5. 三分钟上手Highcharts简易甘特图

    根据业务需求,找到了这个很少使用的图形,话不多说,看看该如何使用.首先要引入支持文件:可根据链接下载. exporting.js:https://img.hcharts.cn/highcharts/m ...

  6. pixijs shader贴图扫光效果

    pixijs shader贴图扫光效果 直接贴代码 const app = new PIXI.Application({ transparent: true }); document.body.app ...

  7. 用最简单的代码写出banner图轮播效果

    以下视频是由[赵一鸣随笔]博客提供的“用最简单的代码写出banner图轮播效果”. 查看全屏高清视频,请点击链接:http://www.zymseo.com/58.html

  8. 图之强连通--Tarjan算法

    强连通分量 简介 在阅读下列内容之前,请务必了解图论基础部分. 强连通的定义是:有向图 G 强连通是指,G 中任意两个结点连通. 强连通分量(Strongly Connected Components ...

  9. Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

随机推荐

  1. netty开发教程(一)

    Netty介绍 Netty is an asynchronous event-driven network application framework  for rapid development o ...

  2. Codeforces548A:Mike and Fax

    While Mike was walking in the subway, all the stuff in his back-bag dropped on the ground. There wer ...

  3. 秦俊:开放 DevOps 敏捷开发套件,助力开发者驰骋云端

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ DevOps可以让人工智能(AI).大数据(Bigdata).云计算(Cloud)更加高效地落地,越来越多的企业和团队在践行DevOps. ...

  4. maven项目启动报:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener 错误解决方法-杜恩德

    如果你是maven项目,tomcat在发布项目的时候没有同时发布maven依赖所添加的jar包, 你需要设置一下eclipse: 项目 -> 属性 -> Deployment Assemb ...

  5. 【jQuery入门】(5)---jQuery CSS

    jQuery  CSS      1.jQuery 文档操作方法        1.addClass() 方法: addClass() 方法向被选元素添加一个或多个类.该方法不会移除已存在的 clas ...

  6. 【java】TreeSet、Comparable、Comparator、内部类、匿名类

    package com.tn.treeSet; public class Student { private String name; private int age; public Student( ...

  7. angularjs 字段排序 多字段排序

    我们用angularjs {{}},ng-model循环绑定数组或对象的内容的时候,有时候会用到排序,有时候可能会有多个字段排序 具体要用到过滤 数据的展现,可以通过ng-repeat实现.当网页解析 ...

  8. 当你的电脑出现stop: 0X0000007B

    这几天可算是把我折腾惨了.先是linux系统无法进入图形化桌面,几经折腾,我把linux删除重装.怎知道,我在瘟都死下删除linux的分区,结果我的两个瘟都死分区也没了,哭了我去恢复数据,但是然并卵. ...

  9. JDK动态代理[4]----ProxyGenerator生成代理类的字节码文件解析

    通过前面几篇的分析,我们知道代理类是通过Proxy类的ProxyClassFactory工厂生成的,这个工厂类会去调用ProxyGenerator类的generateProxyClass()方法来生成 ...

  10. PHP中引入文件的四种方式及区别

    文件加载语句:include,require,include_once,require_once include,require: require函数通常放在 PHP 程序的最前面,PHP 程序在执行 ...