OpenCV(二十二):均值滤波、方框滤波和高斯滤波 ╰+攻爆jí腚メ 2024-03-08 08:23 49阅读 0赞 **目录** 1.均值滤波 2.方框滤波 3.高斯滤波 -------------------- #### 1.均值滤波 #### OpenCV中的均值滤波(Mean Filter)是一种简单的滤波技术,用于平滑图像并减少噪声。它的原理非常简单:对于每个像素,将其与其周围邻域内像素的平均值作为新的像素值。 **具体的均值滤波原理如下:** 1. 定义滤波器大小:均值滤波器是一个正方形的卷积核,具有固定大小。该大小决定了每个像素使用多少邻域像素进行平均计算。 2. 遍历图像像素:对于图像中的每个像素,将其与滤波器大小内的邻域像素进行平均计算。 3. 计算新的像素值:将邻域像素的值相加,然后除以邻域内像素的数量,即可得到新的像素值。 4. 更新图像:将每个像素的值更新为其对应的新像素值。 ![32d42a22ccf74db68624bb42afbe7336.png][] **均值滤波函数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:像素外推法选择标志。 ![cfe473aa2cbd42259ce303f56c2b8aa9.png][] **以下是使用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.高斯滤波 #### 高斯滤波通过使用高斯函数计算像素点的权重,对周围邻域像素进行加权平均,以达到图像平滑的效果。由于高斯函数在中心点附近权重较大,而在离中心点越远的像素权重越小,它能够保留图像的整体结构,并且相对于其他平滑滤波器,它对细节的保留更好。 高斯函数是一个连续的概率分布函数,它的形状是一个钟形曲线,中心点最高,两边逐渐变低。 ![68aa4b9fa84d4a369fafaba1ceac2ef5.png][] 高斯滤波的**原理**如下: 1. 定义滤波器大小和标准差:在使用高斯滤波之前,需要确定滤波器的大小(窗口大小)和标准差。窗口大小决定了滤波器覆盖的像素范围,标准差决定了高斯函数的形状。 2. 构建高斯滤波器:根据定义的窗口大小和标准差,构建一个高斯函数或者高斯核矩阵。高斯函数是一个二维正态分布曲线,用于计算滤波器中每个像素的权重。 3. 遍历图像像素:对于图像中的每个像素,高斯滤波器会考虑其周围邻域像素的值。 4. 计算加权平均:对于每个像素,在滤波器邻域内,根据高斯函数计算相应像素的权重。权重越大表示该像素对平均值的贡献越大。然后将邻域内像素值与相应权重相乘,得到加权和。 5. 更新图像:将每个像素的值更新为加权和,得到平滑后的图像。 **例如** 一个3X3的卷积核是: ![9f149d65c0864b36abd42d61e25012a6.png][] 计算相应像素的权重 ![ca9b6ee5587e45099fcbd5610b5458f7.png][] 将邻域内像素值与相应权重相乘,得到加权和,将像素的值更新为加权和。 ![01160c28d8b947feb891e3a4faba22a9.png][] 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); 注意:在高斯滤波当中,核的宽度和高度可以不相同,但都要是奇数。 [32d42a22ccf74db68624bb42afbe7336.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/08/4d7240df015e42ad8eb9b599ed5aad98.png [cfe473aa2cbd42259ce303f56c2b8aa9.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/08/0972ec11e46944f7b6fefd236cc02eb8.png [68aa4b9fa84d4a369fafaba1ceac2ef5.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/08/5274e97c949b4677b06a225310504ea9.png [9f149d65c0864b36abd42d61e25012a6.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/08/b43f3e70f17149c5a2e87971dc23e04d.png [ca9b6ee5587e45099fcbd5610b5458f7.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/08/d2d1ec3d4e8b4d84ad7090bde493c4f9.png [01160c28d8b947feb891e3a4faba22a9.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/08/cc855e51c8ce4e47babdc0aba35c4627.png
还没有评论,来说两句吧...