目录
1.均值滤波
2.方框滤波
3.高斯滤波
1.均值滤波
OpenCV中的均值滤波(Mean Filter)是一种简单的滤波技术,用于平滑图像并减少噪声。它的原理非常简单:对于每个像素,将其与其周围邻域内像素的平均值作为新的像素值。
具体的均值滤波原理如下:
- 定义滤波器大小:均值滤波器是一个正方形的卷积核,具有固定大小。该大小决定了每个像素使用多少邻域像素进行平均计算。
- 遍历图像像素:对于图像中的每个像素,将其与滤波器大小内的邻域像素进行平均计算。
- 计算新的像素值:将邻域像素的值相加,然后除以邻域内像素的数量,即可得到新的像素值。
- 更新图像:将每个像素的值更新为其对应的新像素值。
均值滤波函数blur()
void cv::blur ( InputArray src,
OutputArray dst,
Size ksize,
Point anchor = Point(-1,-1),
int borderType = BORDER_DEFAULT
)
- src:待均值滤波的图像,图像的数据类型必须是CV 8U、CV 16U、CV 16S、CV 32F和CV 64F这五种数据类型之一。
- dst: 均值滤波后的图像,与输入图像具有相同的尺寸和数据类型。
- ksize:卷积核尺寸。
- anchor:内核的基准点(锚点),其默认值为(-l,-1)代表内核基准点位于kernel的中心位置。
- borderType:像素外推法选择标志。
以下是使用OpenCV进行均值滤波的示例代码:
//均值滤波blur(image,image,Size(5,5));
在这个示例代码中,我们加载一张图像image,并定义了一个5x5的滤波器大小。然后,我们调用cv::blur
函数对图像进行均值滤波。
cv::blur
函数将输入图像作为第一个参数,并使用指定的滤波器大小对其进行平滑处理,然后将结果保存在输出图像中。在这个例子中,我们将图像本身作为输出参数,所以原始图像将会被修改。
结论:均值滤波的卷积核越大,图片的失真越明显,图片会更模糊,如果设置核的大小为(1,1),则结果是原始图像。
2.方框滤波
方框滤波和均值滤波核基本上是一致的,主要的区别是要不要归一化处理,如果使用归一化处理,方框滤波就是均值滤波。
方框滤波函数boxFilter()
void cv::boxFilter ( InputArray src,
OutputArray dst,
int ddepth,
Size ksize,
Point anchor = Point(-1,-1),
bool normalize = true,
int borderType = BORDER_DEFAULT
)
- src:输入图像。
- dst: 输出图像,与输入图像具有相同的尺寸和通道数。
- ddepth: 输出图像的数据类型(深度),根据输入图像的数据类型不同拥有不同的取值范围。
- ksize:卷积核尺寸。
- anchor:内核的基准点(锚点),其默认值为(-1-1)代表内核基准点位于kernel的中心位置。
- normalize:是否将卷积核进行归一化的标志,默认参数为true,表示进行归一化。
- borderType:像素外推法选择标志。
示例代码:
//方框滤波boxFilter()Mat result;boxFilter(image,result,-1,Size(3,3),Point(-1,-1),false);//不进行归一化
3.高斯滤波
高斯滤波通过使用高斯函数计算像素点的权重,对周围邻域像素进行加权平均,以达到图像平滑的效果。由于高斯函数在中心点附近权重较大,而在离中心点越远的像素权重越小,它能够保留图像的整体结构,并且相对于其他平滑滤波器,它对细节的保留更好。
高斯函数是一个连续的概率分布函数,它的形状是一个钟形曲线,中心点最高,两边逐渐变低。
高斯滤波的原理如下:
-
定义滤波器大小和标准差:在使用高斯滤波之前,需要确定滤波器的大小(窗口大小)和标准差。窗口大小决定了滤波器覆盖的像素范围,标准差决定了高斯函数的形状。
-
构建高斯滤波器:根据定义的窗口大小和标准差,构建一个高斯函数或者高斯核矩阵。高斯函数是一个二维正态分布曲线,用于计算滤波器中每个像素的权重。
-
遍历图像像素:对于图像中的每个像素,高斯滤波器会考虑其周围邻域像素的值。
-
计算加权平均:对于每个像素,在滤波器邻域内,根据高斯函数计算相应像素的权重。权重越大表示该像素对平均值的贡献越大。然后将邻域内像素值与相应权重相乘,得到加权和。
-
更新图像:将每个像素的值更新为加权和,得到平滑后的图像。
例如
一个3X3的卷积核是:
计算相应像素的权重
将邻域内像素值与相应权重相乘,得到加权和,将像素的值更新为加权和。
OpenCV中提供了高斯滤波函数cv2.GaussianBlur()
来实现高斯滤波。
void cv::GaussianBlur (InputArray src,
OutputArray dst,
Size ksize,
double sigmaX,
double sigmaY = 0,
int borderType = BORDER DEFAULT
)
- src:待高斯滤波图像,数据类型必须为CV 8U,CV 16U,CV 16S,CV 32F或CV 64F。
- dst:输出图像,与输入图像src具有相同的尺寸、通道数和数据类型。
- ksize: 高斯滤波器的尺寸,滤波器可以不为正方形,但是必须是正奇数。如果尺寸为0,则由标准偏差计算尺寸。
- sigmaX:X方向的高斯滤波器标准偏差。
- sigmayY:Y方向的高斯滤波器标准偏差: 如果输入量为0,则将其设置为等于sigmax,如果两个轴的标差均为0,则根据输入的高斯滤波器尺寸计算标准偏差。
- borderType:像素外推法选择标志。
示例代码:
//调用高斯滤波函数GaussianBlur()进行滤波GaussianBlur(image,image,Size(5,5),10,20);
注意:在高斯滤波当中,核的宽度和高度可以不相同,但都要是奇数。