51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

表面模糊原理与 python 实现

常规的模糊算法如高斯模糊等会模糊图像边缘,很多场景中我们需要保留图像纹理并模糊一些细节,这就可以使用PS中的表面模糊。

表面模糊 {#表面模糊}

  • 表面模糊有两个参数,半径Radius和阈值Threshold。 如果我们知道了以某点为中心,半径为Radius范围内的直方图数据Hist,以及该点的像素值,那根据原始的算法,其计算公式为:

$$
x = \frac { \sum _ { i = 1 } ^ { ( 2 r + 1 ) ^ { 2 } } [ ( 1 - \frac { | x _ { i } - x _ { 1 } | } { 2.5 Y } ) x _ { i } ] } { \sum _ { i = 1 } ^ { ( 2 r + 1 ) ^ { 2 } } ( 1 - \frac { | x _ { i } - x _ { 1 } | } { 2.5 Y } ) }
$$

其中:$r $为半径,$Y$为阈值, $x_1$为当前像素阶值,$x_i$为模板中某个像素值,$x$为当前像素结果阶值

  • 主要思想还是计算当前像素$X$的邻域范围内不同像素的加权求和,与 $x_1$ 像素值接近的点权重比较大,反之权重较小,以此来保留边缘信息,平滑平坦区域;
  • python 代码:

参考了网络流行的Python版本,做了一点点优化和修正

使用了numba cpu加速,可以提速10倍,但还是没有c++快

  • numba CUDA 加速代码:

调用: 相比于 cpu 加速运算可以有百倍以上的速度提升

参考资料 {#参考资料}



文章链接:
https://www.zywvvd.com/notes/study/image-processing/surface-blur/surface-blur/

赞(0)
未经允许不得转载:工具盒子 » 表面模糊原理与 python 实现