高斯模糊算法的 C++ 实现

  • 时间:
  • 浏览:2
  • 来源:5分PK10APP下载_5分PK10APP官网

  图4. DEMO 系统进程运行的主窗口 UI

       参考自:博客中插入公式——之在线数学公式生成;

  图3. 算法(2)中一维模糊的后边结果

  【相关下载】:

  (2)Demo 全部源码(蕴含 GaussBlurFilter.hpp 和 可执行文件):GaussBlurDemo_Src.zip

  通过点击菜单 - 可视化 - 二维高斯模板不需要 在右侧的视图中生成1个灰度图片,即二维高斯模板的可视化结果。

  注:当有过后边的空间错综复杂度并是是不是绝对的,类事,不需要 通过对图像进行串行的切片处里,既可减小算法(2)的空间需求。

  [1]. 高斯模糊算法的实现和优化;

  深度1值不需要 为正不需要 能为负,但像素数据的地址 lpBits 都不需要 是所有像素中,地址值最小的那个像素的地址。即,假设图片左上角点的坐标为原点,机会图片深度1为正数(bottom - up),则 lpBits 是左下角像素 (col = 0,row = height - 1)的地址。机会图片深度1为负数(top-down),则 lpBits 是左上角像素(col = 0,row = 0) 的地址。图像数据的扫描行深度1不需要 以 4 Bytes 对齐,即通过下面的公式计算扫描行深度1:

  【参考资料】

  int r = ( int ) ( sigma * 3 + 0.5 );  // 全部模板的逻辑尺寸:( 2 * r + 1 ) * ( 2 * r + 1 );

  int stride = ( bmWidth * bpp + 31 ) / 32 * 4; //扫描行深度1,对齐到 4 Bytes

  起初我是按照算法理论直接实现,即使用了二维高斯模板,结果发现处里时间很长,对1个图片竟然能达到大概数分钟之久。曾经肯定是不对的,很多很多我百度了一下,发现这一 问题图片应该采用分别进行两次一维高斯模糊就不需要 了[1],曾经算法的时间错综复杂度的1个系数,就从 O ( σ ^2 ) 降低到了 O ( σ )。曾经算法于是带宽提高到了毫秒级。下表给出分别用二维模糊的原始最好的措施,和两次一维模糊累加的最好的措施的算法成本比较:

  仅在这一 图片的例子中,我把我写的算法的处里结果,在 Photoshop 中打开和 Photoshop 自带的高斯模糊的处里结果做差值对比,发现两者是相同的。

  在系统进程运行界面的客户区下方有1个控制面板,不需要 取舍高斯模糊的算法参数,高斯半径的意义和 Photoshop 中的高斯模糊半径的意义相同,是是不是算法中的 σ。

