一、主要内容概述
该美颜相机主要实现的是拍摄照片并对其进行磨皮和美白两种功能的实现。
二、相关技术简介
1.OpenCV.js
OpenCV是一个采用C语言进行优化,用于图像处理、分析、机器视觉方面的开源函数库。该库包含了横跨工业产品检测、医学图像处理、安防、用户界面、摄像头标定、三维成像、机器视觉等领域的超过500个接口函数。OpenCV.js是JavaScript开发者与OpenCV函数库之间的桥梁,JavaScript开发者开发的OpenCV应用接口,是借助编译器将库底层 C++ 代码编译为,可以在浏览器运行的 asm.js 。OpenCV.js 的出现使得 JavaScript 开发者可以高效便捷的使用 OpenCV 提供的图形处理算法,开发者仅凭借浏览器就能快速开发例如图片美化、图像识别、人脸检测、人脸识别、特定目标追踪等功能的应用。
2.磨皮
磨皮是最基础的美颜效果。主要分为祛斑,祛痘,淡化黑眼圈等步骤。磨算是检测一个美颜相机优劣的最重要的部分了,能实现好的磨皮效果的美颜相机一定是更受欢迎的;而我们常用的滤波有均值滤波,高斯滤波以及双边滤波三种,到底选用那种滤波呢?
首先,均值滤波会因为是用周围像素的平均值代替原像素值,肯定会导致图像过于模糊,所以排除掉。其次,高斯滤波与均值滤波原理类似,只是高斯滤波器的模板系数会随着距离模板中心的增大而减小,虽然可以减弱图像的模糊程度,但是图像边缘信息会丢失。
那么,只剩一个滤波了,也就是双边滤波器。因为它同时综合了高通滤波器和a-截尾均值过滤器的叠加效果,即可以保证图像不是非常模糊,也可以保留图像边缘信息。
而人脸磨皮原理的步骤分为如下3个步骤:
- 图像滤波
- 图像融合
- 图像锐化
本算法采用双边滤波算法,双边滤波则考虑了空间域和像素域,能够满足保留边缘的需要;
双边滤波组合了空间上邻近程度的权重和像素颜色值相似程度的权重。公式如下:
其中,f是原始图像,h是滤波后图像,x是卷积核中心点,ξ是x的相邻点。卷积核包括了两部分:
·空间权重c(ξ,x)衡量几何空间上的邻近程度,颜色权重s(f(ξ),f(x))衡量色彩空间上的相似程度。
·权重c和权重s都遵循高斯分布:离中心点的几何距离越远,权重c越小;和中心点的颜色差异越大,权重s越小。
利用调用OpenCV函数库与双边滤波实现对图片进行磨皮的处理:
3.美白
美白算法采用的是补色、滤色、以及高斯模糊算法来实现的。图像模糊算法,实现原理也并不是很难懂,要设计一个程序来模糊处理一个图像的话,对于正在处理的每一个像素,取周围若干个像素的RGB值并且平均,然后这个平均值就是模糊处理过的像素,如果对图片中的所有像素都这么处理的话,处理完成的图片就会变得模糊。但是这样做的效果并不是,如果图片颜色变化频繁而且单位面积里面颜色反差很大,并且模糊半径很大的话,那么结果就是:模糊范围的最外层的像素和中心像素周围的像素的权重是一样的,这样处理的图片可能过渡并不是很平滑。所以,需要有一个算法,来为这些在模糊范围中的像素来分别计算权重,这样的话越在模糊半径外围的像素权重越低,造成的影响就越小,越在内侧的像素得到的权重最高,因为内侧像素更加重要,他们的颜色应该与我们要处理的中心像素更接近,更密切。这个时候就需要用到高斯模糊算法了。
正态分布一种概率分布,也称“常态分布”。正态分布具有两个参数μ和σ^2的连续型随机变量的分布,第一参数μ是服从正态分布的随机变量的均值,第二个参数σ^2是此随机变量的方差,所以正态分布记作N(μ,σ^2)。服从正态分布的随机变量的概率规律为取与μ邻近的值的概率大,而取离μ越远的值的概率越小;σ越小,分布越集中在μ附近,σ越大,分布越分散。
高斯过滤在图像处理是一种低通滤波,会除去图像的细节而保持整体不变化;参考Photoshop中对中的算法来实现对图片整体进行处理。
3.1RGB
RGB是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好像有红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和,越混合亮度越高,即加法混合。
红、绿、蓝三个颜色通道每种色各分为256阶亮度,在0时“灯”最弱——是关掉的,而在255时“灯”最亮。当三色灰度数值相同时,产生不同灰度值的灰色调,即三色灰度都为0时,是最暗的黑色调;三色灰度都为255时,是最亮的白色调。
在电脑中,RGB的所谓“多少”就是指亮度,并使用整数来表示。通常情况下,RGB各有256级亮度,用数字表示为从0、1、2...直到255。注意虽然数字最高是255,但0也是数值之一,因此共256级。
3.2.HSV
HSV是一种比较直观的颜色模型,所以在许多图像编辑工具中应用比较广泛,这个模型中颜色的参数分别是:色调(H, Hue),饱和度(S,Saturation),明度(V, Value)。
色调H。
用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
饱和度S。
饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
明度V。
明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。
实现RGB与HSV之间的相互转换来调整图片的饱和度,处理后的图片颜色更鲜艳。代码如下:
4.调用摄像头
用到浏览器的摄像头组件,然后再将图片赋给canvas。
getUserMedia API使用媒体输入设备生成MediaStream ,此MediaStream包含请求的媒体类型,无论是音频还是视频。 使用从API返回的流,可以在浏览器上显示视频供稿,这对于浏览器上的实时通信很有用。 与MediaStreamRecorder API一起使用时,我们可以记录和存储在浏览器中捕获的媒体数据。 该API仅适用于安全来源,就像其他新引入的API一样,它仍然适用于localhost和文件url。确认浏览器对getUserMedia的支持后,下一步是请求允许使用用户代理上的媒体输入设备。
我们应该保留对当前流的引用,这样当我们切换到另一个流时就能停止当前流。函数 stopMediaTracks 接收一个媒体流,循环遍历流中的每一个媒体轨道,调用 stop 方法停止媒体轨。要在点击同一个按钮时改变摄像头,所以我们需要更新一下按钮的事件监听器了。如果当前有媒体流,我们应该先停止掉它。然后我们要检查 <select> 元素看是否选择了特定的设备,然后基于此构造 media constraints 对象。
由于拍摄照片时是镜像的,所以需要对照片进行翻转。
三、结果演示
四、参考文献