OpenCV4图像处理--图像模糊和自定义滤波器

图像模糊

  • 概念:图片的模糊,一直是图像处理领域一个比较重要的东西,它的用处不仅仅是我们平时PS的滤镜,也常常被用来做图片数据的降噪,图片的有损压缩,和图片特征相似匹配的优化工作,通过对图像进行卷积操作,可以得到模糊的图像,当然选择不同的卷积核,模糊效果不一样。

盒子模糊

  • API : boxFilter 也是一种均值模糊
CV_EXPORTS_W void boxFilter( InputArray src, OutputArray dst, int ddepth,
                             Size ksize, Point anchor = Point(-1,-1),
                             bool normalize = true,
                             int borderType = BORDER_DEFAULT );
	Mat dst;
	boxFilter(src, dst, -1, Size(5, 5), Point(-1, -1), true, BORDER_DEFAULT);
	imshow("box blur", dst);在这里插入图片描述




在这里插入图片描述

高斯模糊

  • 高斯分布
    正态分布是一种钟形曲线,越接近中心,取值越大,越远离中心,取值越小。
    在这里插入图片描述
  • API : GaussianBlur
CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
                                double sigmaX, double sigmaY = 0,
                                int borderType = BORDER_DEFAULT );
                                

PS: ksize对应高斯函数中的 x 和 y, sigmaX和sigmaY可以由ksize计算得出,因此这两种参数是有换算关系的,给出其一就行,随着ksize或者sigma越来越大,图像越来越模糊

	//高斯模糊
	Mat dst;
	GaussianBlur(src, dst, Size(15, 15), 0);
	imshow("gaussian blur", dst);
	

高斯模糊和盒子模糊对比

在这里插入图片描述

自定义滤波器

  • 卷积核定义:可以定义均值卷积核和非均值卷积核
	//均值卷积核
	int k = 15;//卷积窗口的大小
	Mat mkernel = Mat::ones(k, k, CV_32F)/(float)(k*k);
	//非均值卷积核
	Mat robot = (Mat_<int>(2, 2) << 1, 0, 0, -1);//robot算子
  • API : filter2D
CV_EXPORTS_W void filter2D( InputArray src, OutputArray dst, int ddepth,
                            InputArray kernel, Point anchor = Point(-1,-1),
                            double delta = 0, int borderType = BORDER_DEFAULT );

PS: delta控制亮度

	Mat src = imread("F:/code/images/ttt.png");
	if (src.empty()) {
		printf("fail to read");
		return -1;
	}
	namedWindow("input", WINDOW_AUTOSIZE);
	imshow("input", src);

	//自定义滤波器
	
	//均值卷积
	int k = 15;//卷积窗口的大小
	Mat mkernel = Mat::ones(k, k, CV_32F)/(float)(k*k);
	Mat dst;
	filter2D(src, dst, -1, mkernel, Point(-1, -1), 0, BORDER_DEFAULT);
	imshow("custom mean filter ", dst);

	//非均值卷积
	Mat robot = (Mat_<int>(2, 2) << 1, 0, 0, -1);
	Mat dst2;
	filter2D(src, dst2, CV_32F, robot, Point(-1, -1), 0, BORDER_DEFAULT);
	convertScaleAbs(dst2, dst2);
	imshow("custom robot filter ", dst2);

PS: 非均值卷积核一定要注意卷积后像素值的范围,要能够保证正确存储图像的深度信息,例如上面的robot算子,卷积后的像素值范围是 -255 ~ 255,故使用CV_32F类型,那么在显示图像之前也一定要做处理,也就是下面的输出图像类型。

  • 输出图像类型
    针对不同卷积核系数,图像输出类型数值范围,CV_32F/CV_32S
    API:convertScaleAbs 对滤波后的图像进行处理,便于正常显示
CV_EXPORTS_W void convertScaleAbs(InputArray src, OutputArray dst,
                                  double alpha = 1, double beta = 0);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值