[注] 文中的公式,采用如下网址生成:http://www.codecogs.com/latex/eqneditor.php

  

  bpp:图像的像素位深度1。只支持 8 (灰度索引图像),24,32 这多少值。对于 32 bpp 的图像来说,最后1个像素通道是表征像素的不透明度,也很多很多我 alpha,对于 alpha 何如参与到算法中,我我然后了下,有多种处里最好的措施,但都好像这样 什么容易理解的物理意义,很多很多在代码里我忽略了 alpha 通道。

  图1. 正态分布的贡献比

  对算法的使用最好的措施:

  在 C++ 系统进程运行中,使用我写的这一 算法是非常简单的,类事:

  

  在实现算法时,我也尝试了对 255 个灰度值 * 模板数据的结果进行缓存和查表处里,有过后发现不需要 了有效提高带宽,很多很多最终我放弃了这一 最好的措施。这机会是机会,算法的计算很多很多我1个浮点乘法,对数据的读取动作,不须能做到比浮点乘法快一点 。很多很多这里采用缓存也就显得这样 必要了。

  (上式为编程语言表达,非数学表达,即利用了整数除法对小数偏离 的截断性。)

  在那篇文章中,主要讲解了高斯模糊中的半径的含义,是二维正态分布的方差的平方根,有过后给出了算法的理论描述。现在我又打算把该算法用 c++ 实现出来,于是有了下面的这一 DEMO。

  http://zh.wikipedia.org/wiki/File:Standard_deviation_diagram.svg。

  算法参数中:

  不需要 注意的是,在多系统进程运行处里中,我使用了 Windows API (类事 CreateThread)等,这使得 GaussBlurFilter.hpp 目前不需要 了用在 Windows 平台,机会要在许多平台使用,应当修改和多系统进程运行有关的 API 函数调用。

  

  采用算法(2),要完成高斯模糊,对图片分别进行1个方向的一维高斯模糊即可。类事,先对图片进行水平方向的模糊,得到后边结果,有过后再对这一 后边结果进行垂直方向的模糊,即得到最终结果。下图是1个演示图,给出了原图在1个方向上分别单独进行一维高斯模糊的结果,以及最终的结果:

  此图来自参考资料 [1],根据资料文中叙述,此图实际来源于(Maybe blocked by the GFW)

  从图 1 中不需要 看多,在 3σ 以外的贡献比例非常小,为 0.1 %,有过后亲们 截断模板时,对模板边界定义为 3σ ;

  二维高斯模板的计算公式是:

  

  在本 DEMO 中,滤镜处里是装入 UI 系统进程运行中进行的,这使得在滤镜处里时间较长时(类事高斯半径取值很大,图片也很大),界面会许多卡,不需要 把滤镜处里动作装入 1个新建的后台系统进程运行中执行。这是比较容易实现的。

  其中:σ :方差平方根(Photoshop 中的高斯模糊半径);n = w * h (图片的像素数量)。具体时间和图片大小和高斯半径的大小有关,1个粗略的大概情况汇报为,算法(1)的耗时为分钟级,算法(2)的耗时为毫秒到秒级。可见算法(2)比算法(1)带宽快一点 ,但相比算法(1)来说算法(2)具有较高的空间需求。

  图 2 中,左侧是亲们 常见的 3 x 3 模板(σ ≈  0.849),围绕中心点的 3 x 3 的浮点数据为:

  (1)Demo 可执行文件(蕴含 GaussBlurFilter.hpp):GaussBlurDemo_Bin.zip

  

  图 2. 二维模板的可视化结果

  2008 年在1个 PS 讨论群里,有外国网友 不解 Photoshop 的高斯模糊中的半径是什么含义,有过后当时我写了这篇文章:

  三种生活算法在高斯半径为常数条件下,是是不是关于图片大小的线性算法,区别在于常数系数的大小不同,前者是高斯半径(模板尺寸)的平方级,后者是高斯半径(模板尺寸)的线性级别。这一 改进,非常类事于我此前有一篇博客中给出的,对两百公里画效果滤镜的算法改进,也是通过把常数系数,从模板尺寸的平方级别降低到线性级别,使算法带宽获得提高的。

  (2)浮点类型:支持 float 和 double。它是高斯模板的数据的类型,也是进行像素加权累加时的数据类型,根据我的观察,float 和 double 的带宽相差不大。基本相同。

  在理论上,高斯模板是无边界和无限扩展的1个二维曲面,在实现时,就不需要 对这一 曲面截断为有限大的二维模板。这样 在哪里截断呢?根据下图所示的一维正态分布贡献:

  对Photoshop高斯模糊滤镜的算法总结;

  下图给出了二维模板的可视化结果。采用的可视化最好的措施是,根据后边的公式和模板边界,生成二维高斯模板,有过后取1个缩放因子 f = 255 / 模板中心点的数据,以此缩放因子把模板数据等比缩放,有过后绘制成灰度图片,曾经中心点的亮度就被提高到最亮。可视化效果中,每个单元格对应着1个模板数据,单元格大小为 8 * 8 机会 16 * 16 像素。

  (1)支持多系统进程运行处里。根据我的观察,系统进程运行数设置为和 CPU 核心数相同是比较大概的。系统进程运行数比 CPU 核心数更多,也是这样 什么意义的,机会算法执行时,CPU 机会满负荷运转了。开启更多系统进程运行,很多很多我能再提高带宽了。

  假设 CPU 核数为 p,开启的多系统进程运行数量 >= p,则算法带宽大概为单系统进程运行处里的 p 倍。(当 CPU 满负荷时,系统进程运行数量取得更大,也这样 提高带宽的意义了)

  (3)高斯半径:即 σ。算法的常数系数为 O(σ)。很显然,σ 的值取得越大,算法耗时机会越长。在 DEMO 中,其允许范围和 Photoshop 的要求一致,是 [0.1, 2200]。

  我实现的 DEMO 系统进程运行(Windows 平台)的界面如下所示:

  注:此处的 CPU 核心数应该为 CPU 的物理核心数,而非模拟出来的多核数目。

猜你喜欢

2018上半年有事业单位招聘吗?有的话是什么时候?

扫描二维码下载可选中另三个 多或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问提。换一换你对你这些 回答的评价是?中公教育是一家全国性综合职业教育企

2020-03-22

架构之路:从管理者的角度看问题

只能 管理的本质是那些?那些才是你这个有效的管理?管理的精髓是那些?……你说歌词 你这个 制度好!对你当然好了,但manager心里苦啊。虽然任何有三个小制度就有利弊参半

2020-03-22

五个问题的简短回复【调试、求职疑虑、编程能力提高、做题】

【两根评论】(有读者按《CodeBlocks调试功能快捷教程》走,发现走不下去。核实,意识到可能性是Code::Blocks中的一还还有一个Bug。)初学C++,我敲教材上复杂

2020-03-22

微信小程序正式上线 下一波红利来临?

在张小龙看来,移动互联网的下一站是“唾手可得”。6.小系统线程切换:小系统线程支持挂起请况,即多窗口概念,用户可不并能把小系统线程先挂起,而且做别的事情,在需用你这名小系统线程

2020-03-22

游客vqwytl6gp2ayy的主页

flink运营若有阿里后边件(Aliware)官方账号周晓,阿里云数据库运营负责人文章:11丨粉丝:27626丨话题:2目前在阿里巴巴后边件技术部EDAS团队从事开发工作分布式

2020-03-21