我的编程空间,编程开发者的网络收藏夹
学习永远不晚

OpenCV利用高斯模糊实现简单的磨皮美颜效果

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

OpenCV利用高斯模糊实现简单的磨皮美颜效果

1.高斯模糊

1.什么是高斯模糊

前面我们就知道了均值模糊和中值模糊,现在我们开始了解高斯模糊。

首先高斯指的是高斯函数,这个我想大家应该都知道,是一种非常常见的概率分布函数。大概就长这样吧。

通过均值模糊类比,我们可以大胆的猜出来高斯模糊的含义:

每一次需要处理的像素矩阵中不同地方的像素的值在最后的赋值像素的占比是不一样的。这个占比是按照高斯函数所分布的。

也就是说,越是远离中心像素的像素所占比重就更少,而中心像素值在赋值像素中的比重是最重的。

或者说,我们知道之前均值模糊所乘以的矩阵是

而高斯模糊中所乘的3*3矩阵可以是这样的

可视化后就是这样的

虽然我们可以从数学上得知高斯模糊和均值模糊的区别,但是在效果上我个人觉得高斯模糊可能能比起均值模糊能更好的保留边缘信息(只是个人看法)

最后把高斯模糊的计算公式提供给数学大佬

2.opencv提供的API


GaussianBlur(Mat class="lazy" data-src, Mat dst, Size(11, 11), sigmax, sigmay);

其中Size(x, y), x, y 必须是正数而且是奇数

参数SigmaX表示高斯方程中X方向的标准方差

参数SigmaY表示高斯方程中X方向的标准方差

在高斯分布中,方差可以理解为这个高斯分布的平缓程度,也就是说中间值所占比重的大小,方差越小,中间值所占比重越大,此时模糊的效果会相对更低一点(在同一个size下)

可视化一下你会乘的矩阵:

当方差较大时:

方差较小时:

这里两幅图不是完全合适,只是类比

2.双边模糊

1.什么是双边模糊

由于考虑到不管是均值模糊或者高斯模糊,最后的效果都是整个图像的模糊。有时候我们无需整体的模糊,而比如只模糊边缘,或者只模糊细节。

而双边模糊便是实现了对边缘信息的保留而弱化了细节。(这个效果可以用来磨皮,可以想想为啥)

实现的原理是我们确定一个数表示两个像素之间的差值的阈值,一旦两个像素之间超过了这个阈值,那么就不对这两个像素进行高斯模糊处理,一旦没有超过,就进行模糊处理。因为边缘地区的像素差值是比较大的,这样就能保留边缘的信息。

2.opencv的API


bilateralFilter(class="lazy" data-src, dest, d=15, 150, 3);

15 –计算的半径,半径之内的像数都会被纳入计算,如果提供-1 则根据sigma space参数取值

150 – sigma color 决定多少差值之内的像素会被计算

3 – sigma space 如果d的值大于0则声明无效,否则根据它来计算d值

3.磨皮美颜效果的实现

1.实现过程

通过对双边模糊处理后的图像再进行对比度加深的操作,最后就是让模糊的边缘再进行加深,几乎回到原来的效果。而模糊效果去掉皮肤上的细节,从而可以让皮肤显得光滑并且颜色很有光泽。

并且我利用滑轨可以动态台哦姐双边模糊的阈值从而让你们自己控制磨皮的效果。

2.主要代码


#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	string path = "xxxxxxxxxxxx.jpg";
	Mat img = imread(path);
	Mat img2 = Mat::zeros(img.size(), img.type());
	Mat img3;
	Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	imshow("img1", img);
	int x = 1, y = 1;
	namedWindow("Trackbars", (10, 100));//新建了一个窗口--轨迹栏
	createTrackbar("x", "Trackbars", &x, 200);
	while (1)
	{
		bilateralFilter(img,img2,15,x,3);
		imshow("img2", img2);
		filter2D(img2, img3, img.depth(), kernel);//class="lazy" data-src.depth()表示位图深度,和type相关
		imshow("img3", img3);
		waitKey(10); 
	}
	waitKey(0);
	return 0;
}

3.效果

原图:

磨皮后:

(边缘信息没有损失,但是色块更加均匀了还是) 

到此这篇关于OpenCV利用高斯模糊实现简单的磨皮美颜效果的文章就介绍到这了,更多相关OpenCV磨皮效果内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

OpenCV利用高斯模糊实现简单的磨皮美颜效果

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

OpenCV如何利用高斯模糊实现磨皮美颜效果

这篇文章主要介绍了OpenCV如何利用高斯模糊实现磨皮美颜效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.高斯模糊1.什么是高斯模糊前面我们就知道了均值模糊和中值模糊,
2023-06-22

在Android开发中利用RenderScript实现一个动态高斯模糊效果

在Android开发中利用RenderScript实现一个动态高斯模糊效果?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么是RenderScriptRenderScript是
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录