Python实现在线批量美颜功能过程解析

结果

r(i, j, k, l) = exp( - \frac{||f(i, j) − f(k, l)||2}{2{\sigma2_r}} )
$$

另一个是计算空间距离的相似度(空域核),也就是说,离得越近,相似度越高,公式如下:

$$
d(i, j, k, l)=exp( - \frac{(i−k)^2 + (j−l)2}{2{\sigma2_d}})
$$

上面的逻辑还是很清晰,千万不要被一堆符号弄晕了。

这里 (i, j) 代表的是要处理的像素点的坐标点,而 (k,l) 则是要处理的范围内,可能影响到其值的像素点的坐标。

最终的权重系数 w(i,j,k,l) 取决于空域核和值域核的乘积,公式如下:

$$
w(i,j,k,l)=d(i,j,k,l) ∗ r(i,j,k,l) = exp( - \frac{(i−k)^2 + (j−l)2}{2{\sigma2_d}} - \frac{||f(i, j) − f(k, l)||2}{2{\sigma2_r}})
$$

下面是一个经典的双边滤波的原理示意图:

从这个图中可以看出,在图(b)空域核上,每个像素的权重是符合高斯分布的,而在图(c)的值域核上,由于像素取值相差过大,不同颜色的权重系数相差也很大,双边过滤过滤完成后,边缘两侧的像素点保留了原有的色彩值。

接下来还是看下双边滤波的原函数:

def bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)

  • src:原图
  • d:像素邻域的直径。如果这个值设为非正数,那么 OpenCV 会从第五个参数 sigmaSpace 来将它计算出来。
  • sigmaColor:颜色空间滤波器的 $\sigma$ 值。这个参数的值越大,就表明该像素邻域内有更宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
  • sigmaSpace:坐标空间中滤波器的 $\sigma$ 值,坐标空间的标注方差。他的数值越大,意味着越远的像素会相互影响,从而使更大的区域足够相似的颜色获取相同的颜色。当 d > 0 , d 指定了邻域大小且与 sigmaSpace 无关。否则, d 正比于 sigmaSpace 。使用过程中我发现这个值越大,图像的过渡效果越好。

源代码我就不放了,实际上只有那一行代码,不过希望看到本文的各位除了知道双边滤波能对图像进行美颜以外还是能稍微了解下原理。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持来客网。