opencv——线性滤波原理及操作(方框滤波、均值滤波、高斯滤波)

原理

  • Smooth/Blur 是图像处理中最简单和常用的操作之一

  • 使用该操作的原因之一就为了给图像预处理时候减低噪声

  • 使用Smooth/Blur操作其背后是数学的卷积计算
    在这里插入图片描述

  • 通常这些卷积算子计算都是线性操作,所以又叫线性滤波

卷积

如何理解卷积
在这里插入图片描述
假设有6x6的图像像素点矩阵。

卷积过程:6x6上面是个3x3的窗口,从左向右,从上向下移动,黄色的每个像素与对应灰色素点值之和取平均值赋给中心红色像素作为它卷积处理之后新的像素值。每次移动一个像素格。

为什么要取平均:像素值不能超过255

图像模糊原理

方框滤波

所用的核如下
在这里插入图片描述

均值滤波(归一化盒子滤波)

在这里插入图片描述
上面讲的那种卷积就是均值滤波
不分权重

高斯滤波

高斯滤波在使图像模糊的基础上,保留了图像的一些特质。
比如某一像素点的值很大,经过高斯滤波后它的值还是很大,不会受其他值很小的点的影响

于是你可以将高斯滤波理解为:带权重的均值滤波
在这里插入图片描述
注:σ的大小决定了高斯函数的宽度。

高斯核(掩膜)

理论上,高斯分布在所有定义域上都有非负值,这就需要一个无限大的卷积核。实际上,仅需要取均值周围3倍标准差内的值,以外部份直接去掉即可。

高斯滤波的重要两步就是先找到高斯模板然后再进行卷积,模板(mask在查阅中有的地方也称作掩膜或者是高斯核)。所以这个时候需要知道它怎么来?又怎么用?

举个栗子:
假定中心点的坐标是(0,0),那么取距离它最近的8个点坐标,为了计算,需要设定σ的值。假定σ=1.5,则模糊半径为1的高斯模板就算如下
在这里插入图片描述
这个时候我们我们还要确保这九个点加起来为1(这个是高斯模板的特性—有权重),这9个点的权重总和等于0.4787147,因此上面9个值还要分别除以0.4787147,得到最终的高斯模板。

在这里插入图片描述

高斯滤波计算

有了高斯模板,那么高斯滤波的计算便顺风顺水了。
举个栗子:
假设现有9个像素点,灰度值(0-255)的高斯滤波计算如下:
在这里插入图片描述
参考来源:(https://blog.csdn.net/nima1994/article/details/79776802)

将这9个值加起来,就是中心点的高斯滤波的值。
对所有点重复这个过程,就得到了高斯模糊后的图像。

高斯滤波步骤

综上可以总结一下步骤:

(1)移动相关核的中心元素,使它位于输入图像待处理像素的正上方
(2)将输入图像的像素值作为权重,乘以相关核
(3)将上面各步得到的结果相加做为输出
简单来说就是根据高斯分布得到高斯模板然后做卷积相加的一个过程。

相关函数

方框滤波——boxblur

void boxFilter(
    InputArray src,
    OutputArray dst, 
    int ddepth, 
    Size ksize, 
    Point anchor=Point(-1,-1), 
    boolnormalize=true, 
    int borderType=BORDER_DEFAULT 
);

函数参数含义如下:

(1)InputArray类型的src,输入图像。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。

(2)OutputArray类型的dst,即目标图像,与输入图像有相同的尺寸和类型。

(3)int类型的ddepth,输出图像的深度,-1代表使用原图深度,即src.depth()。

(4)Size类型(对Size类型稍后有讲解)的ksize,内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小

(5)Point类型的anchor,表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。

(6)bool类型的normalize,默认值为true,一个标识符,表示内核是否被其区域归一化(normalized)了。

(7)int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT。

代码

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

using namespace std;
using namespace cv;

int main()
{
	Mat src, dst;
	src = imread("C:/Users/86176/Pictures/pics/house.jpg");
	if (!src.data)
	{
		cout << "could not load image !";
		return -1;
	}
	imshow("src", src);

	//方框滤波
	boxFilter(src, dst, -1, Size(5, 5));
	imshow("boxFilter_src", dst);

	waitKey(0);
	return 0;
}

效果

在这里插入图片描述

均值滤波——blur

void blur(
    InputArray src, 
    OutputArray dst, 
    Size ksize, 
    Point anchor=Point(-1,-1), 
    int borderType=BORDER_DEFAULT 
);

(1)InputArray类型的src,输入图像。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。

(2)OutputArray类型的dst,即目标图像,与输入图像有相同的尺寸和类型。

(3)Size类型(对Size类型稍后有讲解)的ksize,内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小

(4)Point类型的anchor,表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。

(5)int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT。

代码

#include<opencv2\opencv.hpp>
#include

using namespace std;
using namespace cv;

int main()
{
Mat src, dst;
src = imread(“E:/image/Girl2.png”);
if (!src.data)
{
cout << “could not load image !”;
return -1;
}
imshow(“src”, src);

//均值滤波
blur(src, dst, Size(3, 3), Point(-1, -1));
imshow("blur_src", dst);

waitKey(0);
return 0;

}

效果

在这里插入图片描述

高斯滤波——GaussianBlur

void GaussianBlur(
    InputArray src,
    OutputArray dst, 
    Size ksize, 
    double sigmaX, 
    double sigmaY=0, 
    intborderType=BORDER_DEFAULT 
);

(1)InputArray类型的src,输入图像。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。

(2)OutputArray类型的dst,即目标图像,与输入图像有相同的尺寸和类型。

(3)Size类型(对Size类型稍后有讲解)的ksize,内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小

(4)double类型的sigmaX,表示高斯核函数在X方向的的标准偏差。

(5)double类型的sigmaY,表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。

(6)int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT。

代码

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

using namespace std;
using namespace cv;

int main()
{
	Mat src, dst;
	src = imread("C:/Users/86176/Pictures/pics/house.jpg");
	if (!src.data)
	{
		cout << "could not load image !";
		return -1;
	}
	imshow("src", src);

	//高斯滤波
	GaussianBlur(src, dst, Size(3, 3), 0, 0);
	imshow("GaussianBlur_src", dst);



	waitKey(0);
	return 0;
}

效果

在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Spark!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值