opencv学习笔记20-opencv高斯滤波实现人脸磨皮

一、GaussianBlur函数:

(1)函数原型:
CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
 double sigmaX, double sigmaY = 0, int borderType = BORDER_DEFAULT );
(2)函数作用:
  • GaussianBlur 函数将源图像 src 与指定的高斯核进行卷积,实现图像的模糊效果。支持原地(in-place)滤波。
(3)参数说明:
  • src:输入图像,可以有任意数量的通道,通道将独立处理,但图像深度应该是 CV_8UCV_16UCV_16SCV_32F 或 CV_64F
  • dst:输出图像,其大小和类型与 src 相同。
  • ksize:高斯核的大小。ksize.width 和 ksize.height 可以不同,但它们都必须是正奇数。或者,它们可以是零,并从 sigma 计算得出。
  • sigmaX:X 方向上的高斯核标准差。
  • sigmaY:Y 方向上的高斯核标准差;如果 sigmaY 为零,则设置为等于 sigmaX。如果两个 sigma 值都为零,它们从 ksize.width 和 ksize.height 计算得出(见 getGaussianKernel 了解详细信息)。
  • borderType:像素外推方法,见 BorderTypes。不支持 BORDER_WRAP
(4)高斯核尺寸和标准差:
  • 如果 ksize 中的宽度和高度为零,则根据 sigma 值计算核尺寸。如果 sigma 也为零,则根据 ksize 计算 sigma 值。
(5)边界处理:
  • borderType 参数指定边界外推方法,用于处理图像边缘的像素。BORDER_DEFAULT 是默认值,表示使用适合的边界类型。
(6)相关函数:
  • sepFilter2D:分离滤波器,可以用于执行高斯滤波。
  • filter2D:通用滤波器应用函数。
  • blur:模糊函数,使用简单的盒子滤波器。
  • boxFilter:盒子滤波器。
  • bilateralFilter:双边滤波器,可以保留边缘的同时实现模糊。
  • medianBlur:中值滤波器。

二、示例代码:

#include <opencv2/core/utils/logger.hpp>
#include <opencv2/opencv.hpp>           
#include <opencv2/videoio.hpp>       
#include <opencv2/objdetect.hpp>        
#include <opencv2/highgui/highgui_c.h>  
#include <iostream>                     

using namespace cv;                    
using namespace std;      


int main() {
    utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT); 
    double hue_min = 0;    // 定义肤色的最小色调值
    double hue_max = 20;    // 定义肤色的最大色调值
    double saturability_min = 43;   // 定义肤色的最小饱和度值
    double saturability_max = 255;  // 定义肤色的最大饱和度值
    double Value_min = 55;   // 定义肤色的最小亮度值
    double Value_max = 255;  // 定义肤色的最大亮度值

    Mat frame = imread("C:\\Users\\86173\\Desktop\\TI\\face.png"); // 读取图像
    if (frame.empty()) {
        cerr << "Could not open or find the image" << endl; // 检查图像是否成功加载
        return -1;
    }

    Mat hsv_image; // 定义HSV图像容器
    Mat face_image; // 定义存储肤色区域的图像容器
    Mat dupes_image; // 定义存储最终输出的图像容器
    Mat gauss_image; // 定义存储高斯模糊结果的图像容器

    cvtColor(frame, hsv_image, COLOR_BGR2HSV); // 将BGR图像转换为HSV图像

    frame.copyTo(face_image); // 复制原图像到face_image以进行肤色提取

    // 使用inRange函数根据HSV范围提取肤色区域
    inRange(hsv_image, Scalar(hue_min, saturability_min, Value_min), Scalar(hue_max, saturability_max, Value_max), face_image);

    frame.copyTo(dupes_image); // 复制原图像到dupes_image以进行后续处理

    // 对原图像进行高斯模糊处理
    GaussianBlur(frame, gauss_image, Size(5, 5), 3, 0);

    // 将高斯模糊的结果复制到dupes_image中,但只使用face_image标记的肤色区域
    gauss_image.copyTo(dupes_image, face_image);

    imshow("磨皮前", frame); // 显示原始图像
    imshow("磨皮后", dupes_image); // 显示经过"磨皮"处理后的图像

    waitKey(0); // 等待用户按键
    destroyAllWindows(); // 销毁所有窗口
    return 0;
}

三、运行结果:

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值