OpenCV-空间滤波学习笔记

本文介绍了OpenCV库在图像处理中的空间滤波技术,包括中值滤波、高斯均值滤波以及Sobel边缘提取的应用。还展示了如何使用HSV阈值进行皮肤识别,实现简单的磨皮程序。
摘要由CSDN通过智能技术生成

目的

了解和实践OpenCV在空间滤波上的应用。

方法

Source:机器视觉技术与应用_中国大学MOOC(慕课) (icourse163.org)

当图像中的边缘信息和卷积核的形状是相符合的,得到的响应值最大。

滤波和边缘提取函数

中值滤波

均值滤波

高斯均值滤波

Sobel边缘提取

不同函数效果展示

中值滤波

实验用图

带有椒盐噪声的图像:

实验代码

#include<opencv2/opencv.hpp>

using namespace std;

using namespace cv;

int main() {

void medianBlurTest();

medianBlurTest();

return 0;

}

void medianBlurTest() {

//读取图像并转为灰度图

Mat srcMat = imread("E:\\Projects\\C++\\morphology_practice\\test_data\\medianBlur.png", 0);

//判断图像是否读取成功

if (srcMat.empty()) {

cout << "Fail to read pic!" << endl;

return;

}

//定义图像容器

Mat thresh_Mat;

Mat medianBlur_Mat;

//中值滤波

medianBlur(srcMat, medianBlur_Mat, 3);

//展示滤波效果

imshow("srcMat", srcMat);

imshow("medianBlur_Mat", medianBlur_Mat);

waitKey(0);

}

滤波结果

高斯均值滤波

实验图像

带有高斯噪声的图像

实验代码

#include<opencv2/opencv.hpp>

using namespace std;

using namespace cv;

int main() {

void GaussianBlurTest();

GaussianBlurTest();

return 0;

}

void GaussianBlurTest() {

//读取图像并转为灰度图

Mat srcMat = imread("E:\\Projects\\C++\\morphology_practice\\test_data\\GaussianBlur.png", 0);

//判断图像是否读取成功

if (srcMat.empty()) {

cout << "Fail to read pic!" << endl;

return;

}

//定义图像容器

Mat GaussianBlur_Mat;

//使用高斯滤波        

GaussianBlur(srcMat, GaussianBlur_Mat, Size(9, 9),1,1);

//展示滤波效果

imshow("srcMat", srcMat);

imshow("GaussianBlur_Mat", GaussianBlur_Mat);

waitKey(0);

}

滤波结果

Sobel边缘提取

实验图像

实验代码

#include<opencv2/opencv.hpp>

using namespace std;

using namespace cv;

int main() {

void SobelTest();

SobelTest();

return 0;

}

void SobelTest() {

//读取图像并转为灰度图

Mat srcMat = imread("E:\\Projects\\C++\\morphology_practice\\test_data\\Sobel.png", 0);

//判断图像是否读取成功

if (srcMat.empty()) {

cout << "Fail to read pic!" << endl;

return;

}

//定义图像容器

Mat dx;

Mat dy;

//使用Sobel边缘提取算法

Sobel(srcMat, dx, CV_16SC1, 1, 0, 5);

Sobel(srcMat, dy, CV_16SC1, 0, 1, 5);

//展示滤波效果

imshow("srcMat", srcMat);

imshow("dx", dx);

imshow("dy", dy);

waitKey(0);

}

边缘提取结果

水平方向:

垂直方向:

简单磨皮程序的实现

原理

  • 使用HSV阈值的方法识别人类的皮肤
  • 使用mask获取人类皮肤区域
  • 对皮肤区域进行均值滤波

实验代码

#include<opencv2/opencv.hpp>

using namespace std;

using namespace cv;

int main() {

void Convolution_app();

Convolution_app();

return 0;

}

void Convolution_app() { //简单的磨皮程序

//打开摄像头

VideoCapture cap(0);

//肤色h范围

double i_minH = 0;

double i_maxH = 20;

//肤色饱和度s范围

double i_minS = 43;

double i_maxS = 255;

//肤色亮度范围

double i_minV = 55;

double i_maxV = 255;

while (true)

{

//定义图像容器

Mat frame;

Mat hsvMat;

Mat maskMat;

Mat objectMat;

Mat gussMat;

cap >> frame;//读取当前帧的图像

//将图像转为hsv色阈

cvtColor(frame, hsvMat, COLOR_BGR2HSV);

//初始化maskMat

frame.copyTo(maskMat);

//利用inRange函数对图片进行hsv筛选

inRange(hsvMat, Scalar(i_minH, i_minS, i_minV), Scalar(i_maxH, i_maxS, i_maxV), maskMat);

//将原图拷入输出图像中

frame.copyTo(objectMat);

//对图像进行高斯滤波

GaussianBlur(frame, gussMat, Size(5, 5), 3, 0);

//高斯滤波后的人脸部分送入输出图像中

gussMat.copyTo(objectMat, maskMat);

//显示结果

imshow("磨皮前", frame);

imshow("mask", maskMat);

imshow("磨皮后", objectMat);

waitKey(30);

}

}

效果展示

结果

讨论

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值