数字图像处理—美图秀秀:磨皮算法
简介
本项目是以matlab为主语言并设计GUI界面的一款简易美图秀秀,包含基础的图像处理和一些常见美颜算法
对于一些matlab较难实现的算法采用C++或python来实现
⭐️ github地址:https://github.com/mibbp/MeituShow
里面有我完整的代码,你想直接运行记得看readme配置一下环境,本博客更多的是讲解原理
具体功能包括:
- 增加图像亮度,对比度
- 美白人像
- 采用双边滤波算法磨皮
- 采用液化算法并用dlib提取特征点实现瘦脸
- 基于液化算法并用dlib提取特征点实现大眼
- 采用dlib提取特征点,采用Andrew求凸包并用BFS实现唇彩
- 采用SRCNN超分辨率算法实现提升照片像素
- 采用Beauty-GAN算法实现彩妆迁移
磨皮算法
先说最简单的磨皮算法,磨皮其实就是把人脸上不光滑的东西磨掉,那这些不光滑的东西其实就是噪点,所以可以很自然的想到运用一些滤波算法去做磨皮处理
均值滤波
均值滤波无疑是最简单的,他的想法就是通过领域加权来达到滤波的目的,领域通常是指以自己为中心的周围八个元素,其实也就是一个3×33 \times 33×3的卷积核或者说滤波器,八领域如下图所示
因为正常情况下都是照片上有噪点,也就是噪点数量远小于有效像素数量,而不是噪点上有照片,所以一个像素点周围八个元素一定是有效像素更多,那计算周围八个连带自己的总和除以9产生的新值就可以作为滤波后的像素值,因为有效像素比噪点多所以计算的均值一定是有效像素占比更大,然后遍历每个像素点都对他求一个八邻域均值,整体过程其实就是个卷积
高斯滤波
均值滤波的加权其实就是大家都是1,所以算下来的结果就是平均值,看上去很公平,但是实际上并不是,对于离目标像素点理应权重更大(明明是我先来的),因为在一个低频区域(也就是联通区域)离得越近那我们应该更相似,那么距离我越近提供的有效信息也就越多,所以他的权重也应该更大,离的越远权重应该越低,而这很明显符合高斯函数的特征,而且人们认为大多数图片噪声是符合高斯分布的(就是正态分布,由中心极限定理表明,一个随机变量如果是由大量微小的、独立的随机因素的叠加结果,那么这个变量一般都可以认为服从正态分布),所以我们把滤波器的值改一下,改成基于距离的高斯函数加权
高斯函数(正态分布函数)如下所示
G(x,y)=12πσ2e−x2+y22σ2G(x,y) = \frac {1}{2\pi\sigma^2}e^{- \frac{x^2+y^2}{2\sigma^2}} G(x,y)=2πσ21e−2σ2x2+y2
假设中心点坐标为(0,0)(0,0)(0,0),那么他的八邻域就分别为
然后计算出距离套高斯函数,这里设σ=1.5\sigma = 1.5σ=1.5,则模糊半径为1的权重矩阵为
但是还得进行归一化,也就是让他们的权重之和为1,因为得保证他们和其他处理处于同一量级,对于上面的值分别处以0.4787147就好了
但你实际写代码很简单matlab这些都有自带实现好的,可以看看高斯滤波的效果
运行结果
磨皮效果还凑合
双边滤波
虽然高斯滤波效果还凑合但是他有个致命问题那就是他会模糊五官,这是我们不想看到的,为了不模糊五官我们可以采用保边滤波算法,其中双边滤波就是最经典简单的保边滤波了
先说为什么高斯滤波会模糊五官,因为它只关注位置信息,高斯滤波认为距离中心点越近权重越大,这种只关注距离的思想在某些情况是可行的,比如在低频平坦区域,距离越近的像素肯定分布越相近,但是在高频边缘区域,这种方法就会适得其反,会损失掉有用的边缘信息,这个时候就要用到保边滤波算法
想深入了解双边滤波算法原理的我建议看这两篇论文,我这里只做通俗的讲解
Fast O(1) Bilateral Filtering Using Trigonometric Range Kernels
Fast Adaptive Bilateral Filtering
算法原理
我们可以很容易发现五官的边界和皮肤有很明显的区别(不然你可以看不出这个人有鼻子有眼的),也就是说在五官和皮肤的交界处一定会有极大的像素值差,原本的高斯滤波是只以距离差为变量,那我们在此基础上再加个像素值差,也就是说距离中心点距离越近权重越高,但是和中心点的像素值差值越大权重越小,且像素值差值的影响要大于距离值
于是就设计出双边滤波的一个公式
g(p)=η(p)−1∑q∈ΩGσs(∥p−q∥)Gσr(∣F(p)−F(q)∣)F(q)η(p)=∑q∈ΩGσs(∥p−q∥)Gσr(∣F(p)−F(q)∣)Gσs(∥p−q∥)=e−(i−m)2+(j−n)22σs2Gσr(∣F(p)−F(q)∣)=e−[F(i,j)−F(m,n)]22σr2p,q表示像素点,F(p)表示该点像素值Ω表示图片,(i,j)为卷积核中心(m,n)则表示卷积核中心周围其他值g(p) = \eta(p)^{-1}\sum_{q\in\Omega}G_{\sigma_s}(\Vert p-q\Vert) G_{\sigma_r}(\vert F(p)-F(q)\vert)F(q) \\ \eta(p) = \sum_{q\in\Omega}G_{\sigma_s}(\Vert p-q\Vert) G_{\sigma_r}(\vert F(p)-F(q)\vert) \\ G_{\sigma_s}(\Vert p-q\Vert) = e^{-\frac {(i-m)^2+(j-n)^2} {2\sigma_s^2} } \\ G_{\sigma_r}(\vert F(p)-F(q)\vert) = e^{-\frac {[F(i,j)-F(m,n)]^2} {2\sigma_r2} } \\ p,q表示像素点,F(p)表示该点像素值 \\ \Omega 表示图片,(i,j)为卷积核中心 \\ (m,n)则表示卷积核中心周围其他值 g(p)=η(p)−1q∈Ω∑Gσs(∥p−q∥)Gσr(∣F(p)−F(q)∣)F(q)η(p)=q∈Ω∑Gσs(∥p−q∥)Gσr(∣F(p)−F(q)∣)Gσs(∥p−q∥)=e−2σs2(i−m)2+(j−n)2Gσr(∣F(p)−F(q)∣)=e−2σr2[F(i,j)−F(m,n)]2p,q表示像素点,F(p)表示该点像素值Ω表示图片,(i,j)为卷积核中心(m,n)则表示卷积核中心周围其他值
这个公式看着很吓人其实真的很简单,但其实就是俩高斯函数的叠加一个是以距离为变量一个是以像素差值为变量,并做卷积求和,η(p)−1\eta(p)^{-1}η(p)−1是用来做归一化处理的, Gσs(∥p−q∥)G_{\sigma_s}(\Vert p-q\Vert)Gσs(∥p−q∥) 就是以像素值为变量的高斯函数,Gσr(∣F(p)−F(q)∣)G_{\sigma_r}(\vert F(p)-F(q)\vert)Gσr(∣F(p)−F(q)∣) 则是以像素差值为变量的高斯函数,具体分析可以看论文或者私聊问我
代码
% 双边滤波器
function results = B_filter(~,Img,tempsize,sigma0,sigma1)gauss = fspecial('gauss',2*tempsize+1,sigma0);[m,n] = size(Img);% tempsize为卷积核大小for i = 1+ tempsize : m - tempsizefor j = 1+ tempsize : n - tempsize% 提取处理区域得到梯度敏感矩阵% 得到灰度差值矩阵,并用高斯函数处理为灰度差越大则最终数值越小的权重矩阵temp = abs(Img(i - tempsize:i + tempsize,j - tempsize:j + tempsize) - Img(i,j));temp = exp(-temp.^2/(2*sigma1^2));%将权重矩阵与高斯滤波器相乘,得到双边滤波器,并将权值和化为一filter = gauss.*temp;filter = filter/sum(filter(:));% 卷积求和Img(i,j) = sum(sum((Img(i - tempsize:i + tempsize,j - tempsize:j + tempsize).*filter)));endendresults = Img;end
% 双边滤波函数
function results = BF(app,I)tempsize = round(app.Slider_4.Value); %控制卷积核大小的参数sigma1 = round(app.Slider_5.Value); %控制标准差sigma2 = app.Slider_6.Value; %控制灰度的敏感性,越大的灰度差,权重越小%模板补零,便于卷积操作,不然会使得图片区域出现黑边img = double(padarray(I,[tempsize,tempsize],0))/255;imgr = img(:,:,1);imgg = img(:,:,2);imgb = img(:,:,3);img(:,:,1) = app.B_filter(imgr,tempsize,sigma1,sigma2);img(:,:,2) = app.B_filter(imgg,tempsize,sigma1,sigma2);img(:,:,3) = app.B_filter(imgb,tempsize,sigma1,sigma2);results = img;
end
效果对比
双边滤波
高斯滤波
数字图像处理—美图秀秀:磨皮算法相关推荐
- 数字图像处理-美图秀秀:瘦脸算法
简介 本项目是以matlab为主语言并设计GUI界面的一款简易美图秀秀,包含基础的图像处理和一些常见美颜算法 对于一些matlab较难实现的算法采用C++或python来实现 ⭐️ github地址: ...
- 数字图像处理-美图秀秀:美白算法
简介 本项目是以matlab为主语言并设计GUI界面的一款简易美图秀秀,包含基础的图像处理和一些常见美颜算法 对于一些matlab较难实现的算法采用C++或python来实现 ⭐️ github地址: ...
- Python-opencv利用setMouseCallback实现美图秀秀磨皮魔法笔
Python-opencv实现美图秀秀磨皮魔法笔 前言 一.涉及技术 1.Opencv鼠标响应setMouseCallback() 2.双边滤波 二.具体实现 1.代码 2.结果展示 3.一些注释 前 ...
- 数字图像处理期末大作业-美图秀秀
本项目是以matlab为主语言并设计GUI界面的一款简易美图秀秀,包含基础的图像处理和一些常见美颜算法 对于一些matlab较难实现的算法采用C++或python来实现 ⭐️ github地址:htt ...
- 换发型算法_如何用手机美图秀秀换发型
展开全部 美图秀秀目前没有换发62616964757a686964616fe4b893e5b19e31333365666136型的功能,美图旗下的美颜相机有换发型的功能. 拓展资料 在美颜相机上换发型 ...
- Qt Quick 图像处理实例之美图秀秀(附源码下载)
在<Qt Quick 之 QML 与 C++ 混合编程详解>一文中我们讲解了 QML 与 C++ 混合编程的方方面面的内容,这次我们通过一个图像处理应用,再来看一下 QML 与 C++ 混 ...
- Qt Quick 图像处理实例之美图秀秀 附源码下载
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在< ...
- 美图秀秀专利---偏色检测算法研究
本文将实现美图秀秀于2015年公布的一篇图像处理专利:一种基于颜色空间的偏色检测 方法. 这个专利的下载地址: http://pan.baidu.com/s/1eQIuPgQ 专利公布号为 CN104 ...
- 美图秀秀网页版新功能上线 新增磨皮祛痘
在人物照片的后期处理中,磨皮祛痘向来是一个比较重要的环节,特别是人像自拍.写真照等.不过,别以为这是件多么难做的事儿,因为美图秀秀网页版新上线了"磨皮祛痘"功能,也就是说以后不用东 ...
- MATLAB美图软件算法研究,【网络多媒体学】matlab实现美图秀秀基本功能.ppt
[网络多媒体学]matlab实现美图秀秀基本功能 ;;PPT模板下载:/moban/ ;PPT模板下载:/moban/ ;PPT模板下载:/moban/ ;角度旋转; B = imrotate(A,a ...
最新文章
- codevs 1203 判断浮点数是否相等
- centos7 yum安装 c c++ gcc gcc-c++
- mysql最多多少个索引_漫画 | 一台Linux服务器最多能支撑多少个TCP连接?
- 云基础设施公司 HashiCorp 宣布完成 D 轮 1 亿美元融资
- java main 参数传递参数_Java千问:Java语言如何给main方法传递参数?
- python代码解读软件_5种带你轻松分析Python代码的软件库
- oracle 事务未正常回滚,Spring事务没有回滚异常(Oracle JNDI数据源)
- 用鼠标去控制物体移动的方法
- netty冲突 play sbt_Scala的Play框架:编译错误[类型应用程序不是程序包控制器的成员]...
- fedora下做成liveOS的U盘容量变小问题
- android api文档_【粉丝投稿】无需额外注解的 SpringBoot API文档生成工具
- 安装一直初始化_win10开机一直卡在正在准备自动修复怎么办
- MyBatis-Plus updateById方法更新不了空字符串/null解决方法
- 权重较高的几个分类信息网站
- 页面交换文件pagefile.sys-虚拟内存页面文件
- 主仆模式(Master-Slave)
- NOIP2011提高组初赛不定项选择第5题
- 武汉大学计算机转专业2021,通知|关于做好2021年普通本科生转专业工作的通知...
- [小o地图-数据] - 获取全国行政区划轮廓数据(上)
- Unity实现跨场景的传送门