L0 范数图像平滑(L0 Smooth) 的原理和 GPU 加速【CUDA】

网友投稿 581 2022-05-29

一、概述

二、核心算法(一维)

其中 p 和 p + 1 索引邻近的样本(或像素)。 是关于 p 的前向差分形式的梯度。# { } 是计数操作符,输出 p 的数量满足,即 L0 范数的梯度。 不依赖梯度大小,因此如果一条边只改变其对比度,则不会受其影响。这个离散计数函数是我们方法的核心。

表示结果中存在 k 个非零梯度,。在该目标函数的约束下,整体形状与原始形状保持一致,因为强度变化必须沿显著边缘出现,以尽可能减少总能量。显然,把边缘放在其他地方只会增加(目标函数的)成本。这种平滑效果明显不同于以往的边缘保持方法。k 越大,得到的近似值越小,但仍然是最显著的对比度。

作为直接控制 重要性的权重,实际上是一个平滑参数, 越大,边缘就越少。

三、推广到二维

在二维图像表示中,用 I 表示输入图像,用 S 表示计算结果。梯度 表示对于每个像素 p 计算其相邻像素之间在 x 和 y 方向上的差分。

梯度的度量表示为:

它计算了 p 的幅值  不为零的个数。

根据这个定义,S便可通过下式求解得到

在实际计算中,彩色图像的梯度大小|∂Sp |被定义为梯度大小在rgb三个通道的总和。

四、目标函数的求解

其伪代码如下:

L0 范数图像平滑(L0 Smooth) 的原理和 GPU 加速【CUDA】

五、具体应用场景

1)边缘的提升和提取(Edge Enhancement and Extraction)

2) 图像的抽象和铅笔画特效(Image Abstraction and Pencil Sketching)

3) 剪贴画瑕疵的修复(Clip-Art Compresion Artificat Removal)

4) 细节放大(Detail Magnification)

5)色调映射(Tone Mapping)

六、对比实验的结果

测试图片为 640*640 的下图:

基于原始的 OpenCV 的实现,执行时间为:

Github 上错误的 CUDA 实现(在 beta_max = 1e5 的条件下):

时间从 2167ms -> 400ms,性能提升了 5.4 倍 !【我的笔记本显卡是 GTX970M,古老的 maxwell 架构】

GPU 参数

以上是初步的实现,性能经过进一步优化之后,总耗时减少到 139.6ms(不包括从磁盘读取图片的时间和开辟内存的时间【多张图像可以重复利用】、 host <-> device 之间的拷贝时间、显示时间)

ps: 谢绝白嫖

GPU加速云服务器 机器学习

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:纳尼?MySQL 中 count(*) 比 count(1) 快?
下一篇:【MySQL】Explain字段的解释
相关文章