OpenCV6.模糊图像

模糊原理

Smooth/Blur给图像预处理时减低噪声,操作背后是数学的卷积计算

相关API

均值滤波:

blur(Mat src, Mat dst, Size(xradius, yradius), Point(-1, -1));

Size(x, y) 滤波模板kernel的尺寸

point(-1, -1)锚点,也就是处理的像素位于kernel的什么位置,(-1,-1)表示锚点在kernel的中心,没有要不需要更改。

高斯滤波:

GaussianBlur(Mat src, Mat dst, Size(11, 11), sigmax, sigmay);

Size(width, height) width,height大小可以不同,但必须为正数或者奇数

sigmax表示高斯核函数在x方向上的标准偏差,sigmay表示高斯核函数在y方向上的标准偏差

sigmay = 0时,值自动由sigmax确定(sigmay = sigmax);

sigmay = sigmax = 0时,它们的值由Size(width, height)自动确定。

中值滤波

对椒盐噪声有很好的抑制作用

medianBlur(Mat src, Mat dst, ksize);

中值模糊的ksize大小必须大于1并且为奇数。

高斯双边滤波

均值模糊无法克服边缘像素丢失问题,因为均值滤波是基于平均权重。

高斯模糊部分克服了该缺陷,但是无法完全避免,因为没有考虑像素值得不同。

高斯双边模糊是边缘保留的滤波方法,避免了边缘信息丢失,保留了图像轮廓不变。

bilateralFilter(src, dst, int d, double sigmaColor, double sigmaSpace);

int d:每个像素邻域的直径范围,越大越平滑越模糊,如果为非正数则根据sigmaspace计算该值

double sigmaColor:参数越大,该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域,平滑效果更好

double sigmaSpace:如果d>0,d指定了邻域大小且与sigmaSpace无关,否则根据它来计算d值

sigma越大边缘越模糊,越小边缘越清晰,sigma<10,滤波器不会有多少作用,sigma>150时效果会非常明显。

代码展示一

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

using namespace std;
using namespace cv;

int main()
{
	Mat src = imread("F:/Opencvlearn/picture/3.jpg");
	if (src.empty())
	{
		cout << "could not load image..." << endl;
		return -1;
	}
	namedWindow("input", WINDOW_AUTOSIZE);
	imshow("input", src);
	Mat dst;
	blur(src, dst, Size(7, 7), Point(-1, -1));//均值滤波
	imshow("blurimage", dst);
	Mat gblur;
	GaussianBlur(src, gblur, Size(5, 5), 7, 7);//高斯滤波
	imshow("gaussianblur", gblur);
	waitKey(0);
	return 0;
}

代码展示二

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

using namespace std;
using namespace cv;

int main()
{
	Mat src = imread("F:/Opencvlearn/picture/zh.png");
	if (src.empty())
	{
		cout << "could not load image..." << endl;
		return -1;
	}
	namedWindow("input", WINDOW_AUTOSIZE);
	imshow("input", src);

	Mat dst;
	medianBlur(src, dst, 5); //中值滤波
	namedWindow("medianBlur", WINDOW_AUTOSIZE);
	imshow("medianBlur", dst);

	bilateralFilter(src, dst, 20, 17, 17); //双边滤波
	namedWindow("bilateralFilter", WINDOW_AUTOSIZE);
	imshow("bilateralFilter", dst);

	Mat resultimg;
	Mat kernel = (Mat_<int>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	filter2D(dst, resultimg, -1, kernel, Point(-1, -1), 0); //调整对比度
	namedWindow("finalimg", WINDOW_AUTOSIZE);
	imshow("finalimg", resultimg);
	waitKey(0);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值