OpenCV(二十二):均值滤波、方框滤波和高斯滤波

目录

1.均值滤波

2.方框滤波

3.高斯滤波


1.均值滤波

OpenCV中的均值滤波(Mean Filter)是一种简单的滤波技术,用于平滑图像并减少噪声。它的原理非常简单:对于每个像素,将其与其周围邻域内像素的平均值作为新的像素值。

具体的均值滤波原理如下:

  1. 定义滤波器大小:均值滤波器是一个正方形的卷积核,具有固定大小。该大小决定了每个像素使用多少邻域像素进行平均计算。
  2. 遍历图像像素:对于图像中的每个像素,将其与滤波器大小内的邻域像素进行平均计算。
  3. 计算新的像素值:将邻域像素的值相加,然后除以邻域内像素的数量,即可得到新的像素值。
  4. 更新图像:将每个像素的值更新为其对应的新像素值。

均值滤波函数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.高斯滤波

高斯滤波通过使用高斯函数计算像素点的权重,对周围邻域像素进行加权平均,以达到图像平滑的效果。由于高斯函数在中心点附近权重较大,而在离中心点越远的像素权重越小,它能够保留图像的整体结构,并且相对于其他平滑滤波器,它对细节的保留更好。

高斯函数是一个连续的概率分布函数,它的形状是一个钟形曲线,中心点最高,两边逐渐变低。

高斯滤波的原理如下:

  1. 定义滤波器大小和标准差:在使用高斯滤波之前,需要确定滤波器的大小(窗口大小)和标准差。窗口大小决定了滤波器覆盖的像素范围,标准差决定了高斯函数的形状。

  2. 构建高斯滤波器:根据定义的窗口大小和标准差,构建一个高斯函数或者高斯核矩阵。高斯函数是一个二维正态分布曲线,用于计算滤波器中每个像素的权重。

  3. 遍历图像像素:对于图像中的每个像素,高斯滤波器会考虑其周围邻域像素的值。

  4. 计算加权平均:对于每个像素,在滤波器邻域内,根据高斯函数计算相应像素的权重。权重越大表示该像素对平均值的贡献越大。然后将邻域内像素值与相应权重相乘,得到加权和。

  5. 更新图像:将每个像素的值更新为加权和,得到平滑后的图像。

例如

一个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);

注意:在高斯滤波当中,核的宽度和高度可以不相同,但都要是奇数。

相关推荐
Hello server1 小时前
DeepSeek Harness 深度体验:把「万物皆插件」做到极致的 AI 编程 Agent
人工智能
ShineWinsu5 小时前
对于C++:auto_ptr、unique_ptr、shared_ptr的模拟实现
c++·面试·笔试·智能指针·unique_ptr·shared_ptr·auto_ptr
驴友花雕5 小时前
【花雕动手做】行空板 K10 系列实验之人工智能语音识别小车的10个参考案例
人工智能·单片机·嵌入式硬件·语音识别·行空板 k10 系列实验·花雕动手做·小车的10个参考案例
火山引擎开发者社区7 小时前
DeepSeek-V4 Pro 发布,veStack Day 0 完成模型适配
人工智能
2501_926978337 小时前
AGI 的四种瓶颈:资源型还是发现型--以及DSH的位置
人工智能·经验分享·笔记·ai写作
Q463913497 小时前
线下销售复盘难落地,AI 会话设备能帮上啥忙
人工智能·自然语言处理
ebok.7 小时前
国产大模型落地业务系统的优选载体:京微智枢信创 AI 业务支撑平台
大数据·人工智能·低代码·ai
XLYcmy7 小时前
京东 算法实习一面 下+手撕
c++·python·llm·概率论·数据处理·训练·codebert
wujian83117 小时前
怎么用文心生成word文档?从格式错乱到智能导出,AI导出鸭让创作再无后顾之忧
人工智能·ai·word·豆包·deepseek·ai导出鸭
反转180度8 小时前
Qt 6 + C++17 实现 SFTP 批量部署:工业设备运维工具实战解析
运维·c++·qt