C++ OpenCV4.5 图像模糊(五)

系列文章目录

C++ OpenCV4.5环境搭建(一)

C++ OpenCV4.5常用API查询手册(二)

C++ OpenCV4.5 图像处理(三)

C++ OpenCV4.5 绘制形状与文字(四)



前言

该篇主要讲解图像模糊的原理及实现,图像模糊包括均值模糊、高斯模糊、中值模糊和双边模糊。


一、均值模糊和高斯模糊(模糊)

均值模糊原理:
参考下图,假设有6×6的图像像素矩阵
卷积过程:6×6上面是3×3的窗口,从左往右,从上往下移动,将黄色部分的每个像素点值之和取平均值,赋值给中心红色像素点,当做卷积处理之后的新的像素值,每次移动一个像素;但会存在边缘值无法计算的问题,并且,一个很高的像素值可能在取平均值之后,变成一个很低的像素值
在这里插入图片描述
高斯模糊:不会存在边缘值无法计算的问题,并且每个点的像素值重新计算后,变化不会很大

代码如下(示例):

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main(void)
{
	Mat srcImg, blurImg, gsBlurImg;
	srcImg = imread("D:\\1.jpg");
	if (!srcImg.data)
	{
		cout << "can not load image.." << endl;
		return -1;
	}
	// 功能:均值模糊
	// 参数:1、输入图像
	//		 2、输出图像
	//		 3、Size(x, y),如果x和y相等,则为均值模糊,如果x大于y,则横向模糊;反之纵向模糊;值越大,模糊越明显
	//		 4、默认Point(-1, -1),计算后的值赋给中心点
	// 返回:无
	blur(srcImg, blurImg, Size(11, 11), Point(-1, -1));
	
	// 功能:高斯模糊
	// 参数:1、输入图像
	//		 2、输出图像
	//		 3、Size(x, y),如果x和y相等,则为均值模糊,如果x大于y,则横向模糊;反之纵向模糊;值越大,模糊越明显;
	//			x和y必须是正数而且是奇数
	//		 4、X方向的高斯标准差
	//		 5、Y方向的高斯标准差;如果sigmaY为零,则设置为等于sigmaX,如果两个sigma都为零,则取Size的宽度和高度
	// 返回:无
	GaussianBlur(srcImg, gsBlurImg, Size(11, 11), 11, 11);

	imshow("测试", srcImg);
	imshow("模糊", blurImg);
	imshow("高斯模糊", gsBlurImg);

	waitKey(0);

	return 0;
}

二、中值模糊和双边模糊(美颜)

中值模糊(滤波)原理:
参考下图,3×3区域像素排序是:
115、119、120、123、124、125、126、127、150;
中值等于:124
中值模糊对椒盐噪声有很好的抑制作用,可以去掉黑点和白点

在这里插入图片描述
双边模糊(滤波):保留边缘信息的情况下,去掉人脸微小差异,相当于磨皮

代码如下(示例):

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;


int main(void)
{
	Mat src, dst;
	src = imread("E:\\1.jpg");
	if (src.empty())
	{
		cout << "load image fail..." << endl;
		return -1;
	}
	imshow("input image", src);

	// 功能:中值模糊,去掉椒盐噪声
	// 参数:src 输入图像
	//		 dst 输出图像
	//		 ksize 光圈线性大小,当前使用3×3的大小;必须是奇数且大于1,例如:3、5、7。。。
	// 返回:无
	// medianBlur(src, dst, 3);
	// imshow("medianBlur", dst);

	// 功能:双边模糊,去掉人脸微小差异,相当于磨皮,保留边缘信息
	// 参数:src 输入图像
	//		 dst 输出图像
	//		 d 计算的半径(磨皮的程度),半径之内的像素都会纳入计算,如果传-1,则根据sigmaSpace参数取值
	//		 sigmaColor 决定多少差值之内的像素会被计算,差值越大,边缘信息保留越少,磨皮越严重,图片越模糊
	//		 sigmaSpace 如果d的值大于0则无效,否则,根据它来计算d值
	// 输出:无
	bilateralFilter(src, dst, 15, 100, 3);
	imshow("bilateralFilter", dst);

	// 再利用掩膜计算,增加图像对比度,最终实现美颜相机的效果
	Mat result;
	Mat kernal = (Mat_<int>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	filter2D(dst, result, -1, kernal, Point(-1, -1), 0);
	imshow("filter2D", result);

	waitKey(0);

	return 0;
}


总结

1、均值模糊无法克服边缘像素信息丢死缺陷,原因是均值滤波是基于平均权重
2、高斯模糊克服了均值模糊的缺陷,但无法完全避免,因为没有考虑像素值的不同
3、高斯双边模糊(双边滤波)是边缘保留的滤波方法,避免了边缘信息丢失,保留了图像轮廓不变
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Li_Zhi_Yao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值