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

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

微信:

支付宝:

最新文章

  1. 通过WMI接口监控服务器性能
  2. machine leanring 笔记 vectorization
  3. MPLS基础
  4. 怎么修改git提交过的内容
  5. python网络编程socket /socketserver
  6. composer未升级报错
  7. SVN学习
  8. PHPExcel导出excel文件
  9. WdatePicker 控制选择范围
  10. 摘录 javescript 常用函数
  11. Sharepoint 2013 启用搜做服务
  12. EEPlat的元数据驱动的运行引擎
  13. Install a Redmine on Ubuntu system
  14. vue 前端框架 (二) 表格增加搜索
  15. Python中DataFrame去重
  16. Three.js开发指南---使用高级几何体和二元操作(第六章)
  17. ubuntu16.04下安装pcl点云库
  18. Js、JQuery脚本兼容
  19. spring mvc: 密码框
  20. java socket发送xml报文

热门文章

  1. Android 防内存泄露handler
  2. OR1200中指令Cache的结构
  3. Codeforces 29D Ant on the Tree 树的遍历 dfs序
  4. 在Azure Container Service创建Kubernetes(k8s)群集运行ASP.NET Core跨平台应用程序
  5. Java中进制的转换函数
  6. idea 安装热部署插件
  7. vue双向绑定的原理及实现双向绑定MVVM源码分析
  8. Pycharm配置(二)
  9. LR接口压力测试实战(限量抢红包接口)
  10. oracle初级(续)