数学与编程之加权平均与图片模糊——照骗技术的一大法宝

准备写几个把编程与数学联系在一起的文章。这是第一弹,将介绍图片模糊技术背后的数学知识。图片模糊是图片处理技术的一种。它的应用包括磨皮、焦外模糊等。基本是自拍爱好者坑人骗人的必备良器。

1

先来认识一下计算机如何表征一张图片。这里需要注明,因为计算机对存储在其中的图片使用了不同的压缩方法,所以我们这里只专注于位图(bitmap)这种类型。这是一种能够直接被电子设备呈现的格式。位图依据从左到右、从上到下的顺序存储图片的每一个像素。

位图对每一个像素的表示也有规定。例如RGB24,意思就是一个像素使用24bit存储,包含了红色、绿色、蓝色共3个分量,每一个分量占8bit,取值为0-255。这3个分量共同作用在一起可以表示自然颜色中量化后的某个值。为了简单起见,在下面的讨论中把3个分量取同一个值,这样显示出来的图片是一张黑白的图片。像素值表示的是图片点所发出的光的强弱,值越大表示能量越强亮度越亮。

现在有下面一张3x3的中间是一个灰色点的图片,假设他的像素值分布如下图所示:

中间有个灰点的位图

为了模糊,我们的目标就是要降低相邻像素间的值得差距,把灰点的值与周围的值抹平。磨皮去痘痘也是这个道理。这里有人可能会问,最好的去痘痘的方法应该是把痘痘方法就是把周围好的皮肤复制下来覆盖掉痘痘区域。但是由于图片只有像素等基本元素,没有提供其他描述哪里是好的皮肤哪里是痘痘这种额外的信息,再者有现实中的光亮变化、颜色有过渡等因素的影响,计算机总是没能那么智能地满足你的需求。这算是一种妥协,也是为什么PS需要人工勾选区域等工序的原因,更是类似美图秀秀等公司能够体现价值的原因。聊远了,这学问太深了。要知道这里讲的是模糊技术。它可以用于磨皮自然有其他方法可以使用。

2
要降低相邻像素件的差距方法有很多。

首先提出一种叫均值模糊的方式。它的规则是目标像素的值取值为周围其他像素值的平均值。所以上述3x3的图片结果为:

均值模糊结果

目标像素取周围其他像素的平均值,就会变成1。这是一种数值上平滑化。在图形上,就相当于产生模糊效果,但会导致目标像素失去自己的细节。

为了解决目标像素失去自身细节的问题,再来看高斯模糊的方式。它的规则是目标像素的权重最大,周围的像素距离目标像素的距离越远权重越小。这样就可以保留目标像素的细节了。

二位高斯函数的图像如下图所示,可以看出它是一个钟形的分布图。图商的点表示的是高斯模糊时的权重。

二维高斯函数分布图

先回忆一下高斯函数的内容。下面是一维和二维的高斯函数:

一维高斯函数

二维高斯函数

从公式中可以看出一维中的μ和二维中的μ1和μ2表示的是该分布的均值,影响的是最高点的坐标位置。σ表示分布的标准差,决定了分布的幅度,σ越大,距离目标点的数据越多,数据分布越分散;σ越小,距离目标点的数据越少,数据分布越集中。

3

现在开始把高斯函数应用到图片模糊中。还是先给前面3x3的图片建立一个坐标,如下图所示:

位图坐标

根据这个坐标我们需要构建出合适的高斯函数,从而生成合适的权重列表。由于这里把目标像素定位到了原点,因此μ1和μ2取0就可以了。另外根据实际需要保留目标像素的细节的多少决定σ的值,σ越大目标像素的权重越小。

假设去σ的值为1.5,高斯函数计算后的权重如下图所示:

高斯函数计算后的权重

由于高斯函数的特点是曲面所包围与xy平面包围起来的体积的总和必须等于1,而该图片参与运算的像素点只有9个,也即是需要把这9个权重进行量化,以达到所有权中加起来的值为1。经过量化后的值结果如下。

量化后的权重

最后经过高斯模糊后的图片为:

高斯模糊后的图片

4

本例得出的结果貌似都是一样的,但如果给予更多的样例,二者的差距就会显现出来,这里就不再繁述了。实际上相比于均值模糊的死板,高斯模糊提供给用户的是对权重的选择的灵活性。

ChardLau

继续阅读此作者的更多文章